[liblingua-stem-snowball-perl] 01/19: [svn-inject] Installing original source of liblingua-stem-snowball-perl

dom at earth.li dom at earth.li
Sun Apr 24 10:25:23 UTC 2016


This is an automated email from the git hooks/post-receive script.

dom pushed a commit to branch master
in repository liblingua-stem-snowball-perl.

commit f5642b65c0484db1cbab9b93f83bd3b660fd2173
Author: Dominic Hargreaves <dom at earth.li>
Date:   Tue Aug 5 21:20:35 2008 +0000

    [svn-inject] Installing original source of liblingua-stem-snowball-perl
---
 Build.PL                                        |   26 +
 Changes                                         |   83 +
 MANIFEST                                        |  104 +
 META.yml                                        |   22 +
 Makefile.PL                                     |   31 +
 README                                          |   22 +
 bin/benchmark_stemmers.plx                      |  116 +
 bin/generate_tests.plx                          |   63 +
 lib/Lingua/Stem/Snowball.pm                     |  330 ++
 lib/Lingua/Stem/Snowball.xs                     |  251 +
 libstemmer_c/Makefile                           |    9 +
 libstemmer_c/README                             |   82 +
 libstemmer_c/examples/stemwords.c.disabled      |  191 +
 libstemmer_c/include/libstemmer.h               |   79 +
 libstemmer_c/libstemmer/libstemmer.c            |   92 +
 libstemmer_c/libstemmer/modules.h               |  162 +
 libstemmer_c/mkinc.mak                          |   63 +
 libstemmer_c/runtime/api.c                      |   69 +
 libstemmer_c/runtime/api.h                      |   27 +
 libstemmer_c/runtime/header.h                   |   58 +
 libstemmer_c/runtime/utilities.c                |  446 ++
 libstemmer_c/src_c/stem_ISO_8859_1_danish.c     |  338 ++
 libstemmer_c/src_c/stem_ISO_8859_1_danish.h     |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_dutch.c      |  635 +++
 libstemmer_c/src_c/stem_ISO_8859_1_dutch.h      |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_english.c    | 1156 +++++
 libstemmer_c/src_c/stem_ISO_8859_1_english.h    |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_finnish.c    |  792 +++
 libstemmer_c/src_c/stem_ISO_8859_1_finnish.h    |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_french.c     | 1276 +++++
 libstemmer_c/src_c/stem_ISO_8859_1_french.h     |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_german.c     |  512 ++
 libstemmer_c/src_c/stem_ISO_8859_1_german.h     |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_italian.c    | 1091 +++++
 libstemmer_c/src_c/stem_ISO_8859_1_italian.h    |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_norwegian.c  |  296 ++
 libstemmer_c/src_c/stem_ISO_8859_1_norwegian.h  |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_porter.c     |  776 +++
 libstemmer_c/src_c/stem_ISO_8859_1_porter.h     |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_portuguese.c | 1035 ++++
 libstemmer_c/src_c/stem_ISO_8859_1_portuguese.h |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_spanish.c    | 1119 +++++
 libstemmer_c/src_c/stem_ISO_8859_1_spanish.h    |   16 +
 libstemmer_c/src_c/stem_ISO_8859_1_swedish.c    |  307 ++
 libstemmer_c/src_c/stem_ISO_8859_1_swedish.h    |   16 +
 libstemmer_c/src_c/stem_KOI8_R_russian.c        |  701 +++
 libstemmer_c/src_c/stem_KOI8_R_russian.h        |   16 +
 libstemmer_c/src_c/stem_UTF_8_danish.c          |  344 ++
 libstemmer_c/src_c/stem_UTF_8_danish.h          |   16 +
 libstemmer_c/src_c/stem_UTF_8_dutch.c           |  653 +++
 libstemmer_c/src_c/stem_UTF_8_dutch.h           |   16 +
 libstemmer_c/src_c/stem_UTF_8_english.c         | 1176 +++++
 libstemmer_c/src_c/stem_UTF_8_english.h         |   16 +
 libstemmer_c/src_c/stem_UTF_8_finnish.c         |  808 ++++
 libstemmer_c/src_c/stem_UTF_8_finnish.h         |   16 +
 libstemmer_c/src_c/stem_UTF_8_french.c          | 1296 +++++
 libstemmer_c/src_c/stem_UTF_8_french.h          |   16 +
 libstemmer_c/src_c/stem_UTF_8_german.c          |  526 ++
 libstemmer_c/src_c/stem_UTF_8_german.h          |   16 +
 libstemmer_c/src_c/stem_UTF_8_italian.c         | 1113 +++++
 libstemmer_c/src_c/stem_UTF_8_italian.h         |   16 +
 libstemmer_c/src_c/stem_UTF_8_norwegian.c       |  302 ++
 libstemmer_c/src_c/stem_UTF_8_norwegian.h       |   16 +
 libstemmer_c/src_c/stem_UTF_8_porter.c          |  794 ++++
 libstemmer_c/src_c/stem_UTF_8_porter.h          |   16 +
 libstemmer_c/src_c/stem_UTF_8_portuguese.c      | 1055 ++++
 libstemmer_c/src_c/stem_UTF_8_portuguese.h      |   16 +
 libstemmer_c/src_c/stem_UTF_8_russian.c         |  709 +++
 libstemmer_c/src_c/stem_UTF_8_russian.h         |   16 +
 libstemmer_c/src_c/stem_UTF_8_spanish.c         | 1137 +++++
 libstemmer_c/src_c/stem_UTF_8_spanish.h         |   16 +
 libstemmer_c/src_c/stem_UTF_8_swedish.c         |  313 ++
 libstemmer_c/src_c/stem_UTF_8_swedish.h         |   16 +
 ppport.h                                        | 5820 +++++++++++++++++++++++
 t/0-load.t                                      |    5 +
 t/1-stem.t                                      |   75 +
 t/2-full.t                                      |   91 +
 t/3-subclass.t                                  |   18 +
 t/98-TestPod.t                                  |    7 +
 t/99-TestPodCoverage.t                          |    6 +
 t/test_voc/da.default_enc                       |  100 +
 t/test_voc/da.utf8                              |  100 +
 t/test_voc/de.default_enc                       |  100 +
 t/test_voc/de.utf8                              |  100 +
 t/test_voc/en.default_enc                       |  100 +
 t/test_voc/en.utf8                              |  100 +
 t/test_voc/es.default_enc                       |  100 +
 t/test_voc/es.utf8                              |  100 +
 t/test_voc/fi.default_enc                       |  100 +
 t/test_voc/fi.utf8                              |  100 +
 t/test_voc/fr.default_enc                       |  100 +
 t/test_voc/fr.utf8                              |  100 +
 t/test_voc/it.default_enc                       |  100 +
 t/test_voc/it.utf8                              |  100 +
 t/test_voc/nl.default_enc                       |  100 +
 t/test_voc/nl.utf8                              |  100 +
 t/test_voc/no.default_enc                       |  100 +
 t/test_voc/no.utf8                              |  100 +
 t/test_voc/pt.default_enc                       |  100 +
 t/test_voc/pt.utf8                              |  100 +
 t/test_voc/ru.default_enc                       |  100 +
 t/test_voc/ru.utf8                              |  100 +
 t/test_voc/sv.default_enc                       |  100 +
 t/test_voc/sv.utf8                              |  100 +
 104 files changed, 31424 insertions(+)

diff --git a/Build.PL b/Build.PL
new file mode 100644
index 0000000..f8707e8
--- /dev/null
+++ b/Build.PL
@@ -0,0 +1,26 @@
+use strict;
+use warnings;
+use Module::Build;
+
+my $builder = Module::Build->new(
+    module_name       => 'Lingua::Stem::Snowball',
+    license           => 'perl',
+    dist_author       => 'Marvin Humphrey <marvin at rectangular dot com>',
+    dist_version_from => 'lib/Lingua/Stem/Snowball.pm',
+    requires          => { 'Test::More' => 0, },
+    build_requires => {
+        'ExtUtils::CBuilder' => 0,
+        'ExtUtils::ParseXS'  => 0,
+        },
+    add_to_cleanup    =>
+        [ 'Lingua-Stem-Snowball-*', 'MANIFEST.bak', 'Makefile' ],
+    create_makefile_pl => 'passthrough',
+    c_source           => 'libstemmer_c',
+    #extra_compiler_flags => [
+    #    '-Wall',               '-Wextra',
+    #    '-pedantic',           '-ansi',
+    #    '-DPERL_GCC_PEDANTIC', '-std=c89',
+    #    ],
+);
+
+$builder->create_build_script();
diff --git a/Changes b/Changes
new file mode 100644
index 0000000..1d9282b
--- /dev/null
+++ b/Changes
@@ -0,0 +1,83 @@
+v0.941  2006-08-18
+    * Add ExtUtils::CBuilder and ExtUtils::ParseXS as dependencies now that
+      Module::Build doesn't do it's own C handling.
+
+v0.94   2006-02-14
+    * new maintainer Marvin Humphrey
+    * improved speed
+    * new method stem_in_place() added
+    * UTF-8 stemmers added
+    * encoding parameter, plus new method encoding() added
+    * updated to latest version of libstemmer_c from snowball.tartarus.org
+    * many internal changes
+    * change from EUMM to Module::Build
+    * apostrophe stripping is now always on and handled natively for English
+    * strip_apostrophes() method deprecated; now has no impact on stemming 
+      behavior (and no longer triggers segfaults)
+    * locale() method and constructor parameter deprecated; locale never had
+      any effect except to influence the automatic lowercasing performed by
+      stem(), and that was only theoretical (none of the test vocab was
+      affected by it).
+    * removed bin/add_stemmer.pl
+    * added bin/benchmark_stemmers.plx
+    * added bin/generate_tests.plx
+    * updated documentation
+
+v0.93   2005-07-28
+    * fix ticket #13900 : cease stripping of empty array elements
+      be careful that this fix may break your scripts
+    * fix ticket #13898 : apostrophe s in English stemmer
+    * new method strip_apostrophes() added
+
+v0.92   2005-05-22
+    * removed deprecated 'snowball' function
+    * added tests for Pod and Pod coverage
+    * moved add_stemmer.pl in bin subdirectory
+    * renamed private function (added _)
+
+v0.91   2005-05-10
+    * don't stem empty words
+
+v0.9    2005-02-07
+    * fix doc ticket #11286 : Error in documentation use of 'english' 
+      as valid language descriptor
+    * fix directory mode in CPAN distribution
+    * added 3-subclass.t test file
+    * updated ppport.h
+
+v0.8    2004-08-29
+    * fix ticket #7909 : typo in _get_lang
+    * fix ticket #7910 : Lingua::Stem::Snowball::stem does not allow 
+      subclassing
+
+v0.7    2004-07-09
+    * fix ticket #6884 : cp is not portable
+
+v0.6    2004-05-06
+    * fix a bug in the test suite if there is no locale available
+    * fix version numbering due a problem in 0.04 release (0.4 !)
+
+v0.05   2004-04-30
+    * fix a little bug in the test suite
+
+v0.04   2004-04-30
+    * new maintainer fabpot at cpan.org
+    * now include all stemmers from snowball
+    * more tests
+    * fix various bugs and docs
+    * add a benchmark with Lingua::Stem
+    * ...
+
+v0.03.1 2002-09-11
+    * Change URL of snowball site (http://snowball.tartarus.org)
+    * Fix some wordings
+    * Modify testsnowball.pl script
+ 
+v0.03   2002-03-04
+    * add locale support
+
+v0.02   2002-02-14
+    * little documentation fixes, added test script
+
+v0.01   2002-02-14
+    * Initial release
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..c55788f
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,104 @@
+bin/benchmark_stemmers.plx
+bin/generate_tests.plx
+Build.PL
+Changes
+lib/Lingua/Stem/Snowball.pm
+lib/Lingua/Stem/Snowball.xs
+libstemmer_c/examples/stemwords.c.disabled
+libstemmer_c/include/libstemmer.h
+libstemmer_c/libstemmer/libstemmer.c
+libstemmer_c/libstemmer/modules.h
+libstemmer_c/Makefile
+libstemmer_c/mkinc.mak
+libstemmer_c/README
+libstemmer_c/runtime/api.c
+libstemmer_c/runtime/api.h
+libstemmer_c/runtime/header.h
+libstemmer_c/runtime/utilities.c
+libstemmer_c/src_c/stem_ISO_8859_1_danish.c
+libstemmer_c/src_c/stem_ISO_8859_1_danish.h
+libstemmer_c/src_c/stem_ISO_8859_1_dutch.c
+libstemmer_c/src_c/stem_ISO_8859_1_dutch.h
+libstemmer_c/src_c/stem_ISO_8859_1_english.c
+libstemmer_c/src_c/stem_ISO_8859_1_english.h
+libstemmer_c/src_c/stem_ISO_8859_1_finnish.c
+libstemmer_c/src_c/stem_ISO_8859_1_finnish.h
+libstemmer_c/src_c/stem_ISO_8859_1_french.c
+libstemmer_c/src_c/stem_ISO_8859_1_french.h
+libstemmer_c/src_c/stem_ISO_8859_1_german.c
+libstemmer_c/src_c/stem_ISO_8859_1_german.h
+libstemmer_c/src_c/stem_ISO_8859_1_italian.c
+libstemmer_c/src_c/stem_ISO_8859_1_italian.h
+libstemmer_c/src_c/stem_ISO_8859_1_norwegian.c
+libstemmer_c/src_c/stem_ISO_8859_1_norwegian.h
+libstemmer_c/src_c/stem_ISO_8859_1_porter.c
+libstemmer_c/src_c/stem_ISO_8859_1_porter.h
+libstemmer_c/src_c/stem_ISO_8859_1_portuguese.c
+libstemmer_c/src_c/stem_ISO_8859_1_portuguese.h
+libstemmer_c/src_c/stem_ISO_8859_1_spanish.c
+libstemmer_c/src_c/stem_ISO_8859_1_spanish.h
+libstemmer_c/src_c/stem_ISO_8859_1_swedish.c
+libstemmer_c/src_c/stem_ISO_8859_1_swedish.h
+libstemmer_c/src_c/stem_KOI8_R_russian.c
+libstemmer_c/src_c/stem_KOI8_R_russian.h
+libstemmer_c/src_c/stem_UTF_8_danish.c
+libstemmer_c/src_c/stem_UTF_8_danish.h
+libstemmer_c/src_c/stem_UTF_8_dutch.c
+libstemmer_c/src_c/stem_UTF_8_dutch.h
+libstemmer_c/src_c/stem_UTF_8_english.c
+libstemmer_c/src_c/stem_UTF_8_english.h
+libstemmer_c/src_c/stem_UTF_8_finnish.c
+libstemmer_c/src_c/stem_UTF_8_finnish.h
+libstemmer_c/src_c/stem_UTF_8_french.c
+libstemmer_c/src_c/stem_UTF_8_french.h
+libstemmer_c/src_c/stem_UTF_8_german.c
+libstemmer_c/src_c/stem_UTF_8_german.h
+libstemmer_c/src_c/stem_UTF_8_italian.c
+libstemmer_c/src_c/stem_UTF_8_italian.h
+libstemmer_c/src_c/stem_UTF_8_norwegian.c
+libstemmer_c/src_c/stem_UTF_8_norwegian.h
+libstemmer_c/src_c/stem_UTF_8_porter.c
+libstemmer_c/src_c/stem_UTF_8_porter.h
+libstemmer_c/src_c/stem_UTF_8_portuguese.c
+libstemmer_c/src_c/stem_UTF_8_portuguese.h
+libstemmer_c/src_c/stem_UTF_8_russian.c
+libstemmer_c/src_c/stem_UTF_8_russian.h
+libstemmer_c/src_c/stem_UTF_8_spanish.c
+libstemmer_c/src_c/stem_UTF_8_spanish.h
+libstemmer_c/src_c/stem_UTF_8_swedish.c
+libstemmer_c/src_c/stem_UTF_8_swedish.h
+Makefile.PL
+MANIFEST
+META.yml			Module meta-data (added by MakeMaker)
+ppport.h
+README
+t/0-load.t
+t/1-stem.t
+t/2-full.t
+t/3-subclass.t
+t/98-TestPod.t
+t/99-TestPodCoverage.t
+t/test_voc/da.default_enc
+t/test_voc/da.utf8
+t/test_voc/de.default_enc
+t/test_voc/de.utf8
+t/test_voc/en.default_enc
+t/test_voc/en.utf8
+t/test_voc/es.default_enc
+t/test_voc/es.utf8
+t/test_voc/fi.default_enc
+t/test_voc/fi.utf8
+t/test_voc/fr.default_enc
+t/test_voc/fr.utf8
+t/test_voc/it.default_enc
+t/test_voc/it.utf8
+t/test_voc/nl.default_enc
+t/test_voc/nl.utf8
+t/test_voc/no.default_enc
+t/test_voc/no.utf8
+t/test_voc/pt.default_enc
+t/test_voc/pt.utf8
+t/test_voc/ru.default_enc
+t/test_voc/ru.utf8
+t/test_voc/sv.default_enc
+t/test_voc/sv.utf8
diff --git a/META.yml b/META.yml
new file mode 100644
index 0000000..cfcb152
--- /dev/null
+++ b/META.yml
@@ -0,0 +1,22 @@
+---
+name: Lingua-Stem-Snowball
+version: 0.941
+author:
+  - 'Marvin Humphrey <marvin at rectangular dot com>'
+abstract: Perl interface to Snowball stemmers.
+license: perl
+resources:
+  license: http://dev.perl.org/licenses/
+requires:
+  Test::More: 0
+build_requires:
+  ExtUtils::CBuilder: 0
+  ExtUtils::ParseXS: 0
+provides:
+  Lingua::Stem::Snowball:
+    file: lib/Lingua/Stem/Snowball.pm
+    version: 0.941
+generated_by: Module::Build version 0.2805
+meta-spec:
+  url: http://module-build.sourceforge.net/META-spec-v1.2.html
+  version: 1.2
diff --git a/Makefile.PL b/Makefile.PL
new file mode 100644
index 0000000..192903a
--- /dev/null
+++ b/Makefile.PL
@@ -0,0 +1,31 @@
+# Note: this file was auto-generated by Module::Build::Compat version 0.03
+    
+    unless (eval "use Module::Build::Compat 0.02; 1" ) {
+      print "This module requires Module::Build to install itself.\n";
+      
+      require ExtUtils::MakeMaker;
+      my $yn = ExtUtils::MakeMaker::prompt
+	('  Install Module::Build now from CPAN?', 'y');
+      
+      unless ($yn =~ /^y/i) {
+	die " *** Cannot install without Module::Build.  Exiting ...\n";
+      }
+      
+      require Cwd;
+      require File::Spec;
+      require CPAN;
+      
+      # Save this 'cause CPAN will chdir all over the place.
+      my $cwd = Cwd::cwd();
+      
+      CPAN::Shell->install('Module::Build::Compat');
+      CPAN::Shell->expand("Module", "Module::Build::Compat")->uptodate
+	or die "Couldn't install Module::Build, giving up.\n";
+      
+      chdir $cwd or die "Cannot chdir() back to $cwd: $!";
+    }
+    eval "use Module::Build::Compat 0.02; 1" or die $@;
+    
+    Module::Build::Compat->run_build_pl(args => \@ARGV);
+    require Module::Build;
+    Module::Build::Compat->write_makefile(build_class => 'Module::Build');
diff --git a/README b/README
new file mode 100644
index 0000000..ebb877a
--- /dev/null
+++ b/README
@@ -0,0 +1,22 @@
+Lingua-Stem-Snowball
+====================
+
+INSTALLATION
+
+To install this module type the following:
+
+   perl Build.PL
+   perl Build
+   perl Build test
+   perl Build install
+
+COPYRIGHT AND LICENCE
+
+Currently maintained by Fabien Potencier, fabpot at cpan.org
+Original authors Oleg Bartunov, oleg at sai.msu.su, Teodor Sigaev, teodor at stack.net
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself, either Perl version 5.8.3 or,
+at your option, any later version of Perl 5 you may have available.
+
+Snowball files and stemmers are covered by the BSD license.
diff --git a/bin/benchmark_stemmers.plx b/bin/benchmark_stemmers.plx
new file mode 100755
index 0000000..b4d3b10
--- /dev/null
+++ b/bin/benchmark_stemmers.plx
@@ -0,0 +1,116 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+$|++;
+
+use Lingua::Stem;
+use Lingua::Stem::Snowball;
+use Benchmark::Timer;
+
+use constant ITERS => 10;
+
+my $timer = Benchmark::Timer->new;
+
+die "Usage: ./bin/benchmark_stemmers.plx TEXTFILES"
+    unless @ARGV;
+
+# retrieve, pre-process and tokenize text
+sub retrieve_text {
+    my $filepath = shift;
+    my $text = do {
+        open( my $fh, '<', $filepath )
+            or die "Couldn't open file '$filepath' for reading: $!";
+        local $/;
+        <$fh>;
+    };
+    $text = lc($text);
+    $text =~ s/[^a-z']/ /gs;
+    $text =~ s/\B'//g;
+    $text =~ s/'\B//g;
+    my @tokens = split( ' ', $text );
+    return \@tokens;
+}
+
+my @token_arrays = map { retrieve_text($_) } @ARGV;
+# prepare vars used in the report
+my %unique;
+my $num_tokens = 0;
+for my $tokens (@token_arrays) {
+    $num_tokens += scalar @$tokens;
+    $unique{$_} = 1 for @$tokens;
+}
+my $num_unique = scalar keys %unique;
+
+for my $iter ( 1 .. ITERS ) {
+    print "$iter ";
+    my ( @out, $out );
+    my $snowball    = Lingua::Stem::Snowball->new( lang => 'en' );
+    my $lingua_stem = Lingua::Stem->new( -locale        => 'EN' );
+
+    # LS without cache
+    for my $tokens (@token_arrays) {
+        $timer->start('LS');
+        $out = $lingua_stem->stem(@$tokens);
+        $timer->stop('LS');
+        undef $out;
+    }
+
+    # turn stem_caching on for LS
+    $lingua_stem->stem_caching( { -level => 2 } );
+
+    for my $tokens (@token_arrays) {
+        # LS, with stem caching
+        $timer->start('LS2');
+        $out = $lingua_stem->stem(@$tokens);
+        $timer->stop('LS2');
+        undef $out;
+
+        # LSS
+        $timer->start('LSS');
+        @out = $snowball->stem($tokens);
+        $timer->stop('LSS');
+        undef @out;
+
+        # stem_in_place, if this version of LSS is recent enough
+        if ( $snowball->can('stem_in_place') ) {
+            my @copy = @$tokens;
+            $timer->start('LSS2');
+            $snowball->stem_in_place( \@copy );
+            $timer->stop('LSS2');
+        }
+    }
+
+    # LS's stem_cache is global per locale, so clear it each iter
+    $lingua_stem->clear_stem_cache;
+}
+
+my $ls_ver  = $Lingua::Stem::VERSION;
+my $lss_ver = $Lingua::Stem::Snowball::VERSION;
+$lss_ver =~ s/_.*//;
+my %results = $timer->results;
+# make each result the average time per iter to stem all docs 
+$_ *= scalar @ARGV for values %results;
+
+# print the report
+printf( '
+|--------------------------------------------------------------------|
+| total words: %-6d | unique words: %-6d                         |
+|--------------------------------------------------------------------|
+| module                        | config        | avg secs | rate    |
+|--------------------------------------------------------------------|',
+    , $num_tokens, $num_unique );
+printf( '
+| Lingua::Stem %.2f             | no cache      | %.3f    | %-7d |
+| Lingua::Stem %.2f             | cache level 2 | %.3f    | %-7d |
+| Lingua::Stem::Snowball %.2f   | stem          | %.3f    | %-7d |',
+    $ls_ver,  $results{LS},  ( $num_tokens / $results{LS} ),
+    $ls_ver,  $results{LS2}, ( $num_tokens / $results{LS2} ),
+    $lss_ver, $results{LSS}, ( $num_tokens / $results{LSS} ),
+);
+printf( '
+| Lingua::Stem::Snowball %-4s   | stem_in_place | %.3f    | %-7d |',
+    $lss_ver, $results{LSS2}, ( $num_tokens / $results{LSS2} ) )
+    if exists $results{LSS2};
+print "\n|" . ( '-' x 68 ) . "|\n";
+
diff --git a/bin/generate_tests.plx b/bin/generate_tests.plx
new file mode 100755
index 0000000..62b9a4b
--- /dev/null
+++ b/bin/generate_tests.plx
@@ -0,0 +1,63 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+# generate_tests.plx 
+# 
+# Grab a sampling of vocab diffs from Snowball project and generate test pairs
+# in both the default encoding and UTF-8.
+
+use Encode;
+use Getopt::Long qw( GetOptions );
+use File::Spec::Functions qw( catfile catdir );
+
+# --snowdir must be the "snowball_all" directory
+my $snowdir;
+GetOptions( 'snowdir=s' => \$snowdir );
+die "Usage: ./bin/generate_tests.plx --snowdir=SNOWDIR"
+    unless defined $snowdir;
+
+my %languages = (
+    en => 'english',
+    da => 'danish',
+    de => 'german',
+    es => 'spanish',
+    fi => 'finnish',
+    fr => 'french',
+    it => 'italian',
+    nl => 'dutch',
+    no => 'norwegian',
+    pt => 'portuguese',
+    ru => 'russian',
+    sv => 'swedish',
+);
+
+# create t/testvoc if it doesn't exist already
+my $test_voc_dir = catdir( 't', 'test_voc' );
+if ( !-d $test_voc_dir ) {
+    mkdir $test_voc_dir or die $!;
+}
+
+while ( my ( $iso, $language ) = each %languages ) {
+    # suck in all the lines of the relevant diffs.txt.
+    my $in_filepath
+        = catfile( $snowdir, 'algorithms', $language, 'diffs.txt' );
+    open( my $in_fh, '<', $in_filepath ) or die $!;
+    my @diffs = <$in_fh>;
+
+    # these files are in the default encoding, so we'll have to decode UTF-8
+    my $source_enc = $iso eq 'ru' ? 'koi8-r' : 'iso-8859-1';
+    open( my $utf8_fh, '>:utf8', catfile( $test_voc_dir, "$iso.utf8" ) )
+        or die $!;
+    open( my $default_fh, ">", catfile( $test_voc_dir, "$iso.default_enc" ) )
+        or die $!;
+
+    # grab 100 random pairs
+    for ( 1 .. 100 ) {
+        my $pair = $diffs[ rand @diffs ];
+        print $default_fh $pair or die $!;
+        $pair = decode( $source_enc, $pair );
+        print $utf8_fh $pair or die $!;
+    }
+}
+
diff --git a/lib/Lingua/Stem/Snowball.pm b/lib/Lingua/Stem/Snowball.pm
new file mode 100644
index 0000000..261b860
--- /dev/null
+++ b/lib/Lingua/Stem/Snowball.pm
@@ -0,0 +1,330 @@
+package Lingua::Stem::Snowball;
+use strict;
+
+use Carp;
+use Exporter;
+use vars qw(
+    $VERSION
+    @ISA
+    @EXPORT_OK
+    $AUTOLOAD
+    %EXPORT_TAGS
+    $stemmifier
+    %instance_vars
+);
+
+$VERSION = '0.941';
+
+ at ISA         = qw( Exporter );
+%EXPORT_TAGS = ( 'all' => [qw( stemmers stem )] );
+ at EXPORT_OK   = ( @{ $EXPORT_TAGS{'all'} } );
+
+require XSLoader;
+XSLoader::load( 'Lingua::Stem::Snowball', $VERSION );
+
+# a shared home for the actual struct sb_stemmer C modules.
+$stemmifier = Lingua::Stem::Snowball::Stemmifier->new;
+
+%instance_vars = (
+    lang              => '',
+    encoding          => undef,
+    locale            => undef,
+    stemmer_id        => -1,
+    strip_apostrophes => 0,
+);
+
+sub new {
+    my $class = shift;
+    my $self  = bless { %instance_vars, @_ }, ref($class) || $class;
+
+    # validate lang, validate/guess encoding, and get an sb_stemmer
+    $self->lang( $self->{lang} );
+    if ( !defined $self->{encoding} ) {
+        $self->{encoding} = $self->{lang} eq 'ru' ? 'KOI8-R' : 'ISO-8859-1';
+    }
+    $self->_derive_stemmer;
+
+    return $self;
+}
+
+sub stem {
+    my ( $self, $lang, $words, $locale, $is_stemmed );
+
+    # support lots of DWIMmery
+    if ( UNIVERSAL::isa( $_[0], 'HASH' ) ) {
+        ( $self, $words, $is_stemmed ) = @_;
+    }
+    else {
+        ( $lang, $words, $locale, $is_stemmed ) = @_;
+        $self = __PACKAGE__->new( lang => $lang );
+    }
+
+    # bail if we don't have a valid lang
+    return undef unless $self->{lang};
+
+    # bail if there's no input
+    return undef unless ( ref($words) or length($words) );
+
+    # duplicate the input array and transform it into an array of stems
+    $words = ref($words) ? $words : [$words];
+    my @stems = map {lc} @$words;
+    $self->stem_in_place( \@stems );
+
+    # determine whether any stemming took place, if requested
+    if ( ref($is_stemmed) ) {
+        $$is_stemmed = 0;
+        if ( $self->{stemmer_id} == -1 ) {
+            $$is_stemmed = 1;
+        }
+        else {
+            for ( 0 .. $#stems ) {
+                next if $stems[$_] eq $words->[$_];
+                $$is_stemmed = 1;
+                last;
+            }
+        }
+    }
+
+    return wantarray ? @stems : $stems[0];
+}
+
+sub lang {
+    my ( $self, $lang ) = @_;
+    if ( defined $lang ) {
+        $lang = lc($lang);
+        $lang = $lang eq 'dk' ? 'nl' : $lang;    # backwards compat
+        if ( _validate_language($lang) ) {
+            $self->{lang} = $lang;
+            # force stemmer_id regen at next call to stem_in_place
+            $self->{stemmer_id} = -1;
+        }
+        else {
+            $@ = "Language '$lang' does not exist";
+        }
+    }
+    return $self->{lang};
+}
+
+sub encoding {
+    my ( $self, $encoding ) = @_;
+    if ( defined $encoding ) {
+        croak("Invalid value for encoding: '$encoding'")
+            unless $encoding =~ /^(?:UTF-8|KOI8-R|ISO-8859-1)$/;
+        $self->{encoding} = $encoding;
+        # force stemmer_id regen at next call to stem_in_place
+        $self->{stemmer_id} = -1;
+    }
+    return $self->{encoding};
+}
+
+# deprecated, has no effect on stemming behavior
+sub strip_apostrophes {
+    my ( $self, $boolean ) = @_;
+    if ( defined $boolean ) {
+        $self->{strip_apostrophes} eq $boolean ? 1 : 0;
+    }
+    return $self->{strip_apostrophes};
+}
+
+# deprecated, has no effect on stemming behavior
+sub locale {
+    my ( $self, $locale ) = @_;
+    if ($locale) {
+        $self->{locale} = $locale;
+    }
+    return $self->{locale};
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Lingua::Stem::Snowball - Perl interface to Snowball stemmers. 
+
+=head1 SYNOPSIS
+
+    my @words = qw( horse hooves );
+
+    # OO interface:
+    my $stemmer = Lingua::Stem::Snowball->new( lang => 'en' );
+    $stemmer->stem_in_place( \@words ); # qw( hors hoov )
+
+    # plain interface:
+    my @stems = stem( 'en', \@words );
+
+=head1 DESCRIPTION
+
+Stemming reduces related words to a common root form. For instance, "horse",
+"horses", and "horsing" all become "hors".  Most commonly, stemming is
+deployed as part of a search application, allowing searches for a given term
+to match documents which contain other forms of that term.
+
+This module is very similar to L<Lingua::Stem|Lingua::Stem> -- however,
+Lingua::Stem is pure Perl, while Lingua::Stem::Snowball is an XS module which
+provides a Perl interface to the C version of the Snowball stemmers.
+(L<http://snowball.tartarus.org>).  
+
+=head2 Supported Languages
+
+The following stemmers are available (as of Lingua::Stem::Snowball 0.94):
+
+    |-----------------------------------------------------------|
+    | Language   | ISO code | default encoding | also available |
+    |-----------------------------------------------------------|
+    | Danish     | da       | ISO-8859-1       | UTF-8          | 
+    | Dutch      | nl       | ISO-8859-1       | UTF-8          | 
+    | English    | en       | ISO-8859-1       | UTF-8          |
+    | Finnish    | fi       | ISO-8859-1       | UTF-8          | 
+    | French     | fr       | ISO-8859-1       | UTF-8          |
+    | German     | de       | ISO-8859-1       | UTF-8          | 
+    | Italian    | it       | ISO-8859-1       | UTF-8          | 
+    | Norwegian  | no       | ISO-8859-1       | UTF-8          | 
+    | Portuguese | pt       | ISO-8859-1       | UTF-8          | 
+    | Spanish    | es       | ISO-8859-1       | UTF-8          | 
+    | Swedish    | sv       | ISO-8859-1       | UTF-8          | 
+    | Russian    | ru       | KOI8-R           | UTF-8          | 
+    |-----------------------------------------------------------|
+
+=head2 Benchmarks
+
+Here is a comparison of Lingua::Stem::Snowball and Lingua::Stem, using The
+Works of Edgar Allen Poe, volumes 1-5 (via Project Gutenberg) as source
+material.  It was produced on a 3.2GHz Pentium 4 running FreeBSD 5.3 and Perl
+5.8.7.  (The benchmarking script is included in this distribution:
+bin/benchmark_stemmers.plx.)
+
+    |--------------------------------------------------------------------|
+    | total words: 454285 | unique words: 22748                          |
+    |--------------------------------------------------------------------|
+    | module                        | config        | avg secs | rate    |
+    |--------------------------------------------------------------------|
+    | Lingua::Stem 0.81             | no cache      | 2.029    | 223881  |
+    | Lingua::Stem 0.81             | cache level 2 | 1.280    | 355025  |
+    | Lingua::Stem::Snowball 0.94   | stem          | 1.426    | 318636  |
+    | Lingua::Stem::Snowball 0.94   | stem_in_place | 0.641    | 708495  |
+    |--------------------------------------------------------------------|
+
+=head1 METHODS / FUNCTIONS
+
+=head2 new
+
+    my $stemmer = Lingua::Stem::Snowball->new(
+        lang     => 'es', 
+        encoding => 'UTF-8',
+    );
+    die $@ if $@;
+
+Create a Lingua::Stem::Snowball object.  new() accepts the following hash
+style parameters:
+
+=over
+
+=item *
+
+B<lang>: An ISO code taken from the table of supported languages, above.
+
+=item *
+
+B<encoding>: A supported character encoding.
+
+=back
+
+Be careful with the values you supply to new(). If C<lang> is invalid,
+Lingua::Stem::Snowball does not throw an exception, but instead sets $@.
+Also, if you supply an invalid combination of values for C<lang> and
+C<encoding>, Lingua::Stem::Snowball will not warn you, but the behavior will
+change: stem() will always return undef, and stem_in_place() will be a no-op.
+
+=head2 stem
+
+    @stemmed = $stemmer->stem( WORDS, [IS_STEMMED] );
+    @stemmed = stem( ISO_CODE, WORDS, [LOCALE, IS_STEMMED] );
+
+Return lowercased and stemmed output.  WORDS may be either an array of words
+or a single scalar word.  
+
+In a scalar context, stem() returns the first item in the array of stems:
+
+    $stem       = $stemmer->stem($word);
+    $first_stem = $stemmer->stem(\@words); # probably wrong
+
+LOCALE has no effect; it is only there as a placeholder for backwards
+compatibility (see Changes).  IS_STEMMED must be a reference to a scalar; if
+it is supplied, it will be set to 1 if the output differs from the input in
+some way, 0 otherwise.
+
+=head2 stem_in_place
+ 
+    $stemmer->stem_in_place(\@words);
+
+This is a high-performance, streamlined version of stem() (in fact, stem()
+calls stem_in_place() internally). It has no return value, instead modifying
+each item in an existing array of words.  The words must already be in lower
+case.
+
+=head2 lang
+    
+    my $lang = $stemmer->lang;
+    $stemmer->lang($iso_language_code);
+
+Accessor/mutator for the lang parameter. If there is no stemmer for the
+supplied ISO code, the language is not changed (but $@ is set).
+
+=head2 encoding 
+
+    my $encoding = $stemmer->encoding;
+    $stemmer->encoding($encoding);
+
+Accessor/mutator for the encoding parameter.
+
+=head2 stemmers
+
+    my @iso_codes = stemmers();
+    my @iso_codes = $stemmer->stemmers();
+
+Returns a list of all valid language codes.
+
+=begin deprecated
+
+=head2 strip_apostrophes locale
+
+=end deprecated
+
+=head1 REQUESTS & BUGS
+
+Please report any requests, suggestions or bugs via the RT bug-tracking system
+at http://rt.cpan.org/ or email to bug-Lingua-Stem-Snowball at rt.cpan.org. 
+
+http://rt.cpan.org/NoAuth/Bugs.html?Dist=Lingua-Stem-Snowball is the RT queue
+for Lingua::Stem::Snowball.  Please check to see if your bug has already been
+reported. 
+
+=head1 AUTHORS
+
+Lingua::Stem::Snowball was originally developed to provide
+access to stemming algorithms for the OpenFTS (full text search engine) 
+project (L<http://openfts.sourceforge.net>), by Oleg Bartunov, E<lt>oleg at
+sai dot msu dot suE<gt> and Teodor Sigaev, E<lt>teodor at stack dot netE<gt>.
+
+Currently maintained by Marvin Humphrey E<lt>marvin at rectangular dot
+comE<gt>.  Previously maintained by Fabien Potencier E<lt>fabpot at cpan dot
+orgE<gt>.  
+
+=head1 COPYRIGHT
+
+Copyright 2004-2006
+
+This software may be freely copied and distributed under the same
+terms and conditions as Perl.
+
+Snowball files and stemmers are covered by the BSD license.
+
+=head1 SEE ALSO
+
+L<http://snowball.tartarus.org>, L<Lingua::Stem|Lingua::Stem>.
+
+=cut
+
+
diff --git a/lib/Lingua/Stem/Snowball.xs b/lib/Lingua/Stem/Snowball.xs
new file mode 100644
index 0000000..20ea13f
--- /dev/null
+++ b/lib/Lingua/Stem/Snowball.xs
@@ -0,0 +1,251 @@
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+#define NEED_sv_2pv_nolen
+#include "../ppport.h"
+
+#define NUMLANG 12
+#define NUMSTEM 24
+
+#include "include/libstemmer.h"
+
+typedef struct sb_stemmer SnowStemmer;
+
+typedef struct stemmifier {
+    SnowStemmer **stemmers;
+} Stemmifier;
+
+typedef struct langenc {
+    char *lang;
+    char *encoding; /* the real name of the encoding */
+    char *snowenc;  /* the variant that libstemmer_c needs */
+} LangEnc;
+
+LangEnc lang_encs[] = {
+    { "da", "ISO-8859-1", "ISO_8859_1" },
+    { "de", "ISO-8859-1", "ISO_8859_1" },
+    { "nl", "ISO-8859-1", "ISO_8859_1" },
+    { "en", "ISO-8859-1", "ISO_8859_1" },
+    { "es", "ISO-8859-1", "ISO_8859_1" },
+    { "fi", "ISO-8859-1", "ISO_8859_1" },
+    { "fr", "ISO-8859-1", "ISO_8859_1" },
+    { "it", "ISO-8859-1", "ISO_8859_1" },
+    { "no", "ISO-8859-1", "ISO_8859_1" },
+    { "pt", "ISO-8859-1", "ISO_8859_1" },
+    { "ru", "KOI8-R",     "KOI8_R",    },
+    { "sv", "ISO-8859-1", "ISO_8859_1" },
+    { "da", "UTF-8",      "UTF_8"      },
+    { "de", "UTF-8",      "UTF_8"      },
+    { "nl", "UTF-8",      "UTF_8"      },
+    { "en", "UTF-8",      "UTF_8"      },
+    { "es", "UTF-8",      "UTF_8"      },
+    { "fi", "UTF-8",      "UTF_8"      },
+    { "fr", "UTF-8",      "UTF_8"      },
+    { "it", "UTF-8",      "UTF_8"      },
+    { "no", "UTF-8",      "UTF_8"      },
+    { "pt", "UTF-8",      "UTF_8"      },
+    { "ru", "UTF-8",      "UTF_8"      },
+    { "sv", "UTF-8",      "UTF_8"      },
+};
+
+MODULE = Lingua::Stem::Snowball  PACKAGE = Lingua::Stem::Snowball
+
+PROTOTYPES: disable 
+
+void
+_derive_stemmer(obj_hash)
+    HV *obj_hash;
+PREINIT:
+    char  *lang;
+    char  *encoding;
+    SV   **sv_ptr;
+    int i;
+    int stemmer_id;
+PPCODE:
+    /* extract lang and encoding member variables */
+    sv_ptr = hv_fetch(obj_hash, "lang", 4, 0);
+    if (!sv_ptr)
+        croak("Couldn't find member variable 'lang'");
+    lang = SvPV_nolen(*sv_ptr);
+    sv_ptr = hv_fetch(obj_hash, "encoding", 8, 0);
+    if (!sv_ptr)
+        croak("Couldn't find member variable 'encoding'");
+    encoding = SvPV_nolen(*sv_ptr);
+
+    /* see if the combo of lang and encoding is supported */
+    stemmer_id = -1;
+    for(i = 0; i < NUMSTEM; i++) {
+        if (   strcmp(lang,     lang_encs[i].lang)     == 0 
+            && strcmp(encoding, lang_encs[i].encoding) == 0 
+        ) {
+            IV          temp;
+            Stemmifier *stemmifier;
+            SV         *stemmifier_sv;
+
+            /* we have a match, so we know the stemmer id now */
+            stemmer_id = i;
+
+            /* retrieve communal Stemmifier */
+            stemmifier_sv 
+                = get_sv("Lingua::Stem::Snowball::stemmifier", TRUE);
+            if (!SvROK(stemmifier_sv)) {
+                croak("Internal error: can't access stemmifier");
+            }
+            temp = SvIV(SvRV(stemmifier_sv));
+            stemmifier = INT2PTR(Stemmifier*, temp);
+
+            /* construct a stemmer for lang/enc if there isn't one yet */
+            if ( ! stemmifier->stemmers[stemmer_id] ) {
+                stemmifier->stemmers[stemmer_id] 
+                    = sb_stemmer_new(lang, lang_encs[stemmer_id].snowenc);
+                if ( ! stemmifier->stemmers[stemmer_id]  ) {
+                    croak("Failed to allocate an sb_stemmer - out of mem");
+                }
+            } 
+
+            break;
+        }
+    }
+
+    /* set the value of $self->{stemmer_id} */
+    sv_ptr = hv_fetch(obj_hash, "stemmer_id", 10, 0);
+    if (!sv_ptr)
+        croak("Couldn't access $self->{stemmer_id}");
+    sv_setiv(*sv_ptr, stemmer_id);
+
+bool
+_validate_language(lang_sv)
+    SV *lang_sv;
+PREINIT:
+    char   *lang;
+    STRLEN  len;
+    int     i;
+CODE:
+    lang = SvPV(lang_sv, len);
+
+    RETVAL = FALSE;
+    for (i = 0; i < NUMLANG; i++) {
+        if ( strcmp(lang, lang_encs[i].lang) == 0 )
+            RETVAL = TRUE;
+    }
+OUTPUT: RETVAL
+
+
+void
+stemmers(...)
+PREINIT:
+    int  i;
+PPCODE:
+    for (i = 0; i < NUMLANG; i++) {
+        XPUSHs( sv_2mortal(
+            newSVpvn( lang_encs[i].lang, strlen(lang_encs[i].lang) )
+        ));
+    }
+    XSRETURN(NUMLANG);
+
+void
+stem_in_place(obj, words_av)
+    SV  *obj;
+    AV  *words_av;
+PREINIT:
+    HV                *obj_hash;
+    SV               **sv_ptr;
+    IV                 stemmer_id;
+    SV                *stemmifier_sv;
+    Stemmifier        *stemmifier;
+    STRLEN             len;
+    SnowStemmer       *stemmer;
+    const sb_symbol   *input_text;
+    const sb_symbol   *stemmed_output;
+    IV                 i, max;
+PPCODE:
+    /* extract hash from object */
+    if (SvROK(obj) && SvTYPE(SvRV(obj))==SVt_PVHV)
+        obj_hash = (HV*)SvRV(obj);
+    else    
+        croak("not a hash reference");
+
+    /* retrieve the stemmifier */
+    stemmifier_sv = get_sv("Lingua::Stem::Snowball::stemmifier", TRUE);
+    if(!SvROK(stemmifier_sv))
+        croak("$Lingua::Stem::Snowball::stemmifier isn't a Stemmifier");
+    i = SvIV(SvRV(stemmifier_sv));
+    stemmifier = INT2PTR(Stemmifier*, i);
+
+    /* figure out which sb_stemmer to use */
+    sv_ptr = hv_fetch(obj_hash, "stemmer_id", 10, 0);
+    if (!sv_ptr)
+        croak("Couldn't access stemmer_id");
+    stemmer_id = SvIV(*sv_ptr);
+    if (   stemmer_id < 0 
+        || stemmer_id >= NUMSTEM 
+        || stemmifier->stemmers[stemmer_id] == NULL
+    ) {
+        dSP;
+        ENTER;
+        SAVETMPS;
+        PUSHMARK(SP);
+        XPUSHs(obj);
+        PUTBACK;
+        call_method("_derive_stemmer", G_DISCARD);
+        FREETMPS;
+        LEAVE;
+    
+        /* extract what should now be a valid stemmer_id */
+        sv_ptr = hv_fetch(obj_hash, "stemmer_id", 10, 0);
+        stemmer_id = SvIV(*sv_ptr);
+    }
+	if (stemmer_id != -1) {
+		stemmer = stemmifier->stemmers[stemmer_id];
+
+		max = av_len(words_av);
+		for (i = 0; i <= max; i++) {
+			sv_ptr = av_fetch(words_av, i, 0);
+			if (!SvOK(*sv_ptr))
+				continue;
+			input_text     = (const sb_symbol*)SvPV(*sv_ptr, len);
+			stemmed_output = sb_stemmer_stem(stemmer, input_text, (int)len);
+			len = sb_stemmer_length(stemmer);
+			sv_setpvn(*sv_ptr, (char*)stemmed_output, len);
+		}
+	}
+
+MODULE = Lingua::Stem::Snowball PACKAGE = Lingua::Stem::Snowball::Stemmifier
+
+=for comment
+
+Create a new Stemmifier object.
+
+=cut
+
+void
+new(class)
+    char* class;
+PREINIT:
+    Stemmifier *stemmifier;
+PPCODE:
+    New(0, stemmifier, 1, Stemmifier);
+    Newz(0, stemmifier->stemmers, NUMSTEM, SnowStemmer*);
+    ST(0) = sv_newmortal();
+    sv_setref_pv(ST(0), class, (void*)stemmifier);
+    XSRETURN(1);
+
+void
+DESTROY(obj_ref)
+    SV *obj_ref;
+PREINIT:
+    Stemmifier *stemmifier;
+    IV          temp;
+    int         i;
+PPCODE:
+    temp = SvIV( SvRV(obj_ref) );
+    stemmifier = INT2PTR(Stemmifier*, temp);
+    for (i = 0; i < NUMSTEM; i++) {
+        if (stemmifier->stemmers[i] != NULL)
+            sb_stemmer_delete(stemmifier->stemmers[i]);
+    }
+    Safefree(stemmifier);
+    
+    
+    
diff --git a/libstemmer_c/Makefile b/libstemmer_c/Makefile
new file mode 100644
index 0000000..64d6c8e
--- /dev/null
+++ b/libstemmer_c/Makefile
@@ -0,0 +1,9 @@
+include mkinc.mak
+CFLAGS=-Iinclude
+all: libstemmer.o stemwords
+libstemmer.o: $(snowball_sources:.c=.o)
+	$(AR) -cru $@ $^
+stemwords: examples/stemwords.o libstemmer.o
+	$(CC) -o $@ $^
+clean:
+	rm -f stemwords *.o src_c/*.o runtime/*.o libstemmer/*.o
diff --git a/libstemmer_c/README b/libstemmer_c/README
new file mode 100644
index 0000000..3ff66e4
--- /dev/null
+++ b/libstemmer_c/README
@@ -0,0 +1,82 @@
+libstemmer_c
+============
+
+This document pertains to the C version of the libstemmer distribution,
+available for download from:
+
+http://snowball.tartarus.org/dist/libstemmer_c.tgz
+
+
+Compiling the library
+=====================
+
+A simple makefile is provided for Unix style systems.  On such systems, it
+should be possible simply to run "make", and the file "libstemmer.o"
+and the example program "stemwords" will be generated.
+
+If this doesn't work on your system, you need to write your own build
+system (or call the compiler directly).  The files to compile are
+all contained in the "libstemmer", "runtime" and "src_c" directories,
+and the public header file is contained in the "include" directory.
+
+
+Using the library
+=================
+
+The library provides a simple C API.  Essentially, a new stemmer can
+be obtained by using "sb_stemmer_new".  "sb_stemmer_stem" is then
+used to stem a word, "sb_stemmer_length" returns the stemmed
+length of the last word processed, and "sb_stemmer_delete" is
+used to delete a stemmer.
+
+Creating a stemmer is a relatively expensive operation - the expected
+usage pattern is that a new stemmer is created when needed, used
+to stem many words, and deleted after some time.
+
+Stemmers are re-entrant, but not threadsafe.  In other words, if
+you wish to access the same stemmer object from multiple threads,
+you must ensure that all access is protected by a mutex or similar
+device.
+
+libstemmer does not currently incorporate any mechanism for caching the results
+of stemming operations.  Such caching can greatly increase the performance of a
+stemmer under certain situations, so suitable patches will be considered for
+inclusion.
+
+The standard libstemmer sources contain an algorithm for each of the supported
+languages.  The algorithm may be selected using the english name of the
+language, or using the 2 or 3 letter ISO 639 language codes.  In addition,
+the traditional "Porter" stemming algorithm for english is included for
+backwards compatibility purposes, but we recommend use of the "English"
+stemmer in preference for new projects.
+
+(Some minor algorithms which are included only as curiosities in the snowball
+website, such as the Lovins stemmer and the Kraaij Pohlmann stemmer, are not
+included in the standard libstemmer sources.  These are not really supported by
+the snowball project, but it would be possible to compile a modified libstemmer
+library containing these if desired.)
+
+
+The stemwords example
+=====================
+
+The stemwords example program allows you to run any of the stemmers
+compiled into the libstemmer library on a sample vocabulary.  For
+details on how to use it, run it with the "-h" command line option.
+
+
+Using the library in a larger system
+====================================
+
+If you are incorporating the library into the build system of a larger
+program, I recommend copying the unpacked tarball without modification into
+a subdirectory of the sources of your program.  Future versions of the
+library are intended to keep the same structure, so this will keep the
+work required to move to a new version of the library to a minimum.
+
+As an additional convenience, the list of source and header files used
+in the library is detailed in mkinc.mak - a file which is in a suitable
+format for inclusion by a Makefile.  By including this file in your build
+system, you can link the snowball system into your program with a few
+extra rules.
+
diff --git a/libstemmer_c/examples/stemwords.c.disabled b/libstemmer_c/examples/stemwords.c.disabled
new file mode 100644
index 0000000..a951ba4
--- /dev/null
+++ b/libstemmer_c/examples/stemwords.c.disabled
@@ -0,0 +1,191 @@
+/* This is a simple program which uses libstemmer to provide a command
+ * line interface for stemming using any of the algorithms provided.
+ */
+
+#include <stdio.h>
+#include <stdlib.h> /* for malloc, free */
+#include <string.h> /* for memmove */
+#include <ctype.h>  /* for isupper, tolower */
+
+#include "libstemmer.h"
+
+const char * progname;
+static int pretty = 1;
+
+static void
+stem_file(struct sb_stemmer * stemmer, FILE * f_in, FILE * f_out)
+{
+#define INC 10
+    int lim = INC;
+    sb_symbol * b = (sb_symbol *) malloc(lim * sizeof(sb_symbol));
+
+    while(1) {
+        int ch = getc(f_in);
+        if (ch == EOF) {
+            free(b); return;
+        }
+        {
+            int i = 0;
+            while(1) {
+                if (ch == '\n' || ch == EOF) break;
+                if (i == lim) {
+                    sb_symbol * newb;
+		    newb = (sb_symbol *)
+			    realloc(b, (lim + INC) * sizeof(sb_symbol));
+		    if (newb == 0) goto error;
+		    b = newb;
+                    lim = lim + INC;
+                }
+                /* force lower case: */
+                if (isupper(ch)) ch = tolower(ch);
+
+                b[i] = ch;
+		i++;
+                ch = getc(f_in);
+            }
+
+            if (pretty) {
+                int j;
+                for (j = 0; j < i; j++) fprintf(f_out, "%c", b[j]);
+                fprintf(f_out, "%s", " -> ");
+            }
+	    {
+		const sb_symbol * stemmed = sb_stemmer_stem(stemmer, b, i);
+                if (stemmed == NULL)
+                {
+                    fprintf(stderr, "Out of memory");
+                    exit(1);
+                }
+                else
+                {
+                    int j;
+                    /*for (j = 0; j < z->l; j++) */
+                    for (j = 0; stemmed[j] != 0; j++)
+                        fprintf(f_out, "%c", stemmed[j]);
+                    fprintf(f_out, "\n");
+                }
+            }
+        }
+    }
+error:
+    if (b != 0) free(b);
+    return;
+}
+
+/** Display the command line syntax, and then exit.
+ *  @param n The value to exit with.
+ */
+static void
+usage(int n)
+{
+    printf("usage: %s [-l <language>] [-i <input file>] [-o <output file>] [-c <character encoding>] [-p] [-h]\n"
+	  "\n"
+	  "The input file consists of a list of words to be stemmed, one per\n"
+	  "line. Words should be in lower case, but (for English) A-Z letters\n"
+	  "are mapped to their a-z equivalents anyway. If omitted, stdin is\n"
+	  "used.\n"
+	  "\n"
+	  "If -c is given, the argument is the character encoding of the input\n"
+          "and output files.  If it is omitted, the UTF-8 encoding is used.\n"
+	  "\n"
+	  "If -p is given the output file consists of each word of the input\n"
+	  "file followed by \"->\" followed by its stemmed equivalent.\n"
+	  "Otherwise, the output file consists of the stemmed words, one per\n"
+	  "line.\n"
+	  "\n"
+	  "-h displays this help\n",
+	  progname);
+    exit(n);
+}
+
+int
+main(int argc, char * argv[])
+{
+    char * in = 0;
+    char * out = 0;
+    FILE * f_in;
+    FILE * f_out;
+    struct sb_stemmer * stemmer;
+
+    char * language = "english";
+    char * charenc = NULL;
+
+    char * s;
+    int i = 1;
+    pretty = 0;
+
+    progname = argv[0];
+
+    while(i < argc) {
+	s = argv[i++];
+	if (s[0] == '-') {
+	    if (strcmp(s, "-o") == 0) {
+		if (i >= argc) {
+		    fprintf(stderr, "%s requires an argument\n", s);
+		    exit(1);
+		}
+		out = argv[i++];
+	    } else if (strcmp(s, "-i") == 0) {
+		if (i >= argc) {
+		    fprintf(stderr, "%s requires an argument\n", s);
+		    exit(1);
+		}
+		in = argv[i++];
+	    } else if (strcmp(s, "-l") == 0) {
+		if (i >= argc) {
+		    fprintf(stderr, "%s requires an argument\n", s);
+		    exit(1);
+		}
+		language = argv[i++];
+	    } else if (strcmp(s, "-c") == 0) {
+		if (i >= argc) {
+		    fprintf(stderr, "%s requires an argument\n", s);
+		    exit(1);
+		}
+		charenc = argv[i++];
+	    } else if (strcmp(s, "-p") == 0) {
+		pretty = 1;
+	    } else if (strcmp(s, "-h") == 0) {
+		usage(0);
+	    } else {
+		fprintf(stderr, "option %s unknown\n", s);
+		usage(1);
+	    }
+	} else {
+	    fprintf(stderr, "unexpected parameter %s\n", s);
+	    usage(1);
+	}
+    }
+
+    /* prepare the files */
+    f_in = (in == 0) ? stdin : fopen(in, "r");
+    if (f_in == 0) {
+	fprintf(stderr, "file %s not found\n", in);
+	exit(1);
+    }
+    f_out = (out == 0) ? stdout : fopen(out, "w");
+    if (f_out == 0) {
+	fprintf(stderr, "file %s cannot be opened\n", out);
+	exit(1);
+    }
+
+    /* do the stemming process: */
+    stemmer = sb_stemmer_new(language, charenc);
+    if (stemmer == 0) {
+        if (charenc == NULL) {
+            fprintf(stderr, "language `%s' not available for stemming\n", language);
+            exit(1);
+        } else {
+            fprintf(stderr, "language `%s' not available for stemming in encoding `%s'\n", language, charenc);
+            exit(1);
+        }
+    }
+    stem_file(stemmer, f_in, f_out);
+    sb_stemmer_delete(stemmer);
+
+    if (in != 0) (void) fclose(f_in);
+    if (out != 0) (void) fclose(f_out);
+
+    return 0;
+}
+
diff --git a/libstemmer_c/include/libstemmer.h b/libstemmer_c/include/libstemmer.h
new file mode 100644
index 0000000..9d86b85
--- /dev/null
+++ b/libstemmer_c/include/libstemmer.h
@@ -0,0 +1,79 @@
+
+/* Make header file work when included from C++ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct sb_stemmer;
+typedef unsigned char sb_symbol;
+
+/* FIXME - should be able to get a version number for each stemming
+ * algorithm (which will be incremented each time the output changes). */
+
+/** Returns an array of the names of the available stemming algorithms.
+ *  Note that these are the canonical names - aliases (ie, other names for
+ *  the same algorithm) will not be included in the list.
+ *  The list is terminated with a null pointer.
+ *
+ *  The list must not be modified in any way.
+ */
+const char ** sb_stemmer_list(void);
+
+/** Create a new stemmer object, using the specified algorithm, for the
+ *  specified character encoding.
+ *
+ *  All algorithms will usually be available in UTF-8, but may also be
+ *  available in other character encodings.
+ *
+ *  @param algorithm The algorithm name.  This is either the english
+ *  name of the algorithm, or the 2 or 3 letter ISO 639 codes for the
+ *  language.  Note that case is significant in this parameter - the
+ *  value should be supplied in lower case.
+ *
+ *  @param charenc The character encoding.  NULL may be passed as
+ *  this value, in which case UTF-8 encoding will be assumed. Otherwise,
+ *  the argument may be one of "UTF_8", "ISO_8859_1" (ie, Latin 1),
+ *  "CP850" (ie, MS-DOS Latin 1) or "KOI8_R" (Russian).  Note that
+ *  case is significant in this parameter.
+ *
+ *  @return NULL if the specified algorithm is not recognised, or the
+ *  algorithm is not available for the requested encoding.  Otherwise,
+ *  returns a pointer to a newly created stemmer for the requested algorithm.
+ *  The returned pointer must be deleted by calling sb_stemmer_delete().
+ *
+ *  @note NULL will also be returned if an out of memory error occurs.
+ */
+struct sb_stemmer * sb_stemmer_new(const char * algorithm, const char * charenc);
+
+/** Delete a stemmer object.
+ *
+ *  This frees all resources allocated for the stemmer.  After calling
+ *  this function, the supplied stemmer may no longer be used in any way.
+ *
+ *  It is safe to pass a null pointer to this function - this will have
+ *  no effect.
+ */
+void                sb_stemmer_delete(struct sb_stemmer * stemmer);
+
+/** Stem a word.
+ *
+ *  The return value is owned by the stemmer - it must not be freed or
+ *  modified, and it will become invalid when the stemmer is called again,
+ *  or if the stemmer is freed.
+ *
+ *  The length of the return value can be obtained using sb_stemmer_length().
+ *
+ *  If an out-of-memory error occurs, this will return NULL.
+ */
+const sb_symbol *   sb_stemmer_stem(struct sb_stemmer * stemmer,
+				    const sb_symbol * word, int size);
+
+/** Get the length of the result of the last stemmed word.
+ *  This should not be called before sb_stemmer_stem() has been called.
+ */
+int                 sb_stemmer_length(struct sb_stemmer * stemmer);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/libstemmer/libstemmer.c b/libstemmer_c/libstemmer/libstemmer.c
new file mode 100644
index 0000000..1e51026
--- /dev/null
+++ b/libstemmer_c/libstemmer/libstemmer.c
@@ -0,0 +1,92 @@
+
+#include <stdlib.h>
+#include <string.h>
+#include "../include/libstemmer.h"
+#include "../runtime/api.h"
+#include "modules.h"
+
+struct sb_stemmer {
+    struct SN_env * (*create)(void);
+    void (*close)(struct SN_env *);
+    int (*stem)(struct SN_env *);
+
+    struct SN_env * env;
+};
+
+extern const char **
+sb_stemmer_list(void)
+{
+    return algorithm_names;
+}
+
+static stemmer_encoding sb_getenc(const char * charenc)
+{
+    struct stemmer_encoding * encoding;
+    if (charenc == NULL) return ENC_UTF_8;
+    for (encoding = encodings; encoding->name != 0; encoding++) {
+	if (strcmp(encoding->name, charenc) == 0) break;
+    }
+    if (encoding->name == NULL) return ENC_UNKNOWN;
+    return encoding->enc;
+}
+
+extern struct sb_stemmer *
+sb_stemmer_new(const char * algorithm, const char * charenc)
+{
+    stemmer_encoding enc;
+    struct stemmer_modules * module;
+    struct sb_stemmer * stemmer =
+	    (struct sb_stemmer *) malloc(sizeof(struct sb_stemmer));
+    if (stemmer == NULL) return NULL;
+    enc = sb_getenc(charenc);
+    if (enc == ENC_UNKNOWN) return NULL;
+
+    for (module = modules; module->name != 0; module++) {
+	if (strcmp(module->name, algorithm) == 0 && module->enc == enc) break;
+    }
+    if (module->name == NULL) return NULL;
+    
+    stemmer->create = module->create;
+    stemmer->close = module->close;
+    stemmer->stem = module->stem;
+
+    stemmer->env = stemmer->create();
+    if (stemmer->env == NULL)
+    {
+        sb_stemmer_delete(stemmer);
+        return NULL;
+    }
+
+    return stemmer;
+}
+
+void
+sb_stemmer_delete(struct sb_stemmer * stemmer)
+{
+    if (stemmer == 0) return;
+    if (stemmer->close == 0) return;
+    stemmer->close(stemmer->env);
+    stemmer->close = 0;
+    free(stemmer);
+}
+
+const sb_symbol *
+sb_stemmer_stem(struct sb_stemmer * stemmer, const sb_symbol * word, int size)
+{
+    int ret;
+    if (SN_set_current(stemmer->env, size, (const symbol *)(word)))
+    {
+        stemmer->env->l = 0;
+        return NULL;
+    }
+    ret = stemmer->stem(stemmer->env);
+    if (ret < 0) return NULL;
+    stemmer->env->p[stemmer->env->l] = 0;
+    return (const sb_symbol *)(stemmer->env->p);
+}
+
+int
+sb_stemmer_length(struct sb_stemmer * stemmer)
+{
+    return stemmer->env->l;
+}
diff --git a/libstemmer_c/libstemmer/modules.h b/libstemmer_c/libstemmer/modules.h
new file mode 100644
index 0000000..f4a5118
--- /dev/null
+++ b/libstemmer_c/libstemmer/modules.h
@@ -0,0 +1,162 @@
+/* libstemmer/modules.h: List of stemming modules.
+ *
+ * This file is generated by mkmodules.pl from a list of module names.
+ * Do not edit manually.
+ *
+ * Modules included by this file are: danish, dutch, english, finnish, french,
+ * german, italian, norwegian, porter, portuguese, russian, spanish, swedish
+ */
+
+#include "../src_c/stem_ISO_8859_1_danish.h"
+#include "../src_c/stem_UTF_8_danish.h"
+#include "../src_c/stem_ISO_8859_1_dutch.h"
+#include "../src_c/stem_UTF_8_dutch.h"
+#include "../src_c/stem_ISO_8859_1_english.h"
+#include "../src_c/stem_UTF_8_english.h"
+#include "../src_c/stem_ISO_8859_1_finnish.h"
+#include "../src_c/stem_UTF_8_finnish.h"
+#include "../src_c/stem_ISO_8859_1_french.h"
+#include "../src_c/stem_UTF_8_french.h"
+#include "../src_c/stem_ISO_8859_1_german.h"
+#include "../src_c/stem_UTF_8_german.h"
+#include "../src_c/stem_ISO_8859_1_italian.h"
+#include "../src_c/stem_UTF_8_italian.h"
+#include "../src_c/stem_ISO_8859_1_norwegian.h"
+#include "../src_c/stem_UTF_8_norwegian.h"
+#include "../src_c/stem_ISO_8859_1_porter.h"
+#include "../src_c/stem_UTF_8_porter.h"
+#include "../src_c/stem_ISO_8859_1_portuguese.h"
+#include "../src_c/stem_UTF_8_portuguese.h"
+#include "../src_c/stem_KOI8_R_russian.h"
+#include "../src_c/stem_UTF_8_russian.h"
+#include "../src_c/stem_ISO_8859_1_spanish.h"
+#include "../src_c/stem_UTF_8_spanish.h"
+#include "../src_c/stem_ISO_8859_1_swedish.h"
+#include "../src_c/stem_UTF_8_swedish.h"
+
+typedef enum {
+  ENC_UNKNOWN,
+  ENC_ISO_8859_1,
+  ENC_KOI8_R,
+  ENC_UTF_8
+} stemmer_encoding;
+
+struct stemmer_encoding {
+  const char * name;
+  stemmer_encoding enc;
+};
+static struct stemmer_encoding encodings[] = {
+  {"ISO_8859_1", ENC_ISO_8859_1},
+  {"KOI8_R", ENC_KOI8_R},
+  {"UTF_8", ENC_UTF_8},
+  {0,0}
+};
+
+struct stemmer_modules {
+  const char * name;
+  stemmer_encoding enc; 
+  struct SN_env * (*create)(void);
+  void (*close)(struct SN_env *);
+  int (*stem)(struct SN_env *);
+};
+static struct stemmer_modules modules[] = {
+  {"da", ENC_ISO_8859_1, danish_ISO_8859_1_create_env, danish_ISO_8859_1_close_env, danish_ISO_8859_1_stem},
+  {"da", ENC_UTF_8, danish_UTF_8_create_env, danish_UTF_8_close_env, danish_UTF_8_stem},
+  {"dan", ENC_ISO_8859_1, danish_ISO_8859_1_create_env, danish_ISO_8859_1_close_env, danish_ISO_8859_1_stem},
+  {"dan", ENC_UTF_8, danish_UTF_8_create_env, danish_UTF_8_close_env, danish_UTF_8_stem},
+  {"danish", ENC_ISO_8859_1, danish_ISO_8859_1_create_env, danish_ISO_8859_1_close_env, danish_ISO_8859_1_stem},
+  {"danish", ENC_UTF_8, danish_UTF_8_create_env, danish_UTF_8_close_env, danish_UTF_8_stem},
+  {"de", ENC_ISO_8859_1, german_ISO_8859_1_create_env, german_ISO_8859_1_close_env, german_ISO_8859_1_stem},
+  {"de", ENC_UTF_8, german_UTF_8_create_env, german_UTF_8_close_env, german_UTF_8_stem},
+  {"deu", ENC_ISO_8859_1, german_ISO_8859_1_create_env, german_ISO_8859_1_close_env, german_ISO_8859_1_stem},
+  {"deu", ENC_UTF_8, german_UTF_8_create_env, german_UTF_8_close_env, german_UTF_8_stem},
+  {"dut", ENC_ISO_8859_1, dutch_ISO_8859_1_create_env, dutch_ISO_8859_1_close_env, dutch_ISO_8859_1_stem},
+  {"dut", ENC_UTF_8, dutch_UTF_8_create_env, dutch_UTF_8_close_env, dutch_UTF_8_stem},
+  {"dutch", ENC_ISO_8859_1, dutch_ISO_8859_1_create_env, dutch_ISO_8859_1_close_env, dutch_ISO_8859_1_stem},
+  {"dutch", ENC_UTF_8, dutch_UTF_8_create_env, dutch_UTF_8_close_env, dutch_UTF_8_stem},
+  {"en", ENC_ISO_8859_1, english_ISO_8859_1_create_env, english_ISO_8859_1_close_env, english_ISO_8859_1_stem},
+  {"en", ENC_UTF_8, english_UTF_8_create_env, english_UTF_8_close_env, english_UTF_8_stem},
+  {"eng", ENC_ISO_8859_1, english_ISO_8859_1_create_env, english_ISO_8859_1_close_env, english_ISO_8859_1_stem},
+  {"eng", ENC_UTF_8, english_UTF_8_create_env, english_UTF_8_close_env, english_UTF_8_stem},
+  {"english", ENC_ISO_8859_1, english_ISO_8859_1_create_env, english_ISO_8859_1_close_env, english_ISO_8859_1_stem},
+  {"english", ENC_UTF_8, english_UTF_8_create_env, english_UTF_8_close_env, english_UTF_8_stem},
+  {"es", ENC_ISO_8859_1, spanish_ISO_8859_1_create_env, spanish_ISO_8859_1_close_env, spanish_ISO_8859_1_stem},
+  {"es", ENC_UTF_8, spanish_UTF_8_create_env, spanish_UTF_8_close_env, spanish_UTF_8_stem},
+  {"esl", ENC_ISO_8859_1, spanish_ISO_8859_1_create_env, spanish_ISO_8859_1_close_env, spanish_ISO_8859_1_stem},
+  {"esl", ENC_UTF_8, spanish_UTF_8_create_env, spanish_UTF_8_close_env, spanish_UTF_8_stem},
+  {"fi", ENC_ISO_8859_1, finnish_ISO_8859_1_create_env, finnish_ISO_8859_1_close_env, finnish_ISO_8859_1_stem},
+  {"fi", ENC_UTF_8, finnish_UTF_8_create_env, finnish_UTF_8_close_env, finnish_UTF_8_stem},
+  {"fin", ENC_ISO_8859_1, finnish_ISO_8859_1_create_env, finnish_ISO_8859_1_close_env, finnish_ISO_8859_1_stem},
+  {"fin", ENC_UTF_8, finnish_UTF_8_create_env, finnish_UTF_8_close_env, finnish_UTF_8_stem},
+  {"finnish", ENC_ISO_8859_1, finnish_ISO_8859_1_create_env, finnish_ISO_8859_1_close_env, finnish_ISO_8859_1_stem},
+  {"finnish", ENC_UTF_8, finnish_UTF_8_create_env, finnish_UTF_8_close_env, finnish_UTF_8_stem},
+  {"fr", ENC_ISO_8859_1, french_ISO_8859_1_create_env, french_ISO_8859_1_close_env, french_ISO_8859_1_stem},
+  {"fr", ENC_UTF_8, french_UTF_8_create_env, french_UTF_8_close_env, french_UTF_8_stem},
+  {"fra", ENC_ISO_8859_1, french_ISO_8859_1_create_env, french_ISO_8859_1_close_env, french_ISO_8859_1_stem},
+  {"fra", ENC_UTF_8, french_UTF_8_create_env, french_UTF_8_close_env, french_UTF_8_stem},
+  {"fre", ENC_ISO_8859_1, french_ISO_8859_1_create_env, french_ISO_8859_1_close_env, french_ISO_8859_1_stem},
+  {"fre", ENC_UTF_8, french_UTF_8_create_env, french_UTF_8_close_env, french_UTF_8_stem},
+  {"french", ENC_ISO_8859_1, french_ISO_8859_1_create_env, french_ISO_8859_1_close_env, french_ISO_8859_1_stem},
+  {"french", ENC_UTF_8, french_UTF_8_create_env, french_UTF_8_close_env, french_UTF_8_stem},
+  {"ger", ENC_ISO_8859_1, german_ISO_8859_1_create_env, german_ISO_8859_1_close_env, german_ISO_8859_1_stem},
+  {"ger", ENC_UTF_8, german_UTF_8_create_env, german_UTF_8_close_env, german_UTF_8_stem},
+  {"german", ENC_ISO_8859_1, german_ISO_8859_1_create_env, german_ISO_8859_1_close_env, german_ISO_8859_1_stem},
+  {"german", ENC_UTF_8, german_UTF_8_create_env, german_UTF_8_close_env, german_UTF_8_stem},
+  {"it", ENC_ISO_8859_1, italian_ISO_8859_1_create_env, italian_ISO_8859_1_close_env, italian_ISO_8859_1_stem},
+  {"it", ENC_UTF_8, italian_UTF_8_create_env, italian_UTF_8_close_env, italian_UTF_8_stem},
+  {"ita", ENC_ISO_8859_1, italian_ISO_8859_1_create_env, italian_ISO_8859_1_close_env, italian_ISO_8859_1_stem},
+  {"ita", ENC_UTF_8, italian_UTF_8_create_env, italian_UTF_8_close_env, italian_UTF_8_stem},
+  {"italian", ENC_ISO_8859_1, italian_ISO_8859_1_create_env, italian_ISO_8859_1_close_env, italian_ISO_8859_1_stem},
+  {"italian", ENC_UTF_8, italian_UTF_8_create_env, italian_UTF_8_close_env, italian_UTF_8_stem},
+  {"nl", ENC_ISO_8859_1, dutch_ISO_8859_1_create_env, dutch_ISO_8859_1_close_env, dutch_ISO_8859_1_stem},
+  {"nl", ENC_UTF_8, dutch_UTF_8_create_env, dutch_UTF_8_close_env, dutch_UTF_8_stem},
+  {"nld", ENC_ISO_8859_1, dutch_ISO_8859_1_create_env, dutch_ISO_8859_1_close_env, dutch_ISO_8859_1_stem},
+  {"nld", ENC_UTF_8, dutch_UTF_8_create_env, dutch_UTF_8_close_env, dutch_UTF_8_stem},
+  {"no", ENC_ISO_8859_1, norwegian_ISO_8859_1_create_env, norwegian_ISO_8859_1_close_env, norwegian_ISO_8859_1_stem},
+  {"no", ENC_UTF_8, norwegian_UTF_8_create_env, norwegian_UTF_8_close_env, norwegian_UTF_8_stem},
+  {"nor", ENC_ISO_8859_1, norwegian_ISO_8859_1_create_env, norwegian_ISO_8859_1_close_env, norwegian_ISO_8859_1_stem},
+  {"nor", ENC_UTF_8, norwegian_UTF_8_create_env, norwegian_UTF_8_close_env, norwegian_UTF_8_stem},
+  {"norwegian", ENC_ISO_8859_1, norwegian_ISO_8859_1_create_env, norwegian_ISO_8859_1_close_env, norwegian_ISO_8859_1_stem},
+  {"norwegian", ENC_UTF_8, norwegian_UTF_8_create_env, norwegian_UTF_8_close_env, norwegian_UTF_8_stem},
+  {"por", ENC_ISO_8859_1, portuguese_ISO_8859_1_create_env, portuguese_ISO_8859_1_close_env, portuguese_ISO_8859_1_stem},
+  {"por", ENC_UTF_8, portuguese_UTF_8_create_env, portuguese_UTF_8_close_env, portuguese_UTF_8_stem},
+  {"porter", ENC_ISO_8859_1, porter_ISO_8859_1_create_env, porter_ISO_8859_1_close_env, porter_ISO_8859_1_stem},
+  {"porter", ENC_UTF_8, porter_UTF_8_create_env, porter_UTF_8_close_env, porter_UTF_8_stem},
+  {"portuguese", ENC_ISO_8859_1, portuguese_ISO_8859_1_create_env, portuguese_ISO_8859_1_close_env, portuguese_ISO_8859_1_stem},
+  {"portuguese", ENC_UTF_8, portuguese_UTF_8_create_env, portuguese_UTF_8_close_env, portuguese_UTF_8_stem},
+  {"pt", ENC_ISO_8859_1, portuguese_ISO_8859_1_create_env, portuguese_ISO_8859_1_close_env, portuguese_ISO_8859_1_stem},
+  {"pt", ENC_UTF_8, portuguese_UTF_8_create_env, portuguese_UTF_8_close_env, portuguese_UTF_8_stem},
+  {"ru", ENC_KOI8_R, russian_KOI8_R_create_env, russian_KOI8_R_close_env, russian_KOI8_R_stem},
+  {"ru", ENC_UTF_8, russian_UTF_8_create_env, russian_UTF_8_close_env, russian_UTF_8_stem},
+  {"rus", ENC_KOI8_R, russian_KOI8_R_create_env, russian_KOI8_R_close_env, russian_KOI8_R_stem},
+  {"rus", ENC_UTF_8, russian_UTF_8_create_env, russian_UTF_8_close_env, russian_UTF_8_stem},
+  {"russian", ENC_KOI8_R, russian_KOI8_R_create_env, russian_KOI8_R_close_env, russian_KOI8_R_stem},
+  {"russian", ENC_UTF_8, russian_UTF_8_create_env, russian_UTF_8_close_env, russian_UTF_8_stem},
+  {"spa", ENC_ISO_8859_1, spanish_ISO_8859_1_create_env, spanish_ISO_8859_1_close_env, spanish_ISO_8859_1_stem},
+  {"spa", ENC_UTF_8, spanish_UTF_8_create_env, spanish_UTF_8_close_env, spanish_UTF_8_stem},
+  {"spanish", ENC_ISO_8859_1, spanish_ISO_8859_1_create_env, spanish_ISO_8859_1_close_env, spanish_ISO_8859_1_stem},
+  {"spanish", ENC_UTF_8, spanish_UTF_8_create_env, spanish_UTF_8_close_env, spanish_UTF_8_stem},
+  {"sv", ENC_ISO_8859_1, swedish_ISO_8859_1_create_env, swedish_ISO_8859_1_close_env, swedish_ISO_8859_1_stem},
+  {"sv", ENC_UTF_8, swedish_UTF_8_create_env, swedish_UTF_8_close_env, swedish_UTF_8_stem},
+  {"swe", ENC_ISO_8859_1, swedish_ISO_8859_1_create_env, swedish_ISO_8859_1_close_env, swedish_ISO_8859_1_stem},
+  {"swe", ENC_UTF_8, swedish_UTF_8_create_env, swedish_UTF_8_close_env, swedish_UTF_8_stem},
+  {"swedish", ENC_ISO_8859_1, swedish_ISO_8859_1_create_env, swedish_ISO_8859_1_close_env, swedish_ISO_8859_1_stem},
+  {"swedish", ENC_UTF_8, swedish_UTF_8_create_env, swedish_UTF_8_close_env, swedish_UTF_8_stem},
+  {0,0,0,0,0}
+};
+static const char * algorithm_names[] = {
+  "danish", 
+  "dutch", 
+  "english", 
+  "finnish", 
+  "french", 
+  "german", 
+  "italian", 
+  "norwegian", 
+  "porter", 
+  "portuguese", 
+  "russian", 
+  "spanish", 
+  "swedish", 
+  0
+};
diff --git a/libstemmer_c/mkinc.mak b/libstemmer_c/mkinc.mak
new file mode 100644
index 0000000..fdf2fa2
--- /dev/null
+++ b/libstemmer_c/mkinc.mak
@@ -0,0 +1,63 @@
+snowball_sources= \
+libstemmer/libstemmer.c \
+runtime/api.c \
+runtime/utilities.c \
+src_c/stem_ISO_8859_1_danish.c \
+src_c/stem_ISO_8859_1_dutch.c \
+src_c/stem_ISO_8859_1_english.c \
+src_c/stem_ISO_8859_1_finnish.c \
+src_c/stem_ISO_8859_1_french.c \
+src_c/stem_ISO_8859_1_german.c \
+src_c/stem_ISO_8859_1_italian.c \
+src_c/stem_ISO_8859_1_norwegian.c \
+src_c/stem_ISO_8859_1_porter.c \
+src_c/stem_ISO_8859_1_portuguese.c \
+src_c/stem_ISO_8859_1_spanish.c \
+src_c/stem_ISO_8859_1_swedish.c \
+src_c/stem_KOI8_R_russian.c \
+src_c/stem_UTF_8_danish.c \
+src_c/stem_UTF_8_dutch.c \
+src_c/stem_UTF_8_english.c \
+src_c/stem_UTF_8_finnish.c \
+src_c/stem_UTF_8_french.c \
+src_c/stem_UTF_8_german.c \
+src_c/stem_UTF_8_italian.c \
+src_c/stem_UTF_8_norwegian.c \
+src_c/stem_UTF_8_porter.c \
+src_c/stem_UTF_8_portuguese.c \
+src_c/stem_UTF_8_russian.c \
+src_c/stem_UTF_8_spanish.c \
+src_c/stem_UTF_8_swedish.c
+
+snowball_headers= \
+include/libstemmer.h \
+libstemmer/modules.h \
+runtime/api.h \
+runtime/header.h \
+src_c/stem_ISO_8859_1_danish.h \
+src_c/stem_ISO_8859_1_dutch.h \
+src_c/stem_ISO_8859_1_english.h \
+src_c/stem_ISO_8859_1_finnish.h \
+src_c/stem_ISO_8859_1_french.h \
+src_c/stem_ISO_8859_1_german.h \
+src_c/stem_ISO_8859_1_italian.h \
+src_c/stem_ISO_8859_1_norwegian.h \
+src_c/stem_ISO_8859_1_porter.h \
+src_c/stem_ISO_8859_1_portuguese.h \
+src_c/stem_ISO_8859_1_spanish.h \
+src_c/stem_ISO_8859_1_swedish.h \
+src_c/stem_KOI8_R_russian.h \
+src_c/stem_UTF_8_danish.h \
+src_c/stem_UTF_8_dutch.h \
+src_c/stem_UTF_8_english.h \
+src_c/stem_UTF_8_finnish.h \
+src_c/stem_UTF_8_french.h \
+src_c/stem_UTF_8_german.h \
+src_c/stem_UTF_8_italian.h \
+src_c/stem_UTF_8_norwegian.h \
+src_c/stem_UTF_8_porter.h \
+src_c/stem_UTF_8_portuguese.h \
+src_c/stem_UTF_8_russian.h \
+src_c/stem_UTF_8_spanish.h \
+src_c/stem_UTF_8_swedish.h
+
diff --git a/libstemmer_c/runtime/api.c b/libstemmer_c/runtime/api.c
new file mode 100644
index 0000000..9dd5a3b
--- /dev/null
+++ b/libstemmer_c/runtime/api.c
@@ -0,0 +1,69 @@
+
+#include <stdlib.h> /* for calloc, free */
+#include "header.h"
+
+extern struct SN_env * SN_create_env(int S_size, int I_size, int B_size)
+{
+    struct SN_env * z = (struct SN_env *) calloc(1, sizeof(struct SN_env));
+    if (z == NULL) return NULL;
+    z->p = create_s();
+    if (z->p == NULL) goto error;
+    if (S_size)
+    {
+        int i;
+        z->S = (symbol * *) calloc(S_size, sizeof(symbol *));
+        if (z->S == NULL) goto error;
+
+        for (i = 0; i < S_size; i++)
+        {
+            z->S[i] = create_s();
+            if (z->S[i] == NULL) goto error;
+        }
+        z->S_size = S_size;
+    }
+
+    if (I_size)
+    {
+        z->I = (int *) calloc(I_size, sizeof(int));
+        if (z->I == NULL) goto error;
+        z->I_size = I_size;
+    }
+
+    if (B_size)
+    {
+        z->B = (symbol *) calloc(B_size, sizeof(symbol));
+        if (z->B == NULL) goto error;
+        z->B_size = B_size;
+    }
+
+    return z;
+error:
+    SN_close_env(z);
+    return NULL;
+}
+
+extern void SN_close_env(struct SN_env * z)
+{
+    if (z == NULL) return;
+    if (z->S_size)
+    {
+        int i;
+        for (i = 0; i < z->S_size; i++)
+        {
+            lose_s(z->S[i]);
+        }
+        free(z->S);
+    }
+    if (z->I_size) free(z->I);
+    if (z->B_size) free(z->B);
+    if (z->p) lose_s(z->p);
+    free(z);
+}
+
+extern int SN_set_current(struct SN_env * z, int size, const symbol * s)
+{
+    int err = replace_s(z, 0, z->l, size, s, NULL);
+    z->c = 0;
+    return err;
+}
+
diff --git a/libstemmer_c/runtime/api.h b/libstemmer_c/runtime/api.h
new file mode 100644
index 0000000..adc2282
--- /dev/null
+++ b/libstemmer_c/runtime/api.h
@@ -0,0 +1,27 @@
+
+typedef unsigned char symbol;
+
+/* Or replace 'char' above with 'short' for 16 bit characters.
+
+   More precisely, replace 'char' with whatever type guarantees the
+   character width you need. Note however that sizeof(symbol) should divide
+   HEAD, defined in header.h as 2*sizeof(int), without remainder, otherwise
+   there is an alignment problem. In the unlikely event of a problem here,
+   consult Martin Porter.
+
+*/
+
+struct SN_env {
+    symbol * p;
+    int c; int a; int l; int lb; int bra; int ket;
+    int S_size; int I_size; int B_size;
+    symbol * * S;
+    int * I;
+    symbol * B;
+};
+
+extern struct SN_env * SN_create_env(int S_size, int I_size, int B_size);
+extern void SN_close_env(struct SN_env * z);
+
+extern int SN_set_current(struct SN_env * z, int size, const symbol * s);
+
diff --git a/libstemmer_c/runtime/header.h b/libstemmer_c/runtime/header.h
new file mode 100644
index 0000000..c0721d6
--- /dev/null
+++ b/libstemmer_c/runtime/header.h
@@ -0,0 +1,58 @@
+
+#include <limits.h>
+
+#include "api.h"
+
+#define MAXINT INT_MAX
+#define MININT INT_MIN
+
+#define HEAD 2*sizeof(int)
+
+#define SIZE(p)        ((int *)(p))[-1]
+#define SET_SIZE(p, n) ((int *)(p))[-1] = n
+#define CAPACITY(p)    ((int *)(p))[-2]
+
+struct among
+{   int s_size;     /* number of chars in string */
+    symbol * s;       /* search string */
+    int substring_i;/* index to longest matching substring */
+    int result;     /* result of the lookup */
+    int (* function)(struct SN_env *);
+};
+
+extern symbol * create_s(void);
+extern void lose_s(symbol * p);
+
+extern int skip_utf8(const symbol * p, int c, int lb, int l, int n);
+
+extern int in_grouping_U(struct SN_env * z, unsigned char * s, int min, int max);
+extern int in_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max);
+extern int out_grouping_U(struct SN_env * z, unsigned char * s, int min, int max);
+extern int out_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max);
+
+extern int in_grouping(struct SN_env * z, unsigned char * s, int min, int max);
+extern int in_grouping_b(struct SN_env * z, unsigned char * s, int min, int max);
+extern int out_grouping(struct SN_env * z, unsigned char * s, int min, int max);
+extern int out_grouping_b(struct SN_env * z, unsigned char * s, int min, int max);
+
+extern int eq_s(struct SN_env * z, int s_size, symbol * s);
+extern int eq_s_b(struct SN_env * z, int s_size, symbol * s);
+extern int eq_v(struct SN_env * z, symbol * p);
+extern int eq_v_b(struct SN_env * z, symbol * p);
+
+extern int find_among(struct SN_env * z, struct among * v, int v_size);
+extern int find_among_b(struct SN_env * z, struct among * v, int v_size);
+
+extern int replace_s(struct SN_env * z, int c_bra, int c_ket, int s_size, const symbol * s, int * adjustment);
+extern int slice_from_s(struct SN_env * z, int s_size, symbol * s);
+extern int slice_from_v(struct SN_env * z, symbol * p);
+extern int slice_del(struct SN_env * z);
+
+extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, symbol * s);
+extern int insert_v(struct SN_env * z, int bra, int ket, symbol * p);
+
+extern symbol * slice_to(struct SN_env * z, symbol * p);
+extern symbol * assign_to(struct SN_env * z, symbol * p);
+
+extern void debug(struct SN_env * z, int number, int line_count);
+
diff --git a/libstemmer_c/runtime/utilities.c b/libstemmer_c/runtime/utilities.c
new file mode 100644
index 0000000..a6bfa5c
--- /dev/null
+++ b/libstemmer_c/runtime/utilities.c
@@ -0,0 +1,446 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "header.h"
+
+#define unless(C) if(!(C))
+
+#define CREATE_SIZE 1
+
+extern symbol * create_s(void) {
+    symbol * p;
+    void * mem = malloc(HEAD + (CREATE_SIZE + 1) * sizeof(symbol));
+    if (mem == NULL) return NULL;
+    p = (symbol *) (HEAD + (char *) mem);
+    CAPACITY(p) = CREATE_SIZE;
+    SET_SIZE(p, CREATE_SIZE);
+    return p;
+}
+
+extern void lose_s(symbol * p) {
+    if (p == NULL) return;
+    free((char *) p - HEAD);
+}
+
+/*
+   new_p = X_skip_utf8(p, c, lb, l, n); skips n characters forwards from p + c
+   if n +ve, or n characters backwards from p +c - 1 if n -ve. new_p is the new
+   position, or 0 on failure.
+
+   -- used to implement hop and next in the utf8 case.
+*/
+
+extern int skip_utf8(const symbol * p, int c, int lb, int l, int n) {
+    int b;
+    if (n >= 0) {
+        for (; n > 0; n--) {
+            if (c >= l) return -1;
+            b = p[c++];
+            if (b >= 0xC0) {   /* 1100 0000 */
+                while (c < l) {
+                    b = p[c];
+                    if (b >= 0xC0 || b < 0x80) break;
+                    /* break unless b is 10------ */
+                    c++;
+                }
+            }
+        }
+    } else {
+        for (; n < 0; n++) {
+            if (c <= lb) return -1;
+            b = p[--c];
+            if (b >= 0x80) {   /* 1000 0000 */
+                while (c > lb) {
+                    b = p[c];
+                    if (b >= 0xC0) break; /* 1100 0000 */
+                    c--;
+                }
+            }
+        }
+    }
+    return c;
+}
+
+/* Code for character groupings: utf8 cases */
+
+static int get_utf8(const symbol * p, int c, int l, int * slot) {
+    int b0, b1;
+    if (c >= l) return 0;
+    b0 = p[c++];
+    if (b0 < 0xC0 || c == l) {   /* 1100 0000 */
+        * slot = b0; return 1;
+    }
+    b1 = p[c++];
+    if (b0 < 0xE0 || c == l) {   /* 1110 0000 */
+        * slot = (b0 & 0x1F) << 6 | (b1 & 0x3F); return 2;
+    }
+    * slot = (b0 & 0xF) << 12 | (b1 & 0x3F) << 6 | (*p & 0x3F); return 3;
+}
+
+static int get_b_utf8(const symbol * p, int c, int lb, int * slot) {
+    int b0, b1;
+    if (c <= lb) return 0;
+    b0 = p[--c];
+    if (b0 < 0x80 || c == lb) {   /* 1000 0000 */
+        * slot = b0; return 1;
+    }
+    b1 = p[--c];
+    if (b1 >= 0xC0 || c == lb) {   /* 1100 0000 */
+        * slot = (b1 & 0x1F) << 6 | (b0 & 0x3F); return 2;
+    }
+    * slot = (*p & 0xF) << 12 | (b1 & 0x3F) << 6 | (b0 & 0x3F); return 3;
+}
+
+extern int in_grouping_U(struct SN_env * z, unsigned char * s, int min, int max) {
+    int ch;
+    int w = get_utf8(z->p, z->c, z->l, & ch);
+    unless (w) return 0;
+    if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0;
+    z->c += w; return 1;
+}
+
+extern int in_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max) {
+    int ch;
+    int w = get_b_utf8(z->p, z->c, z->lb, & ch);
+    unless (w) return 0;
+    if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0;
+    z->c -= w; return 1;
+}
+
+extern int out_grouping_U(struct SN_env * z, unsigned char * s, int min, int max) {
+    int ch;
+    int w = get_utf8(z->p, z->c, z->l, & ch);
+    unless (w) return 0;
+    unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0;
+    z->c += w; return 1;
+}
+
+extern int out_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max) {
+    int ch;
+    int w = get_b_utf8(z->p, z->c, z->lb, & ch);
+    unless (w) return 0;
+    unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0;
+    z->c -= w; return 1;
+}
+
+/* Code for character groupings: non-utf8 cases */
+
+extern int in_grouping(struct SN_env * z, unsigned char * s, int min, int max) {
+    int ch;
+    if (z->c >= z->l) return 0;
+    ch = z->p[z->c];
+    if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0;
+    z->c++; return 1;
+}
+
+extern int in_grouping_b(struct SN_env * z, unsigned char * s, int min, int max) {
+    int ch;
+    if (z->c <= z->lb) return 0;
+    ch = z->p[z->c - 1];
+    if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0;
+    z->c--; return 1;
+}
+
+extern int out_grouping(struct SN_env * z, unsigned char * s, int min, int max) {
+    int ch;
+    if (z->c >= z->l) return 0;
+    ch = z->p[z->c];
+    unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0;
+    z->c++; return 1;
+}
+
+extern int out_grouping_b(struct SN_env * z, unsigned char * s, int min, int max) {
+    int ch;
+    if (z->c <= z->lb) return 0;
+    ch = z->p[z->c - 1];
+    unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0;
+    z->c--; return 1;
+}
+
+extern int eq_s(struct SN_env * z, int s_size, symbol * s) {
+    if (z->l - z->c < s_size || memcmp(z->p + z->c, s, s_size * sizeof(symbol)) != 0) return 0;
+    z->c += s_size; return 1;
+}
+
+extern int eq_s_b(struct SN_env * z, int s_size, symbol * s) {
+    if (z->c - z->lb < s_size || memcmp(z->p + z->c - s_size, s, s_size * sizeof(symbol)) != 0) return 0;
+    z->c -= s_size; return 1;
+}
+
+extern int eq_v(struct SN_env * z, symbol * p) {
+    return eq_s(z, SIZE(p), p);
+}
+
+extern int eq_v_b(struct SN_env * z, symbol * p) {
+    return eq_s_b(z, SIZE(p), p);
+}
+
+extern int find_among(struct SN_env * z, struct among * v, int v_size) {
+
+    int i = 0;
+    int j = v_size;
+
+    int c = z->c; int l = z->l;
+    symbol * q = z->p + c;
+
+    struct among * w;
+
+    int common_i = 0;
+    int common_j = 0;
+
+    int first_key_inspected = 0;
+
+    while(1) {
+        int k = i + ((j - i) >> 1);
+        int diff = 0;
+        int common = common_i < common_j ? common_i : common_j; /* smaller */
+        w = v + k;
+        {
+            int i; for (i = common; i < w->s_size; i++) {
+                if (c + common == l) { diff = -1; break; }
+                diff = q[common] - w->s[i];
+                if (diff != 0) break;
+                common++;
+            }
+        }
+        if (diff < 0) { j = k; common_j = common; }
+                 else { i = k; common_i = common; }
+        if (j - i <= 1) {
+            if (i > 0) break; /* v->s has been inspected */
+            if (j == i) break; /* only one item in v */
+
+            /* - but now we need to go round once more to get
+               v->s inspected. This looks messy, but is actually
+               the optimal approach.  */
+
+            if (first_key_inspected) break;
+            first_key_inspected = 1;
+        }
+    }
+    while(1) {
+        w = v + i;
+        if (common_i >= w->s_size) {
+            z->c = c + w->s_size;
+            if (w->function == 0) return w->result;
+            {
+                int res = w->function(z);
+                z->c = c + w->s_size;
+                if (res) return w->result;
+            }
+        }
+        i = w->substring_i;
+        if (i < 0) return 0;
+    }
+}
+
+/* find_among_b is for backwards processing. Same comments apply */
+
+extern int find_among_b(struct SN_env * z, struct among * v, int v_size) {
+
+    int i = 0;
+    int j = v_size;
+
+    int c = z->c; int lb = z->lb;
+    symbol * q = z->p + c - 1;
+
+    struct among * w;
+
+    int common_i = 0;
+    int common_j = 0;
+
+    int first_key_inspected = 0;
+
+    while(1) {
+        int k = i + ((j - i) >> 1);
+        int diff = 0;
+        int common = common_i < common_j ? common_i : common_j;
+        w = v + k;
+        {
+            int i; for (i = w->s_size - 1 - common; i >= 0; i--) {
+                if (c - common == lb) { diff = -1; break; }
+                diff = q[- common] - w->s[i];
+                if (diff != 0) break;
+                common++;
+            }
+        }
+        if (diff < 0) { j = k; common_j = common; }
+                 else { i = k; common_i = common; }
+        if (j - i <= 1) {
+            if (i > 0) break;
+            if (j == i) break;
+            if (first_key_inspected) break;
+            first_key_inspected = 1;
+        }
+    }
+    while(1) {
+        w = v + i;
+        if (common_i >= w->s_size) {
+            z->c = c - w->s_size;
+            if (w->function == 0) return w->result;
+            {
+                int res = w->function(z);
+                z->c = c - w->s_size;
+                if (res) return w->result;
+            }
+        }
+        i = w->substring_i;
+        if (i < 0) return 0;
+    }
+}
+
+
+/* Increase the size of the buffer pointed to by p to at least n symbols.
+ * If insufficient memory, returns NULL and frees the old buffer.
+ */
+static symbol * increase_size(symbol * p, int n) {
+    symbol * q;
+    int new_size = n + 20;
+    void * mem = realloc((char *) p - HEAD,
+                         HEAD + (new_size + 1) * sizeof(symbol));
+    if (mem == NULL) {
+        lose_s(p);
+        return NULL;
+    }
+    q = (symbol *) (HEAD + (char *)mem);
+    CAPACITY(q) = new_size;
+    return q;
+}
+
+/* to replace symbols between c_bra and c_ket in z->p by the
+   s_size symbols at s.
+   Returns 0 on success, -1 on error.
+   Also, frees z->p (and sets it to NULL) on error.
+*/
+extern int replace_s(struct SN_env * z, int c_bra, int c_ket, int s_size, const symbol * s, int * adjptr)
+{
+    int adjustment;
+    int len;
+    if (z->p == NULL) {
+        z->p = create_s();
+        if (z->p == NULL) return -1;
+    }
+    adjustment = s_size - (c_ket - c_bra);
+    len = SIZE(z->p);
+    if (adjustment != 0) {
+        if (adjustment + len > CAPACITY(z->p)) {
+            z->p = increase_size(z->p, adjustment + len);
+            if (z->p == NULL) return -1;
+        }
+        memmove(z->p + c_ket + adjustment,
+                z->p + c_ket,
+                (len - c_ket) * sizeof(symbol));
+        SET_SIZE(z->p, adjustment + len);
+        z->l += adjustment;
+        if (z->c >= c_ket)
+            z->c += adjustment;
+        else
+            if (z->c > c_bra)
+                z->c = c_bra;
+    }
+    unless (s_size == 0) memmove(z->p + c_bra, s, s_size * sizeof(symbol));
+    if (adjptr != NULL)
+        *adjptr = adjustment;
+    return 0;
+}
+
+static int slice_check(struct SN_env * z) {
+
+    if (z->bra < 0 ||
+        z->bra > z->ket ||
+        z->ket > z->l ||
+        z->p == NULL ||
+        z->l > SIZE(z->p)) /* this line could be removed */
+    {
+#if 0
+        fprintf(stderr, "faulty slice operation:\n");
+        debug(z, -1, 0);
+#endif
+        return -1;
+    }
+    return 0;
+}
+
+extern int slice_from_s(struct SN_env * z, int s_size, symbol * s) {
+    if (slice_check(z)) return -1;
+    return replace_s(z, z->bra, z->ket, s_size, s, NULL);
+}
+
+extern int slice_from_v(struct SN_env * z, symbol * p) {
+    return slice_from_s(z, SIZE(p), p);
+}
+
+extern int slice_del(struct SN_env * z) {
+    return slice_from_s(z, 0, 0);
+}
+
+extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, symbol * s) {
+    int adjustment;
+    if (replace_s(z, bra, ket, s_size, s, &adjustment))
+        return -1;
+    if (bra <= z->bra) z->bra += adjustment;
+    if (bra <= z->ket) z->ket += adjustment;
+    return 0;
+}
+
+extern int insert_v(struct SN_env * z, int bra, int ket, symbol * p) {
+    int adjustment;
+    if (replace_s(z, bra, ket, SIZE(p), p, &adjustment))
+        return -1;
+    if (bra <= z->bra) z->bra += adjustment;
+    if (bra <= z->ket) z->ket += adjustment;
+    return 0;
+}
+
+extern symbol * slice_to(struct SN_env * z, symbol * p) {
+    if (slice_check(z)) {
+        lose_s(p);
+        return NULL;
+    }
+    {
+        int len = z->ket - z->bra;
+        if (CAPACITY(p) < len) {
+            p = increase_size(p, len);
+            if (p == NULL)
+                return NULL;
+        }
+        memmove(p, z->p + z->bra, len * sizeof(symbol));
+        SET_SIZE(p, len);
+    }
+    return p;
+}
+
+extern symbol * assign_to(struct SN_env * z, symbol * p) {
+    int len = z->l;
+    if (CAPACITY(p) < len) {
+        p = increase_size(p, len);
+        if (p == NULL)
+            return NULL;
+    }
+    memmove(p, z->p, len * sizeof(symbol));
+    SET_SIZE(p, len);
+    return p;
+}
+
+#if 0
+extern void debug(struct SN_env * z, int number, int line_count) {
+    int i;
+    int limit = SIZE(z->p);
+    /*if (number >= 0) printf("%3d (line %4d): '", number, line_count);*/
+    if (number >= 0) printf("%3d (line %4d): [%d]'", number, line_count,limit);
+    for (i = 0; i <= limit; i++) {
+        if (z->lb == i) printf("{");
+        if (z->bra == i) printf("[");
+        if (z->c == i) printf("|");
+        if (z->ket == i) printf("]");
+        if (z->l == i) printf("}");
+        if (i < limit)
+        {   int ch = z->p[i];
+            if (ch == 0) ch = '#';
+            printf("%c", ch);
+        }
+    }
+    printf("'\n");
+}
+#endif
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_danish.c b/libstemmer_c/src_c/stem_ISO_8859_1_danish.c
new file mode 100644
index 0000000..fe0fa76
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_danish.c
@@ -0,0 +1,338 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int danish_ISO_8859_1_stem(struct SN_env * z);
+static int r_undouble(struct SN_env * z);
+static int r_other_suffix(struct SN_env * z);
+static int r_consonant_pair(struct SN_env * z);
+static int r_main_suffix(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+
+extern struct SN_env * danish_ISO_8859_1_create_env(void);
+extern void danish_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_0[3] = { 'h', 'e', 'd' };
+static symbol s_0_1[5] = { 'e', 't', 'h', 'e', 'd' };
+static symbol s_0_2[4] = { 'e', 'r', 'e', 'd' };
+static symbol s_0_3[1] = { 'e' };
+static symbol s_0_4[5] = { 'e', 'r', 'e', 'd', 'e' };
+static symbol s_0_5[4] = { 'e', 'n', 'd', 'e' };
+static symbol s_0_6[6] = { 'e', 'r', 'e', 'n', 'd', 'e' };
+static symbol s_0_7[3] = { 'e', 'n', 'e' };
+static symbol s_0_8[4] = { 'e', 'r', 'n', 'e' };
+static symbol s_0_9[3] = { 'e', 'r', 'e' };
+static symbol s_0_10[2] = { 'e', 'n' };
+static symbol s_0_11[5] = { 'h', 'e', 'd', 'e', 'n' };
+static symbol s_0_12[4] = { 'e', 'r', 'e', 'n' };
+static symbol s_0_13[2] = { 'e', 'r' };
+static symbol s_0_14[5] = { 'h', 'e', 'd', 'e', 'r' };
+static symbol s_0_15[4] = { 'e', 'r', 'e', 'r' };
+static symbol s_0_16[1] = { 's' };
+static symbol s_0_17[4] = { 'h', 'e', 'd', 's' };
+static symbol s_0_18[2] = { 'e', 's' };
+static symbol s_0_19[5] = { 'e', 'n', 'd', 'e', 's' };
+static symbol s_0_20[7] = { 'e', 'r', 'e', 'n', 'd', 'e', 's' };
+static symbol s_0_21[4] = { 'e', 'n', 'e', 's' };
+static symbol s_0_22[5] = { 'e', 'r', 'n', 'e', 's' };
+static symbol s_0_23[4] = { 'e', 'r', 'e', 's' };
+static symbol s_0_24[3] = { 'e', 'n', 's' };
+static symbol s_0_25[6] = { 'h', 'e', 'd', 'e', 'n', 's' };
+static symbol s_0_26[5] = { 'e', 'r', 'e', 'n', 's' };
+static symbol s_0_27[3] = { 'e', 'r', 's' };
+static symbol s_0_28[3] = { 'e', 't', 's' };
+static symbol s_0_29[5] = { 'e', 'r', 'e', 't', 's' };
+static symbol s_0_30[2] = { 'e', 't' };
+static symbol s_0_31[4] = { 'e', 'r', 'e', 't' };
+
+static struct among a_0[32] =
+{
+/*  0 */ { 3, s_0_0, -1, 1, 0},
+/*  1 */ { 5, s_0_1, 0, 1, 0},
+/*  2 */ { 4, s_0_2, -1, 1, 0},
+/*  3 */ { 1, s_0_3, -1, 1, 0},
+/*  4 */ { 5, s_0_4, 3, 1, 0},
+/*  5 */ { 4, s_0_5, 3, 1, 0},
+/*  6 */ { 6, s_0_6, 5, 1, 0},
+/*  7 */ { 3, s_0_7, 3, 1, 0},
+/*  8 */ { 4, s_0_8, 3, 1, 0},
+/*  9 */ { 3, s_0_9, 3, 1, 0},
+/* 10 */ { 2, s_0_10, -1, 1, 0},
+/* 11 */ { 5, s_0_11, 10, 1, 0},
+/* 12 */ { 4, s_0_12, 10, 1, 0},
+/* 13 */ { 2, s_0_13, -1, 1, 0},
+/* 14 */ { 5, s_0_14, 13, 1, 0},
+/* 15 */ { 4, s_0_15, 13, 1, 0},
+/* 16 */ { 1, s_0_16, -1, 2, 0},
+/* 17 */ { 4, s_0_17, 16, 1, 0},
+/* 18 */ { 2, s_0_18, 16, 1, 0},
+/* 19 */ { 5, s_0_19, 18, 1, 0},
+/* 20 */ { 7, s_0_20, 19, 1, 0},
+/* 21 */ { 4, s_0_21, 18, 1, 0},
+/* 22 */ { 5, s_0_22, 18, 1, 0},
+/* 23 */ { 4, s_0_23, 18, 1, 0},
+/* 24 */ { 3, s_0_24, 16, 1, 0},
+/* 25 */ { 6, s_0_25, 24, 1, 0},
+/* 26 */ { 5, s_0_26, 24, 1, 0},
+/* 27 */ { 3, s_0_27, 16, 1, 0},
+/* 28 */ { 3, s_0_28, 16, 1, 0},
+/* 29 */ { 5, s_0_29, 28, 1, 0},
+/* 30 */ { 2, s_0_30, -1, 1, 0},
+/* 31 */ { 4, s_0_31, 30, 1, 0}
+};
+
+static symbol s_1_0[2] = { 'g', 'd' };
+static symbol s_1_1[2] = { 'd', 't' };
+static symbol s_1_2[2] = { 'g', 't' };
+static symbol s_1_3[2] = { 'k', 't' };
+
+static struct among a_1[4] =
+{
+/*  0 */ { 2, s_1_0, -1, -1, 0},
+/*  1 */ { 2, s_1_1, -1, -1, 0},
+/*  2 */ { 2, s_1_2, -1, -1, 0},
+/*  3 */ { 2, s_1_3, -1, -1, 0}
+};
+
+static symbol s_2_0[2] = { 'i', 'g' };
+static symbol s_2_1[3] = { 'l', 'i', 'g' };
+static symbol s_2_2[4] = { 'e', 'l', 'i', 'g' };
+static symbol s_2_3[3] = { 'e', 'l', 's' };
+static symbol s_2_4[4] = { 'l', 0xF8, 's', 't' };
+
+static struct among a_2[5] =
+{
+/*  0 */ { 2, s_2_0, -1, 1, 0},
+/*  1 */ { 3, s_2_1, 0, 1, 0},
+/*  2 */ { 4, s_2_2, 1, 1, 0},
+/*  3 */ { 3, s_2_3, -1, 1, 0},
+/*  4 */ { 4, s_2_4, -1, 2, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128 };
+
+static unsigned char g_s_ending[] = { 239, 254, 42, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 };
+
+static symbol s_0[] = { 's', 't' };
+static symbol s_1[] = { 'i', 'g' };
+static symbol s_2[] = { 'l', 0xF8, 's' };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    {   int c_test = z->c; /* test, line 33 */
+        {   int c = z->c + 3;
+            if (0 > c || c > z->l) return 0;
+            z->c = c; /* hop, line 33 */
+        }
+        z->I[1] = z->c; /* setmark x, line 33 */
+        z->c = c_test;
+    }
+    while(1) { /* goto, line 34 */
+        int c = z->c;
+        if (!(in_grouping(z, g_v, 97, 248))) goto lab0;
+        z->c = c;
+        break;
+    lab0:
+        z->c = c;
+        if (z->c >= z->l) return 0;
+        z->c++; /* goto, line 34 */
+    }
+    while(1) { /* gopast, line 34 */
+        if (!(out_grouping(z, g_v, 97, 248))) goto lab1;
+        break;
+    lab1:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 34 */
+    }
+    z->I[0] = z->c; /* setmark p1, line 34 */
+     /* try, line 35 */
+    if (!(z->I[0] < z->I[1])) goto lab2;
+    z->I[0] = z->I[1];
+lab2:
+    return 1;
+}
+
+static int r_main_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 41 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 41 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 41 */
+        among_var = find_among_b(z, a_0, 32); /* substring, line 41 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 41 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 48 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            if (!(in_grouping_b(z, g_s_ending, 97, 229))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 50 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_consonant_pair(struct SN_env * z) {
+    {   int m_test = z->l - z->c; /* test, line 55 */
+        {   int m3; /* setlimit, line 56 */
+            int m = z->l - z->c; (void) m;
+            if (z->c < z->I[0]) return 0;
+            z->c = z->I[0]; /* tomark, line 56 */
+            m3 = z->lb; z->lb = z->c;
+            z->c = z->l - m;
+            z->ket = z->c; /* [, line 56 */
+            if (!(find_among_b(z, a_1, 4))) { z->lb = m3; return 0; } /* substring, line 56 */
+            z->bra = z->c; /* ], line 56 */
+            z->lb = m3;
+        }
+        z->c = z->l - m_test;
+    }
+    if (z->c <= z->lb) return 0;
+    z->c--; /* next, line 62 */
+    z->bra = z->c; /* ], line 62 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 62 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_other_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m = z->l - z->c; (void) m; /* do, line 66 */
+        z->ket = z->c; /* [, line 66 */
+        if (!(eq_s_b(z, 2, s_0))) goto lab0;
+        z->bra = z->c; /* ], line 66 */
+        if (!(eq_s_b(z, 2, s_1))) goto lab0;
+        {   int ret;
+            ret = slice_del(z); /* delete, line 66 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = z->l - m;
+    }
+    {   int m3; /* setlimit, line 67 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 67 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 67 */
+        among_var = find_among_b(z, a_2, 5); /* substring, line 67 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 67 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 70 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 70 */
+                {   int ret = r_consonant_pair(z);
+                    if (ret == 0) goto lab1; /* call consonant_pair, line 70 */
+                    if (ret < 0) return ret;
+                }
+            lab1:
+                z->c = z->l - m;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_2); /* <-, line 72 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_undouble(struct SN_env * z) {
+    {   int m3; /* setlimit, line 76 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 76 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 76 */
+        if (!(out_grouping_b(z, g_v, 97, 248))) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 76 */
+        z->S[0] = slice_to(z, z->S[0]); /* -> ch, line 76 */
+        if (z->S[0] == 0) return -1; /* -> ch, line 76 */
+        z->lb = m3;
+    }
+    if (!(eq_v_b(z, z->S[0]))) return 0; /* name ch, line 77 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 78 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+extern int danish_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 84 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 84 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 85 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 86 */
+        {   int ret = r_main_suffix(z);
+            if (ret == 0) goto lab1; /* call main_suffix, line 86 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 87 */
+        {   int ret = r_consonant_pair(z);
+            if (ret == 0) goto lab2; /* call consonant_pair, line 87 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 88 */
+        {   int ret = r_other_suffix(z);
+            if (ret == 0) goto lab3; /* call other_suffix, line 88 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 89 */
+        {   int ret = r_undouble(z);
+            if (ret == 0) goto lab4; /* call undouble, line 89 */
+            if (ret < 0) return ret;
+        }
+    lab4:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * danish_ISO_8859_1_create_env(void) { return SN_create_env(1, 2, 0); }
+
+extern void danish_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_danish.h b/libstemmer_c/src_c/stem_ISO_8859_1_danish.h
new file mode 100644
index 0000000..49c5559
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_danish.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * danish_ISO_8859_1_create_env(void);
+extern void danish_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int danish_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_dutch.c b/libstemmer_c/src_c/stem_ISO_8859_1_dutch.c
new file mode 100644
index 0000000..36de3b5
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_dutch.c
@@ -0,0 +1,635 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int dutch_ISO_8859_1_stem(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_undouble(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_en_ending(struct SN_env * z);
+static int r_e_ending(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * dutch_ISO_8859_1_create_env(void);
+extern void dutch_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_1[1] = { 0xE1 };
+static symbol s_0_2[1] = { 0xE4 };
+static symbol s_0_3[1] = { 0xE9 };
+static symbol s_0_4[1] = { 0xEB };
+static symbol s_0_5[1] = { 0xED };
+static symbol s_0_6[1] = { 0xEF };
+static symbol s_0_7[1] = { 0xF3 };
+static symbol s_0_8[1] = { 0xF6 };
+static symbol s_0_9[1] = { 0xFA };
+static symbol s_0_10[1] = { 0xFC };
+
+static struct among a_0[11] =
+{
+/*  0 */ { 0, 0, -1, 6, 0},
+/*  1 */ { 1, s_0_1, 0, 1, 0},
+/*  2 */ { 1, s_0_2, 0, 1, 0},
+/*  3 */ { 1, s_0_3, 0, 2, 0},
+/*  4 */ { 1, s_0_4, 0, 2, 0},
+/*  5 */ { 1, s_0_5, 0, 3, 0},
+/*  6 */ { 1, s_0_6, 0, 3, 0},
+/*  7 */ { 1, s_0_7, 0, 4, 0},
+/*  8 */ { 1, s_0_8, 0, 4, 0},
+/*  9 */ { 1, s_0_9, 0, 5, 0},
+/* 10 */ { 1, s_0_10, 0, 5, 0}
+};
+
+static symbol s_1_1[1] = { 'I' };
+static symbol s_1_2[1] = { 'Y' };
+
+static struct among a_1[3] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 1, s_1_1, 0, 2, 0},
+/*  2 */ { 1, s_1_2, 0, 1, 0}
+};
+
+static symbol s_2_0[2] = { 'd', 'd' };
+static symbol s_2_1[2] = { 'k', 'k' };
+static symbol s_2_2[2] = { 't', 't' };
+
+static struct among a_2[3] =
+{
+/*  0 */ { 2, s_2_0, -1, -1, 0},
+/*  1 */ { 2, s_2_1, -1, -1, 0},
+/*  2 */ { 2, s_2_2, -1, -1, 0}
+};
+
+static symbol s_3_0[3] = { 'e', 'n', 'e' };
+static symbol s_3_1[2] = { 's', 'e' };
+static symbol s_3_2[2] = { 'e', 'n' };
+static symbol s_3_3[5] = { 'h', 'e', 'd', 'e', 'n' };
+static symbol s_3_4[1] = { 's' };
+
+static struct among a_3[5] =
+{
+/*  0 */ { 3, s_3_0, -1, 2, 0},
+/*  1 */ { 2, s_3_1, -1, 3, 0},
+/*  2 */ { 2, s_3_2, -1, 2, 0},
+/*  3 */ { 5, s_3_3, 2, 1, 0},
+/*  4 */ { 1, s_3_4, -1, 3, 0}
+};
+
+static symbol s_4_0[3] = { 'e', 'n', 'd' };
+static symbol s_4_1[2] = { 'i', 'g' };
+static symbol s_4_2[3] = { 'i', 'n', 'g' };
+static symbol s_4_3[4] = { 'l', 'i', 'j', 'k' };
+static symbol s_4_4[4] = { 'b', 'a', 'a', 'r' };
+static symbol s_4_5[3] = { 'b', 'a', 'r' };
+
+static struct among a_4[6] =
+{
+/*  0 */ { 3, s_4_0, -1, 1, 0},
+/*  1 */ { 2, s_4_1, -1, 2, 0},
+/*  2 */ { 3, s_4_2, -1, 1, 0},
+/*  3 */ { 4, s_4_3, -1, 3, 0},
+/*  4 */ { 4, s_4_4, -1, 4, 0},
+/*  5 */ { 3, s_4_5, -1, 5, 0}
+};
+
+static symbol s_5_0[2] = { 'a', 'a' };
+static symbol s_5_1[2] = { 'e', 'e' };
+static symbol s_5_2[2] = { 'o', 'o' };
+static symbol s_5_3[2] = { 'u', 'u' };
+
+static struct among a_5[4] =
+{
+/*  0 */ { 2, s_5_0, -1, -1, 0},
+/*  1 */ { 2, s_5_1, -1, -1, 0},
+/*  2 */ { 2, s_5_2, -1, -1, 0},
+/*  3 */ { 2, s_5_3, -1, -1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
+
+static unsigned char g_v_I[] = { 1, 0, 0, 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
+
+static unsigned char g_v_j[] = { 17, 67, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
+
+static symbol s_0[] = { 'a' };
+static symbol s_1[] = { 'e' };
+static symbol s_2[] = { 'i' };
+static symbol s_3[] = { 'o' };
+static symbol s_4[] = { 'u' };
+static symbol s_5[] = { 'y' };
+static symbol s_6[] = { 'Y' };
+static symbol s_7[] = { 'i' };
+static symbol s_8[] = { 'I' };
+static symbol s_9[] = { 'y' };
+static symbol s_10[] = { 'Y' };
+static symbol s_11[] = { 'y' };
+static symbol s_12[] = { 'i' };
+static symbol s_13[] = { 'e' };
+static symbol s_14[] = { 'g', 'e', 'm' };
+static symbol s_15[] = { 'h', 'e', 'i', 'd' };
+static symbol s_16[] = { 'h', 'e', 'i', 'd' };
+static symbol s_17[] = { 'c' };
+static symbol s_18[] = { 'e', 'n' };
+static symbol s_19[] = { 'i', 'g' };
+static symbol s_20[] = { 'e' };
+static symbol s_21[] = { 'e' };
+
+static int r_prelude(struct SN_env * z) {
+    int among_var;
+    {   int c_test = z->c; /* test, line 42 */
+        while(1) { /* repeat, line 42 */
+            int c = z->c;
+            z->bra = z->c; /* [, line 43 */
+            among_var = find_among(z, a_0, 11); /* substring, line 43 */
+            if (!(among_var)) goto lab0;
+            z->ket = z->c; /* ], line 43 */
+            switch(among_var) {
+                case 0: goto lab0;
+                case 1:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_0); /* <-, line 45 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 2:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_1); /* <-, line 47 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 3:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_2); /* <-, line 49 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 4:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_3); /* <-, line 51 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 5:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_4); /* <-, line 53 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 6:
+                    if (z->c >= z->l) goto lab0;
+                    z->c++; /* next, line 54 */
+                    break;
+            }
+            continue;
+        lab0:
+            z->c = c;
+            break;
+        }
+        z->c = c_test;
+    }
+    {   int c = z->c; /* try, line 57 */
+        z->bra = z->c; /* [, line 57 */
+        if (!(eq_s(z, 1, s_5))) { z->c = c; goto lab1; }
+        z->ket = z->c; /* ], line 57 */
+        {   int ret;
+            ret = slice_from_s(z, 1, s_6); /* <-, line 57 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        ;
+    }
+    while(1) { /* repeat, line 58 */
+        int c = z->c;
+        while(1) { /* goto, line 58 */
+            int c = z->c;
+            if (!(in_grouping(z, g_v, 97, 232))) goto lab3;
+            z->bra = z->c; /* [, line 59 */
+            {   int c = z->c; /* or, line 59 */
+                if (!(eq_s(z, 1, s_7))) goto lab5;
+                z->ket = z->c; /* ], line 59 */
+                if (!(in_grouping(z, g_v, 97, 232))) goto lab5;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_8); /* <-, line 59 */
+                    if (ret < 0) return ret;
+                }
+                goto lab4;
+            lab5:
+                z->c = c;
+                if (!(eq_s(z, 1, s_9))) goto lab3;
+                z->ket = z->c; /* ], line 60 */
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_10); /* <-, line 60 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab4:
+            z->c = c;
+            break;
+        lab3:
+            z->c = c;
+            if (z->c >= z->l) goto lab2;
+            z->c++; /* goto, line 58 */
+        }
+        continue;
+    lab2:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    while(1) { /* gopast, line 69 */
+        if (!(in_grouping(z, g_v, 97, 232))) goto lab0;
+        break;
+    lab0:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 69 */
+    }
+    while(1) { /* gopast, line 69 */
+        if (!(out_grouping(z, g_v, 97, 232))) goto lab1;
+        break;
+    lab1:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 69 */
+    }
+    z->I[0] = z->c; /* setmark p1, line 69 */
+     /* try, line 70 */
+    if (!(z->I[0] < 3)) goto lab2;
+    z->I[0] = 3;
+lab2:
+    while(1) { /* gopast, line 71 */
+        if (!(in_grouping(z, g_v, 97, 232))) goto lab3;
+        break;
+    lab3:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 71 */
+    }
+    while(1) { /* gopast, line 71 */
+        if (!(out_grouping(z, g_v, 97, 232))) goto lab4;
+        break;
+    lab4:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 71 */
+    }
+    z->I[1] = z->c; /* setmark p2, line 71 */
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 75 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 77 */
+        among_var = find_among(z, a_1, 3); /* substring, line 77 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 77 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_11); /* <-, line 78 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_12); /* <-, line 79 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 80 */
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_undouble(struct SN_env * z) {
+    {   int m_test = z->l - z->c; /* test, line 91 */
+        if (!(find_among_b(z, a_2, 3))) return 0; /* among, line 91 */
+        z->c = z->l - m_test;
+    }
+    z->ket = z->c; /* [, line 91 */
+    if (z->c <= z->lb) return 0;
+    z->c--; /* next, line 91 */
+    z->bra = z->c; /* ], line 91 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 91 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_e_ending(struct SN_env * z) {
+    z->B[0] = 0; /* unset e_found, line 95 */
+    z->ket = z->c; /* [, line 96 */
+    if (!(eq_s_b(z, 1, s_13))) return 0;
+    z->bra = z->c; /* ], line 96 */
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 96 */
+        if (ret < 0) return ret;
+    }
+    {   int m_test = z->l - z->c; /* test, line 96 */
+        if (!(out_grouping_b(z, g_v, 97, 232))) return 0;
+        z->c = z->l - m_test;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 96 */
+        if (ret < 0) return ret;
+    }
+    z->B[0] = 1; /* set e_found, line 97 */
+    {   int ret = r_undouble(z);
+        if (ret == 0) return 0; /* call undouble, line 98 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_en_ending(struct SN_env * z) {
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 102 */
+        if (ret < 0) return ret;
+    }
+    {   int m = z->l - z->c; (void) m; /* and, line 102 */
+        if (!(out_grouping_b(z, g_v, 97, 232))) return 0;
+        z->c = z->l - m;
+        {   int m = z->l - z->c; (void) m; /* not, line 102 */
+            if (!(eq_s_b(z, 3, s_14))) goto lab0;
+            return 0;
+        lab0:
+            z->c = z->l - m;
+        }
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 102 */
+        if (ret < 0) return ret;
+    }
+    {   int ret = r_undouble(z);
+        if (ret == 0) return 0; /* call undouble, line 103 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m = z->l - z->c; (void) m; /* do, line 107 */
+        z->ket = z->c; /* [, line 108 */
+        among_var = find_among_b(z, a_3, 5); /* substring, line 108 */
+        if (!(among_var)) goto lab0;
+        z->bra = z->c; /* ], line 108 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret = r_R1(z);
+                    if (ret == 0) goto lab0; /* call R1, line 110 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_from_s(z, 4, s_15); /* <-, line 110 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret = r_en_ending(z);
+                    if (ret == 0) goto lab0; /* call en_ending, line 113 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret = r_R1(z);
+                    if (ret == 0) goto lab0; /* call R1, line 116 */
+                    if (ret < 0) return ret;
+                }
+                if (!(out_grouping_b(z, g_v_j, 97, 232))) goto lab0;
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 116 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab0:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 120 */
+        {   int ret = r_e_ending(z);
+            if (ret == 0) goto lab1; /* call e_ending, line 120 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 122 */
+        z->ket = z->c; /* [, line 122 */
+        if (!(eq_s_b(z, 4, s_16))) goto lab2;
+        z->bra = z->c; /* ], line 122 */
+        {   int ret = r_R2(z);
+            if (ret == 0) goto lab2; /* call R2, line 122 */
+            if (ret < 0) return ret;
+        }
+        {   int m = z->l - z->c; (void) m; /* not, line 122 */
+            if (!(eq_s_b(z, 1, s_17))) goto lab3;
+            goto lab2;
+        lab3:
+            z->c = z->l - m;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 122 */
+            if (ret < 0) return ret;
+        }
+        z->ket = z->c; /* [, line 123 */
+        if (!(eq_s_b(z, 2, s_18))) goto lab2;
+        z->bra = z->c; /* ], line 123 */
+        {   int ret = r_en_ending(z);
+            if (ret == 0) goto lab2; /* call en_ending, line 123 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 126 */
+        z->ket = z->c; /* [, line 127 */
+        among_var = find_among_b(z, a_4, 6); /* substring, line 127 */
+        if (!(among_var)) goto lab4;
+        z->bra = z->c; /* ], line 127 */
+        switch(among_var) {
+            case 0: goto lab4;
+            case 1:
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab4; /* call R2, line 129 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 129 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* or, line 130 */
+                    z->ket = z->c; /* [, line 130 */
+                    if (!(eq_s_b(z, 2, s_19))) goto lab6;
+                    z->bra = z->c; /* ], line 130 */
+                    {   int ret = r_R2(z);
+                        if (ret == 0) goto lab6; /* call R2, line 130 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int m = z->l - z->c; (void) m; /* not, line 130 */
+                        if (!(eq_s_b(z, 1, s_20))) goto lab7;
+                        goto lab6;
+                    lab7:
+                        z->c = z->l - m;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 130 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab6:
+                    z->c = z->l - m;
+                    {   int ret = r_undouble(z);
+                        if (ret == 0) goto lab4; /* call undouble, line 130 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab5:
+                break;
+            case 2:
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab4; /* call R2, line 133 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* not, line 133 */
+                    if (!(eq_s_b(z, 1, s_21))) goto lab8;
+                    goto lab4;
+                lab8:
+                    z->c = z->l - m;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 133 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab4; /* call R2, line 136 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 136 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret = r_e_ending(z);
+                    if (ret == 0) goto lab4; /* call e_ending, line 136 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 4:
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab4; /* call R2, line 139 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 139 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 5:
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab4; /* call R2, line 142 */
+                    if (ret < 0) return ret;
+                }
+                if (!(z->B[0])) goto lab4; /* Boolean test e_found, line 142 */
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 142 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab4:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 146 */
+        if (!(out_grouping_b(z, g_v_I, 73, 232))) goto lab9;
+        {   int m_test = z->l - z->c; /* test, line 148 */
+            if (!(find_among_b(z, a_5, 4))) goto lab9; /* among, line 149 */
+            if (!(out_grouping_b(z, g_v, 97, 232))) goto lab9;
+            z->c = z->l - m_test;
+        }
+        z->ket = z->c; /* [, line 152 */
+        if (z->c <= z->lb) goto lab9;
+        z->c--; /* next, line 152 */
+        z->bra = z->c; /* ], line 152 */
+        {   int ret;
+            ret = slice_del(z); /* delete, line 152 */
+            if (ret < 0) return ret;
+        }
+    lab9:
+        z->c = z->l - m;
+    }
+    return 1;
+}
+
+extern int dutch_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 159 */
+        {   int ret = r_prelude(z);
+            if (ret == 0) goto lab0; /* call prelude, line 159 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 160 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab1; /* call mark_regions, line 160 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 161 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 162 */
+        {   int ret = r_standard_suffix(z);
+            if (ret == 0) goto lab2; /* call standard_suffix, line 162 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 163 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab3; /* call postlude, line 163 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * dutch_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 1); }
+
+extern void dutch_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_dutch.h b/libstemmer_c/src_c/stem_ISO_8859_1_dutch.h
new file mode 100644
index 0000000..e67d111
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_dutch.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * dutch_ISO_8859_1_create_env(void);
+extern void dutch_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int dutch_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_english.c b/libstemmer_c/src_c/stem_ISO_8859_1_english.c
new file mode 100644
index 0000000..3477b38
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_english.c
@@ -0,0 +1,1156 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int english_ISO_8859_1_stem(struct SN_env * z);
+static int r_exception2(struct SN_env * z);
+static int r_exception1(struct SN_env * z);
+static int r_Step_5(struct SN_env * z);
+static int r_Step_4(struct SN_env * z);
+static int r_Step_3(struct SN_env * z);
+static int r_Step_2(struct SN_env * z);
+static int r_Step_1c(struct SN_env * z);
+static int r_Step_1b(struct SN_env * z);
+static int r_Step_1a(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_shortv(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * english_ISO_8859_1_create_env(void);
+extern void english_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_0[6] = { 'c', 'o', 'm', 'm', 'u', 'n' };
+static symbol s_0_1[5] = { 'g', 'e', 'n', 'e', 'r' };
+
+static struct among a_0[2] =
+{
+/*  0 */ { 6, s_0_0, -1, -1, 0},
+/*  1 */ { 5, s_0_1, -1, -1, 0}
+};
+
+static symbol s_1_0[1] = { '\'' };
+static symbol s_1_1[3] = { '\'', 's', '\'' };
+static symbol s_1_2[2] = { '\'', 's' };
+
+static struct among a_1[3] =
+{
+/*  0 */ { 1, s_1_0, -1, 1, 0},
+/*  1 */ { 3, s_1_1, 0, 1, 0},
+/*  2 */ { 2, s_1_2, -1, 1, 0}
+};
+
+static symbol s_2_0[3] = { 'i', 'e', 'd' };
+static symbol s_2_1[1] = { 's' };
+static symbol s_2_2[3] = { 'i', 'e', 's' };
+static symbol s_2_3[4] = { 's', 's', 'e', 's' };
+static symbol s_2_4[2] = { 's', 's' };
+static symbol s_2_5[2] = { 'u', 's' };
+
+static struct among a_2[6] =
+{
+/*  0 */ { 3, s_2_0, -1, 2, 0},
+/*  1 */ { 1, s_2_1, -1, 3, 0},
+/*  2 */ { 3, s_2_2, 1, 2, 0},
+/*  3 */ { 4, s_2_3, 1, 1, 0},
+/*  4 */ { 2, s_2_4, 1, -1, 0},
+/*  5 */ { 2, s_2_5, 1, -1, 0}
+};
+
+static symbol s_3_1[2] = { 'b', 'b' };
+static symbol s_3_2[2] = { 'd', 'd' };
+static symbol s_3_3[2] = { 'f', 'f' };
+static symbol s_3_4[2] = { 'g', 'g' };
+static symbol s_3_5[2] = { 'b', 'l' };
+static symbol s_3_6[2] = { 'm', 'm' };
+static symbol s_3_7[2] = { 'n', 'n' };
+static symbol s_3_8[2] = { 'p', 'p' };
+static symbol s_3_9[2] = { 'r', 'r' };
+static symbol s_3_10[2] = { 'a', 't' };
+static symbol s_3_11[2] = { 't', 't' };
+static symbol s_3_12[2] = { 'i', 'z' };
+
+static struct among a_3[13] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 2, s_3_1, 0, 2, 0},
+/*  2 */ { 2, s_3_2, 0, 2, 0},
+/*  3 */ { 2, s_3_3, 0, 2, 0},
+/*  4 */ { 2, s_3_4, 0, 2, 0},
+/*  5 */ { 2, s_3_5, 0, 1, 0},
+/*  6 */ { 2, s_3_6, 0, 2, 0},
+/*  7 */ { 2, s_3_7, 0, 2, 0},
+/*  8 */ { 2, s_3_8, 0, 2, 0},
+/*  9 */ { 2, s_3_9, 0, 2, 0},
+/* 10 */ { 2, s_3_10, 0, 1, 0},
+/* 11 */ { 2, s_3_11, 0, 2, 0},
+/* 12 */ { 2, s_3_12, 0, 1, 0}
+};
+
+static symbol s_4_0[2] = { 'e', 'd' };
+static symbol s_4_1[3] = { 'e', 'e', 'd' };
+static symbol s_4_2[3] = { 'i', 'n', 'g' };
+static symbol s_4_3[4] = { 'e', 'd', 'l', 'y' };
+static symbol s_4_4[5] = { 'e', 'e', 'd', 'l', 'y' };
+static symbol s_4_5[5] = { 'i', 'n', 'g', 'l', 'y' };
+
+static struct among a_4[6] =
+{
+/*  0 */ { 2, s_4_0, -1, 2, 0},
+/*  1 */ { 3, s_4_1, 0, 1, 0},
+/*  2 */ { 3, s_4_2, -1, 2, 0},
+/*  3 */ { 4, s_4_3, -1, 2, 0},
+/*  4 */ { 5, s_4_4, 3, 1, 0},
+/*  5 */ { 5, s_4_5, -1, 2, 0}
+};
+
+static symbol s_5_0[4] = { 'a', 'n', 'c', 'i' };
+static symbol s_5_1[4] = { 'e', 'n', 'c', 'i' };
+static symbol s_5_2[3] = { 'o', 'g', 'i' };
+static symbol s_5_3[2] = { 'l', 'i' };
+static symbol s_5_4[3] = { 'b', 'l', 'i' };
+static symbol s_5_5[4] = { 'a', 'b', 'l', 'i' };
+static symbol s_5_6[4] = { 'a', 'l', 'l', 'i' };
+static symbol s_5_7[5] = { 'f', 'u', 'l', 'l', 'i' };
+static symbol s_5_8[6] = { 'l', 'e', 's', 's', 'l', 'i' };
+static symbol s_5_9[5] = { 'o', 'u', 's', 'l', 'i' };
+static symbol s_5_10[5] = { 'e', 'n', 't', 'l', 'i' };
+static symbol s_5_11[5] = { 'a', 'l', 'i', 't', 'i' };
+static symbol s_5_12[6] = { 'b', 'i', 'l', 'i', 't', 'i' };
+static symbol s_5_13[5] = { 'i', 'v', 'i', 't', 'i' };
+static symbol s_5_14[6] = { 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_5_15[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_5_16[5] = { 'a', 'l', 'i', 's', 'm' };
+static symbol s_5_17[5] = { 'a', 't', 'i', 'o', 'n' };
+static symbol s_5_18[7] = { 'i', 'z', 'a', 't', 'i', 'o', 'n' };
+static symbol s_5_19[4] = { 'i', 'z', 'e', 'r' };
+static symbol s_5_20[4] = { 'a', 't', 'o', 'r' };
+static symbol s_5_21[7] = { 'i', 'v', 'e', 'n', 'e', 's', 's' };
+static symbol s_5_22[7] = { 'f', 'u', 'l', 'n', 'e', 's', 's' };
+static symbol s_5_23[7] = { 'o', 'u', 's', 'n', 'e', 's', 's' };
+
+static struct among a_5[24] =
+{
+/*  0 */ { 4, s_5_0, -1, 3, 0},
+/*  1 */ { 4, s_5_1, -1, 2, 0},
+/*  2 */ { 3, s_5_2, -1, 13, 0},
+/*  3 */ { 2, s_5_3, -1, 16, 0},
+/*  4 */ { 3, s_5_4, 3, 12, 0},
+/*  5 */ { 4, s_5_5, 4, 4, 0},
+/*  6 */ { 4, s_5_6, 3, 8, 0},
+/*  7 */ { 5, s_5_7, 3, 14, 0},
+/*  8 */ { 6, s_5_8, 3, 15, 0},
+/*  9 */ { 5, s_5_9, 3, 10, 0},
+/* 10 */ { 5, s_5_10, 3, 5, 0},
+/* 11 */ { 5, s_5_11, -1, 8, 0},
+/* 12 */ { 6, s_5_12, -1, 12, 0},
+/* 13 */ { 5, s_5_13, -1, 11, 0},
+/* 14 */ { 6, s_5_14, -1, 1, 0},
+/* 15 */ { 7, s_5_15, 14, 7, 0},
+/* 16 */ { 5, s_5_16, -1, 8, 0},
+/* 17 */ { 5, s_5_17, -1, 7, 0},
+/* 18 */ { 7, s_5_18, 17, 6, 0},
+/* 19 */ { 4, s_5_19, -1, 6, 0},
+/* 20 */ { 4, s_5_20, -1, 7, 0},
+/* 21 */ { 7, s_5_21, -1, 11, 0},
+/* 22 */ { 7, s_5_22, -1, 9, 0},
+/* 23 */ { 7, s_5_23, -1, 10, 0}
+};
+
+static symbol s_6_0[5] = { 'i', 'c', 'a', 't', 'e' };
+static symbol s_6_1[5] = { 'a', 't', 'i', 'v', 'e' };
+static symbol s_6_2[5] = { 'a', 'l', 'i', 'z', 'e' };
+static symbol s_6_3[5] = { 'i', 'c', 'i', 't', 'i' };
+static symbol s_6_4[4] = { 'i', 'c', 'a', 'l' };
+static symbol s_6_5[6] = { 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_6_6[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_6_7[3] = { 'f', 'u', 'l' };
+static symbol s_6_8[4] = { 'n', 'e', 's', 's' };
+
+static struct among a_6[9] =
+{
+/*  0 */ { 5, s_6_0, -1, 4, 0},
+/*  1 */ { 5, s_6_1, -1, 6, 0},
+/*  2 */ { 5, s_6_2, -1, 3, 0},
+/*  3 */ { 5, s_6_3, -1, 4, 0},
+/*  4 */ { 4, s_6_4, -1, 4, 0},
+/*  5 */ { 6, s_6_5, -1, 1, 0},
+/*  6 */ { 7, s_6_6, 5, 2, 0},
+/*  7 */ { 3, s_6_7, -1, 5, 0},
+/*  8 */ { 4, s_6_8, -1, 5, 0}
+};
+
+static symbol s_7_0[2] = { 'i', 'c' };
+static symbol s_7_1[4] = { 'a', 'n', 'c', 'e' };
+static symbol s_7_2[4] = { 'e', 'n', 'c', 'e' };
+static symbol s_7_3[4] = { 'a', 'b', 'l', 'e' };
+static symbol s_7_4[4] = { 'i', 'b', 'l', 'e' };
+static symbol s_7_5[3] = { 'a', 't', 'e' };
+static symbol s_7_6[3] = { 'i', 'v', 'e' };
+static symbol s_7_7[3] = { 'i', 'z', 'e' };
+static symbol s_7_8[3] = { 'i', 't', 'i' };
+static symbol s_7_9[2] = { 'a', 'l' };
+static symbol s_7_10[3] = { 'i', 's', 'm' };
+static symbol s_7_11[3] = { 'i', 'o', 'n' };
+static symbol s_7_12[2] = { 'e', 'r' };
+static symbol s_7_13[3] = { 'o', 'u', 's' };
+static symbol s_7_14[3] = { 'a', 'n', 't' };
+static symbol s_7_15[3] = { 'e', 'n', 't' };
+static symbol s_7_16[4] = { 'm', 'e', 'n', 't' };
+static symbol s_7_17[5] = { 'e', 'm', 'e', 'n', 't' };
+
+static struct among a_7[18] =
+{
+/*  0 */ { 2, s_7_0, -1, 1, 0},
+/*  1 */ { 4, s_7_1, -1, 1, 0},
+/*  2 */ { 4, s_7_2, -1, 1, 0},
+/*  3 */ { 4, s_7_3, -1, 1, 0},
+/*  4 */ { 4, s_7_4, -1, 1, 0},
+/*  5 */ { 3, s_7_5, -1, 1, 0},
+/*  6 */ { 3, s_7_6, -1, 1, 0},
+/*  7 */ { 3, s_7_7, -1, 1, 0},
+/*  8 */ { 3, s_7_8, -1, 1, 0},
+/*  9 */ { 2, s_7_9, -1, 1, 0},
+/* 10 */ { 3, s_7_10, -1, 1, 0},
+/* 11 */ { 3, s_7_11, -1, 2, 0},
+/* 12 */ { 2, s_7_12, -1, 1, 0},
+/* 13 */ { 3, s_7_13, -1, 1, 0},
+/* 14 */ { 3, s_7_14, -1, 1, 0},
+/* 15 */ { 3, s_7_15, -1, 1, 0},
+/* 16 */ { 4, s_7_16, 15, 1, 0},
+/* 17 */ { 5, s_7_17, 16, 1, 0}
+};
+
+static symbol s_8_0[1] = { 'e' };
+static symbol s_8_1[1] = { 'l' };
+
+static struct among a_8[2] =
+{
+/*  0 */ { 1, s_8_0, -1, 1, 0},
+/*  1 */ { 1, s_8_1, -1, 2, 0}
+};
+
+static symbol s_9_0[7] = { 's', 'u', 'c', 'c', 'e', 'e', 'd' };
+static symbol s_9_1[7] = { 'p', 'r', 'o', 'c', 'e', 'e', 'd' };
+static symbol s_9_2[6] = { 'e', 'x', 'c', 'e', 'e', 'd' };
+static symbol s_9_3[7] = { 'c', 'a', 'n', 'n', 'i', 'n', 'g' };
+static symbol s_9_4[6] = { 'i', 'n', 'n', 'i', 'n', 'g' };
+static symbol s_9_5[7] = { 'e', 'a', 'r', 'r', 'i', 'n', 'g' };
+static symbol s_9_6[7] = { 'h', 'e', 'r', 'r', 'i', 'n', 'g' };
+static symbol s_9_7[6] = { 'o', 'u', 't', 'i', 'n', 'g' };
+
+static struct among a_9[8] =
+{
+/*  0 */ { 7, s_9_0, -1, -1, 0},
+/*  1 */ { 7, s_9_1, -1, -1, 0},
+/*  2 */ { 6, s_9_2, -1, -1, 0},
+/*  3 */ { 7, s_9_3, -1, -1, 0},
+/*  4 */ { 6, s_9_4, -1, -1, 0},
+/*  5 */ { 7, s_9_5, -1, -1, 0},
+/*  6 */ { 7, s_9_6, -1, -1, 0},
+/*  7 */ { 6, s_9_7, -1, -1, 0}
+};
+
+static symbol s_10_0[5] = { 'a', 'n', 'd', 'e', 's' };
+static symbol s_10_1[5] = { 'a', 't', 'l', 'a', 's' };
+static symbol s_10_2[4] = { 'b', 'i', 'a', 's' };
+static symbol s_10_3[6] = { 'c', 'o', 's', 'm', 'o', 's' };
+static symbol s_10_4[5] = { 'd', 'y', 'i', 'n', 'g' };
+static symbol s_10_5[5] = { 'e', 'a', 'r', 'l', 'y' };
+static symbol s_10_6[6] = { 'g', 'e', 'n', 't', 'l', 'y' };
+static symbol s_10_7[4] = { 'h', 'o', 'w', 'e' };
+static symbol s_10_8[4] = { 'i', 'd', 'l', 'y' };
+static symbol s_10_9[5] = { 'l', 'y', 'i', 'n', 'g' };
+static symbol s_10_10[4] = { 'n', 'e', 'w', 's' };
+static symbol s_10_11[4] = { 'o', 'n', 'l', 'y' };
+static symbol s_10_12[6] = { 's', 'i', 'n', 'g', 'l', 'y' };
+static symbol s_10_13[5] = { 's', 'k', 'i', 'e', 's' };
+static symbol s_10_14[4] = { 's', 'k', 'i', 's' };
+static symbol s_10_15[3] = { 's', 'k', 'y' };
+static symbol s_10_16[5] = { 't', 'y', 'i', 'n', 'g' };
+static symbol s_10_17[4] = { 'u', 'g', 'l', 'y' };
+
+static struct among a_10[18] =
+{
+/*  0 */ { 5, s_10_0, -1, -1, 0},
+/*  1 */ { 5, s_10_1, -1, -1, 0},
+/*  2 */ { 4, s_10_2, -1, -1, 0},
+/*  3 */ { 6, s_10_3, -1, -1, 0},
+/*  4 */ { 5, s_10_4, -1, 3, 0},
+/*  5 */ { 5, s_10_5, -1, 9, 0},
+/*  6 */ { 6, s_10_6, -1, 7, 0},
+/*  7 */ { 4, s_10_7, -1, -1, 0},
+/*  8 */ { 4, s_10_8, -1, 6, 0},
+/*  9 */ { 5, s_10_9, -1, 4, 0},
+/* 10 */ { 4, s_10_10, -1, -1, 0},
+/* 11 */ { 4, s_10_11, -1, 10, 0},
+/* 12 */ { 6, s_10_12, -1, 11, 0},
+/* 13 */ { 5, s_10_13, -1, 2, 0},
+/* 14 */ { 4, s_10_14, -1, 1, 0},
+/* 15 */ { 3, s_10_15, -1, -1, 0},
+/* 16 */ { 5, s_10_16, -1, 5, 0},
+/* 17 */ { 4, s_10_17, -1, 8, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1 };
+
+static unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 };
+
+static unsigned char g_valid_LI[] = { 55, 141, 2 };
+
+static symbol s_0[] = { '\'' };
+static symbol s_1[] = { 'y' };
+static symbol s_2[] = { 'Y' };
+static symbol s_3[] = { 'y' };
+static symbol s_4[] = { 'Y' };
+static symbol s_5[] = { 's', 's' };
+static symbol s_6[] = { 'i' };
+static symbol s_7[] = { 'i', 'e' };
+static symbol s_8[] = { 'e', 'e' };
+static symbol s_9[] = { 'e' };
+static symbol s_10[] = { 'e' };
+static symbol s_11[] = { 'y' };
+static symbol s_12[] = { 'Y' };
+static symbol s_13[] = { 'i' };
+static symbol s_14[] = { 't', 'i', 'o', 'n' };
+static symbol s_15[] = { 'e', 'n', 'c', 'e' };
+static symbol s_16[] = { 'a', 'n', 'c', 'e' };
+static symbol s_17[] = { 'a', 'b', 'l', 'e' };
+static symbol s_18[] = { 'e', 'n', 't' };
+static symbol s_19[] = { 'i', 'z', 'e' };
+static symbol s_20[] = { 'a', 't', 'e' };
+static symbol s_21[] = { 'a', 'l' };
+static symbol s_22[] = { 'f', 'u', 'l' };
+static symbol s_23[] = { 'o', 'u', 's' };
+static symbol s_24[] = { 'i', 'v', 'e' };
+static symbol s_25[] = { 'b', 'l', 'e' };
+static symbol s_26[] = { 'l' };
+static symbol s_27[] = { 'o', 'g' };
+static symbol s_28[] = { 'f', 'u', 'l' };
+static symbol s_29[] = { 'l', 'e', 's', 's' };
+static symbol s_30[] = { 't', 'i', 'o', 'n' };
+static symbol s_31[] = { 'a', 't', 'e' };
+static symbol s_32[] = { 'a', 'l' };
+static symbol s_33[] = { 'i', 'c' };
+static symbol s_34[] = { 's' };
+static symbol s_35[] = { 't' };
+static symbol s_36[] = { 'l' };
+static symbol s_37[] = { 's', 'k', 'i' };
+static symbol s_38[] = { 's', 'k', 'y' };
+static symbol s_39[] = { 'd', 'i', 'e' };
+static symbol s_40[] = { 'l', 'i', 'e' };
+static symbol s_41[] = { 't', 'i', 'e' };
+static symbol s_42[] = { 'i', 'd', 'l' };
+static symbol s_43[] = { 'g', 'e', 'n', 't', 'l' };
+static symbol s_44[] = { 'u', 'g', 'l', 'i' };
+static symbol s_45[] = { 'e', 'a', 'r', 'l', 'i' };
+static symbol s_46[] = { 'o', 'n', 'l', 'i' };
+static symbol s_47[] = { 's', 'i', 'n', 'g', 'l' };
+static symbol s_48[] = { 'Y' };
+static symbol s_49[] = { 'y' };
+
+static int r_prelude(struct SN_env * z) {
+    z->B[0] = 0; /* unset Y_found, line 26 */
+    {   int c = z->c; /* do, line 27 */
+        z->bra = z->c; /* [, line 27 */
+        if (!(eq_s(z, 1, s_0))) goto lab0;
+        z->ket = z->c; /* ], line 27 */
+        {   int ret;
+            ret = slice_del(z); /* delete, line 27 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 28 */
+        z->bra = z->c; /* [, line 28 */
+        if (!(eq_s(z, 1, s_1))) goto lab1;
+        z->ket = z->c; /* ], line 28 */
+        {   int ret;
+            ret = slice_from_s(z, 1, s_2); /* <-, line 28 */
+            if (ret < 0) return ret;
+        }
+        z->B[0] = 1; /* set Y_found, line 28 */
+    lab1:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 29 */
+        while(1) { /* repeat, line 29 */
+            int c = z->c;
+            while(1) { /* goto, line 29 */
+                int c = z->c;
+                if (!(in_grouping(z, g_v, 97, 121))) goto lab4;
+                z->bra = z->c; /* [, line 29 */
+                if (!(eq_s(z, 1, s_3))) goto lab4;
+                z->ket = z->c; /* ], line 29 */
+                z->c = c;
+                break;
+            lab4:
+                z->c = c;
+                if (z->c >= z->l) goto lab3;
+                z->c++; /* goto, line 29 */
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_4); /* <-, line 29 */
+                if (ret < 0) return ret;
+            }
+            z->B[0] = 1; /* set Y_found, line 29 */
+            continue;
+        lab3:
+            z->c = c;
+            break;
+        }
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    {   int c = z->c; /* do, line 35 */
+        {   int c = z->c; /* or, line 40 */
+            if (!(find_among(z, a_0, 2))) goto lab2; /* among, line 36 */
+            goto lab1;
+        lab2:
+            z->c = c;
+            while(1) { /* gopast, line 40 */
+                if (!(in_grouping(z, g_v, 97, 121))) goto lab3;
+                break;
+            lab3:
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* gopast, line 40 */
+            }
+            while(1) { /* gopast, line 40 */
+                if (!(out_grouping(z, g_v, 97, 121))) goto lab4;
+                break;
+            lab4:
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* gopast, line 40 */
+            }
+        }
+    lab1:
+        z->I[0] = z->c; /* setmark p1, line 41 */
+        while(1) { /* gopast, line 42 */
+            if (!(in_grouping(z, g_v, 97, 121))) goto lab5;
+            break;
+        lab5:
+            if (z->c >= z->l) goto lab0;
+            z->c++; /* gopast, line 42 */
+        }
+        while(1) { /* gopast, line 42 */
+            if (!(out_grouping(z, g_v, 97, 121))) goto lab6;
+            break;
+        lab6:
+            if (z->c >= z->l) goto lab0;
+            z->c++; /* gopast, line 42 */
+        }
+        z->I[1] = z->c; /* setmark p2, line 42 */
+    lab0:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_shortv(struct SN_env * z) {
+    {   int m = z->l - z->c; (void) m; /* or, line 50 */
+        if (!(out_grouping_b(z, g_v_WXY, 89, 121))) goto lab1;
+        if (!(in_grouping_b(z, g_v, 97, 121))) goto lab1;
+        if (!(out_grouping_b(z, g_v, 97, 121))) goto lab1;
+        goto lab0;
+    lab1:
+        z->c = z->l - m;
+        if (!(out_grouping_b(z, g_v, 97, 121))) return 0;
+        if (!(in_grouping_b(z, g_v, 97, 121))) return 0;
+        if (z->c > z->lb) return 0; /* atlimit, line 51 */
+    }
+lab0:
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_Step_1a(struct SN_env * z) {
+    int among_var;
+    {   int m = z->l - z->c; (void) m; /* try, line 58 */
+        z->ket = z->c; /* [, line 59 */
+        among_var = find_among_b(z, a_1, 3); /* substring, line 59 */
+        if (!(among_var)) { z->c = z->l - m; goto lab0; }
+        z->bra = z->c; /* ], line 59 */
+        switch(among_var) {
+            case 0: { z->c = z->l - m; goto lab0; }
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 61 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab0:
+        ;
+    }
+    z->ket = z->c; /* [, line 64 */
+    among_var = find_among_b(z, a_2, 6); /* substring, line 64 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 64 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_5); /* <-, line 65 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m = z->l - z->c; (void) m; /* or, line 67 */
+                {   int c = z->c - 2;
+                    if (z->lb > c || c > z->l) goto lab2;
+                    z->c = c; /* hop, line 67 */
+                }
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_6); /* <-, line 67 */
+                    if (ret < 0) return ret;
+                }
+                goto lab1;
+            lab2:
+                z->c = z->l - m;
+                {   int ret;
+                    ret = slice_from_s(z, 2, s_7); /* <-, line 67 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab1:
+            break;
+        case 3:
+            if (z->c <= z->lb) return 0;
+            z->c--; /* next, line 68 */
+            while(1) { /* gopast, line 68 */
+                if (!(in_grouping_b(z, g_v, 97, 121))) goto lab3;
+                break;
+            lab3:
+                if (z->c <= z->lb) return 0;
+                z->c--; /* gopast, line 68 */
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 68 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_1b(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 74 */
+    among_var = find_among_b(z, a_4, 6); /* substring, line 74 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 74 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 76 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 2, s_8); /* <-, line 76 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m_test = z->l - z->c; /* test, line 79 */
+                while(1) { /* gopast, line 79 */
+                    if (!(in_grouping_b(z, g_v, 97, 121))) goto lab0;
+                    break;
+                lab0:
+                    if (z->c <= z->lb) return 0;
+                    z->c--; /* gopast, line 79 */
+                }
+                z->c = z->l - m_test;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 79 */
+                if (ret < 0) return ret;
+            }
+            {   int m_test = z->l - z->c; /* test, line 80 */
+                among_var = find_among_b(z, a_3, 13); /* substring, line 80 */
+                if (!(among_var)) return 0;
+                z->c = z->l - m_test;
+            }
+            switch(among_var) {
+                case 0: return 0;
+                case 1:
+                    {   int ret;
+                        {   int c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_9); /* <+, line 82 */
+                            z->c = c;
+                        }
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 2:
+                    z->ket = z->c; /* [, line 85 */
+                    if (z->c <= z->lb) return 0;
+                    z->c--; /* next, line 85 */
+                    z->bra = z->c; /* ], line 85 */
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 85 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 3:
+                    if (z->c != z->I[0]) return 0; /* atmark, line 86 */
+                    {   int m_test = z->l - z->c; /* test, line 86 */
+                        {   int ret = r_shortv(z);
+                            if (ret == 0) return 0; /* call shortv, line 86 */
+                            if (ret < 0) return ret;
+                        }
+                        z->c = z->l - m_test;
+                    }
+                    {   int ret;
+                        {   int c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_10); /* <+, line 86 */
+                            z->c = c;
+                        }
+                        if (ret < 0) return ret;
+                    }
+                    break;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_1c(struct SN_env * z) {
+    z->ket = z->c; /* [, line 93 */
+    {   int m = z->l - z->c; (void) m; /* or, line 93 */
+        if (!(eq_s_b(z, 1, s_11))) goto lab1;
+        goto lab0;
+    lab1:
+        z->c = z->l - m;
+        if (!(eq_s_b(z, 1, s_12))) return 0;
+    }
+lab0:
+    z->bra = z->c; /* ], line 93 */
+    if (!(out_grouping_b(z, g_v, 97, 121))) return 0;
+    {   int m = z->l - z->c; (void) m; /* not, line 94 */
+        if (z->c > z->lb) goto lab2; /* atlimit, line 94 */
+        return 0;
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int ret;
+        ret = slice_from_s(z, 1, s_13); /* <-, line 95 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_Step_2(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 99 */
+    among_var = find_among_b(z, a_5, 24); /* substring, line 99 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 99 */
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 99 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_14); /* <-, line 100 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_15); /* <-, line 101 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_16); /* <-, line 102 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_17); /* <-, line 103 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_18); /* <-, line 104 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_19); /* <-, line 106 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 7:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_20); /* <-, line 108 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 8:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_21); /* <-, line 110 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 9:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_22); /* <-, line 111 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 10:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_23); /* <-, line 113 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 11:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_24); /* <-, line 115 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 12:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_25); /* <-, line 117 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 13:
+            if (!(eq_s_b(z, 1, s_26))) return 0;
+            {   int ret;
+                ret = slice_from_s(z, 2, s_27); /* <-, line 118 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 14:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_28); /* <-, line 119 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 15:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_29); /* <-, line 120 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 16:
+            if (!(in_grouping_b(z, g_valid_LI, 99, 116))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 121 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_3(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 126 */
+    among_var = find_among_b(z, a_6, 9); /* substring, line 126 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 126 */
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 126 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_30); /* <-, line 127 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_31); /* <-, line 128 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_32); /* <-, line 129 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_33); /* <-, line 131 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 133 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 135 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 135 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_4(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 140 */
+    among_var = find_among_b(z, a_7, 18); /* substring, line 140 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 140 */
+    {   int ret = r_R2(z);
+        if (ret == 0) return 0; /* call R2, line 140 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 143 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m = z->l - z->c; (void) m; /* or, line 144 */
+                if (!(eq_s_b(z, 1, s_34))) goto lab1;
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_35))) return 0;
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 144 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_5(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 149 */
+    among_var = find_among_b(z, a_8, 2); /* substring, line 149 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 149 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* or, line 150 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab1; /* call R2, line 150 */
+                    if (ret < 0) return ret;
+                }
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                {   int ret = r_R1(z);
+                    if (ret == 0) return 0; /* call R1, line 150 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* not, line 150 */
+                    {   int ret = r_shortv(z);
+                        if (ret == 0) goto lab2; /* call shortv, line 150 */
+                        if (ret < 0) return ret;
+                    }
+                    return 0;
+                lab2:
+                    z->c = z->l - m;
+                }
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 150 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 151 */
+                if (ret < 0) return ret;
+            }
+            if (!(eq_s_b(z, 1, s_36))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 151 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_exception2(struct SN_env * z) {
+    z->ket = z->c; /* [, line 157 */
+    if (!(find_among_b(z, a_9, 8))) return 0; /* substring, line 157 */
+    z->bra = z->c; /* ], line 157 */
+    if (z->c > z->lb) return 0; /* atlimit, line 157 */
+    return 1;
+}
+
+static int r_exception1(struct SN_env * z) {
+    int among_var;
+    z->bra = z->c; /* [, line 169 */
+    among_var = find_among(z, a_10, 18); /* substring, line 169 */
+    if (!(among_var)) return 0;
+    z->ket = z->c; /* ], line 169 */
+    if (z->c < z->l) return 0; /* atlimit, line 169 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_37); /* <-, line 173 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_38); /* <-, line 174 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_39); /* <-, line 175 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_40); /* <-, line 176 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_41); /* <-, line 177 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_42); /* <-, line 181 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 7:
+            {   int ret;
+                ret = slice_from_s(z, 5, s_43); /* <-, line 182 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 8:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_44); /* <-, line 183 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 9:
+            {   int ret;
+                ret = slice_from_s(z, 5, s_45); /* <-, line 184 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 10:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_46); /* <-, line 185 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 11:
+            {   int ret;
+                ret = slice_from_s(z, 5, s_47); /* <-, line 186 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    if (!(z->B[0])) return 0; /* Boolean test Y_found, line 202 */
+    while(1) { /* repeat, line 202 */
+        int c = z->c;
+        while(1) { /* goto, line 202 */
+            int c = z->c;
+            z->bra = z->c; /* [, line 202 */
+            if (!(eq_s(z, 1, s_48))) goto lab1;
+            z->ket = z->c; /* ], line 202 */
+            z->c = c;
+            break;
+        lab1:
+            z->c = c;
+            if (z->c >= z->l) goto lab0;
+            z->c++; /* goto, line 202 */
+        }
+        {   int ret;
+            ret = slice_from_s(z, 1, s_49); /* <-, line 202 */
+            if (ret < 0) return ret;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+extern int english_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* or, line 206 */
+        {   int ret = r_exception1(z);
+            if (ret == 0) goto lab1; /* call exception1, line 206 */
+            if (ret < 0) return ret;
+        }
+        goto lab0;
+    lab1:
+        z->c = c;
+        {   int c = z->c; /* not, line 207 */
+            {   int c = z->c + 3;
+                if (0 > c || c > z->l) goto lab3;
+                z->c = c; /* hop, line 207 */
+            }
+            goto lab2;
+        lab3:
+            z->c = c;
+        }
+        goto lab0;
+    lab2:
+        z->c = c;
+        {   int c = z->c; /* do, line 208 */
+            {   int ret = r_prelude(z);
+                if (ret == 0) goto lab4; /* call prelude, line 208 */
+                if (ret < 0) return ret;
+            }
+        lab4:
+            z->c = c;
+        }
+        {   int c = z->c; /* do, line 209 */
+            {   int ret = r_mark_regions(z);
+                if (ret == 0) goto lab5; /* call mark_regions, line 209 */
+                if (ret < 0) return ret;
+            }
+        lab5:
+            z->c = c;
+        }
+        z->lb = z->c; z->c = z->l; /* backwards, line 210 */
+
+        {   int m = z->l - z->c; (void) m; /* do, line 212 */
+            {   int ret = r_Step_1a(z);
+                if (ret == 0) goto lab6; /* call Step_1a, line 212 */
+                if (ret < 0) return ret;
+            }
+        lab6:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* or, line 214 */
+            {   int ret = r_exception2(z);
+                if (ret == 0) goto lab8; /* call exception2, line 214 */
+                if (ret < 0) return ret;
+            }
+            goto lab7;
+        lab8:
+            z->c = z->l - m;
+            {   int m = z->l - z->c; (void) m; /* do, line 216 */
+                {   int ret = r_Step_1b(z);
+                    if (ret == 0) goto lab9; /* call Step_1b, line 216 */
+                    if (ret < 0) return ret;
+                }
+            lab9:
+                z->c = z->l - m;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 217 */
+                {   int ret = r_Step_1c(z);
+                    if (ret == 0) goto lab10; /* call Step_1c, line 217 */
+                    if (ret < 0) return ret;
+                }
+            lab10:
+                z->c = z->l - m;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 219 */
+                {   int ret = r_Step_2(z);
+                    if (ret == 0) goto lab11; /* call Step_2, line 219 */
+                    if (ret < 0) return ret;
+                }
+            lab11:
+                z->c = z->l - m;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 220 */
+                {   int ret = r_Step_3(z);
+                    if (ret == 0) goto lab12; /* call Step_3, line 220 */
+                    if (ret < 0) return ret;
+                }
+            lab12:
+                z->c = z->l - m;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 221 */
+                {   int ret = r_Step_4(z);
+                    if (ret == 0) goto lab13; /* call Step_4, line 221 */
+                    if (ret < 0) return ret;
+                }
+            lab13:
+                z->c = z->l - m;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 223 */
+                {   int ret = r_Step_5(z);
+                    if (ret == 0) goto lab14; /* call Step_5, line 223 */
+                    if (ret < 0) return ret;
+                }
+            lab14:
+                z->c = z->l - m;
+            }
+        }
+    lab7:
+        z->c = z->lb;
+        {   int c = z->c; /* do, line 226 */
+            {   int ret = r_postlude(z);
+                if (ret == 0) goto lab15; /* call postlude, line 226 */
+                if (ret < 0) return ret;
+            }
+        lab15:
+            z->c = c;
+        }
+    }
+lab0:
+    return 1;
+}
+
+extern struct SN_env * english_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 1); }
+
+extern void english_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_english.h b/libstemmer_c/src_c/stem_ISO_8859_1_english.h
new file mode 100644
index 0000000..e685dcf
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_english.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * english_ISO_8859_1_create_env(void);
+extern void english_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int english_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_finnish.c b/libstemmer_c/src_c/stem_ISO_8859_1_finnish.c
new file mode 100644
index 0000000..0d851cd
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_finnish.c
@@ -0,0 +1,792 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int finnish_ISO_8859_1_stem(struct SN_env * z);
+static int r_tidy(struct SN_env * z);
+static int r_other_endings(struct SN_env * z);
+static int r_t_plural(struct SN_env * z);
+static int r_i_plural(struct SN_env * z);
+static int r_case_ending(struct SN_env * z);
+static int r_VI(struct SN_env * z);
+static int r_LONG(struct SN_env * z);
+static int r_possessive(struct SN_env * z);
+static int r_particle_etc(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+
+extern struct SN_env * finnish_ISO_8859_1_create_env(void);
+extern void finnish_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_0[2] = { 'p', 'a' };
+static symbol s_0_1[3] = { 's', 't', 'i' };
+static symbol s_0_2[4] = { 'k', 'a', 'a', 'n' };
+static symbol s_0_3[3] = { 'h', 'a', 'n' };
+static symbol s_0_4[3] = { 'k', 'i', 'n' };
+static symbol s_0_5[3] = { 'h', 0xE4, 'n' };
+static symbol s_0_6[4] = { 'k', 0xE4, 0xE4, 'n' };
+static symbol s_0_7[2] = { 'k', 'o' };
+static symbol s_0_8[2] = { 'p', 0xE4 };
+static symbol s_0_9[2] = { 'k', 0xF6 };
+
+static struct among a_0[10] =
+{
+/*  0 */ { 2, s_0_0, -1, 1, 0},
+/*  1 */ { 3, s_0_1, -1, 2, 0},
+/*  2 */ { 4, s_0_2, -1, 1, 0},
+/*  3 */ { 3, s_0_3, -1, 1, 0},
+/*  4 */ { 3, s_0_4, -1, 1, 0},
+/*  5 */ { 3, s_0_5, -1, 1, 0},
+/*  6 */ { 4, s_0_6, -1, 1, 0},
+/*  7 */ { 2, s_0_7, -1, 1, 0},
+/*  8 */ { 2, s_0_8, -1, 1, 0},
+/*  9 */ { 2, s_0_9, -1, 1, 0}
+};
+
+static symbol s_1_0[3] = { 'l', 'l', 'a' };
+static symbol s_1_1[2] = { 'n', 'a' };
+static symbol s_1_2[3] = { 's', 's', 'a' };
+static symbol s_1_3[2] = { 't', 'a' };
+static symbol s_1_4[3] = { 'l', 't', 'a' };
+static symbol s_1_5[3] = { 's', 't', 'a' };
+
+static struct among a_1[6] =
+{
+/*  0 */ { 3, s_1_0, -1, -1, 0},
+/*  1 */ { 2, s_1_1, -1, -1, 0},
+/*  2 */ { 3, s_1_2, -1, -1, 0},
+/*  3 */ { 2, s_1_3, -1, -1, 0},
+/*  4 */ { 3, s_1_4, 3, -1, 0},
+/*  5 */ { 3, s_1_5, 3, -1, 0}
+};
+
+static symbol s_2_0[3] = { 'l', 'l', 0xE4 };
+static symbol s_2_1[2] = { 'n', 0xE4 };
+static symbol s_2_2[3] = { 's', 's', 0xE4 };
+static symbol s_2_3[2] = { 't', 0xE4 };
+static symbol s_2_4[3] = { 'l', 't', 0xE4 };
+static symbol s_2_5[3] = { 's', 't', 0xE4 };
+
+static struct among a_2[6] =
+{
+/*  0 */ { 3, s_2_0, -1, -1, 0},
+/*  1 */ { 2, s_2_1, -1, -1, 0},
+/*  2 */ { 3, s_2_2, -1, -1, 0},
+/*  3 */ { 2, s_2_3, -1, -1, 0},
+/*  4 */ { 3, s_2_4, 3, -1, 0},
+/*  5 */ { 3, s_2_5, 3, -1, 0}
+};
+
+static symbol s_3_0[3] = { 'l', 'l', 'e' };
+static symbol s_3_1[3] = { 'i', 'n', 'e' };
+
+static struct among a_3[2] =
+{
+/*  0 */ { 3, s_3_0, -1, -1, 0},
+/*  1 */ { 3, s_3_1, -1, -1, 0}
+};
+
+static symbol s_4_0[3] = { 'n', 's', 'a' };
+static symbol s_4_1[3] = { 'm', 'm', 'e' };
+static symbol s_4_2[3] = { 'n', 'n', 'e' };
+static symbol s_4_3[2] = { 'n', 'i' };
+static symbol s_4_4[2] = { 's', 'i' };
+static symbol s_4_5[2] = { 'a', 'n' };
+static symbol s_4_6[2] = { 'e', 'n' };
+static symbol s_4_7[2] = { 0xE4, 'n' };
+static symbol s_4_8[3] = { 'n', 's', 0xE4 };
+
+static struct among a_4[9] =
+{
+/*  0 */ { 3, s_4_0, -1, 3, 0},
+/*  1 */ { 3, s_4_1, -1, 3, 0},
+/*  2 */ { 3, s_4_2, -1, 3, 0},
+/*  3 */ { 2, s_4_3, -1, 2, 0},
+/*  4 */ { 2, s_4_4, -1, 1, 0},
+/*  5 */ { 2, s_4_5, -1, 4, 0},
+/*  6 */ { 2, s_4_6, -1, 6, 0},
+/*  7 */ { 2, s_4_7, -1, 5, 0},
+/*  8 */ { 3, s_4_8, -1, 3, 0}
+};
+
+static symbol s_5_0[2] = { 'a', 'a' };
+static symbol s_5_1[2] = { 'e', 'e' };
+static symbol s_5_2[2] = { 'i', 'i' };
+static symbol s_5_3[2] = { 'o', 'o' };
+static symbol s_5_4[2] = { 'u', 'u' };
+static symbol s_5_5[2] = { 0xE4, 0xE4 };
+static symbol s_5_6[2] = { 0xF6, 0xF6 };
+
+static struct among a_5[7] =
+{
+/*  0 */ { 2, s_5_0, -1, -1, 0},
+/*  1 */ { 2, s_5_1, -1, -1, 0},
+/*  2 */ { 2, s_5_2, -1, -1, 0},
+/*  3 */ { 2, s_5_3, -1, -1, 0},
+/*  4 */ { 2, s_5_4, -1, -1, 0},
+/*  5 */ { 2, s_5_5, -1, -1, 0},
+/*  6 */ { 2, s_5_6, -1, -1, 0}
+};
+
+static symbol s_6_0[1] = { 'a' };
+static symbol s_6_1[3] = { 'l', 'l', 'a' };
+static symbol s_6_2[2] = { 'n', 'a' };
+static symbol s_6_3[3] = { 's', 's', 'a' };
+static symbol s_6_4[2] = { 't', 'a' };
+static symbol s_6_5[3] = { 'l', 't', 'a' };
+static symbol s_6_6[3] = { 's', 't', 'a' };
+static symbol s_6_7[3] = { 't', 't', 'a' };
+static symbol s_6_8[3] = { 'l', 'l', 'e' };
+static symbol s_6_9[3] = { 'i', 'n', 'e' };
+static symbol s_6_10[3] = { 'k', 's', 'i' };
+static symbol s_6_11[1] = { 'n' };
+static symbol s_6_12[3] = { 'h', 'a', 'n' };
+static symbol s_6_13[3] = { 'd', 'e', 'n' };
+static symbol s_6_14[4] = { 's', 'e', 'e', 'n' };
+static symbol s_6_15[3] = { 'h', 'e', 'n' };
+static symbol s_6_16[4] = { 't', 't', 'e', 'n' };
+static symbol s_6_17[3] = { 'h', 'i', 'n' };
+static symbol s_6_18[4] = { 's', 'i', 'i', 'n' };
+static symbol s_6_19[3] = { 'h', 'o', 'n' };
+static symbol s_6_20[3] = { 'h', 0xE4, 'n' };
+static symbol s_6_21[3] = { 'h', 0xF6, 'n' };
+static symbol s_6_22[1] = { 0xE4 };
+static symbol s_6_23[3] = { 'l', 'l', 0xE4 };
+static symbol s_6_24[2] = { 'n', 0xE4 };
+static symbol s_6_25[3] = { 's', 's', 0xE4 };
+static symbol s_6_26[2] = { 't', 0xE4 };
+static symbol s_6_27[3] = { 'l', 't', 0xE4 };
+static symbol s_6_28[3] = { 's', 't', 0xE4 };
+static symbol s_6_29[3] = { 't', 't', 0xE4 };
+
+static struct among a_6[30] =
+{
+/*  0 */ { 1, s_6_0, -1, 8, 0},
+/*  1 */ { 3, s_6_1, 0, -1, 0},
+/*  2 */ { 2, s_6_2, 0, -1, 0},
+/*  3 */ { 3, s_6_3, 0, -1, 0},
+/*  4 */ { 2, s_6_4, 0, -1, 0},
+/*  5 */ { 3, s_6_5, 4, -1, 0},
+/*  6 */ { 3, s_6_6, 4, -1, 0},
+/*  7 */ { 3, s_6_7, 4, 9, 0},
+/*  8 */ { 3, s_6_8, -1, -1, 0},
+/*  9 */ { 3, s_6_9, -1, -1, 0},
+/* 10 */ { 3, s_6_10, -1, -1, 0},
+/* 11 */ { 1, s_6_11, -1, 7, 0},
+/* 12 */ { 3, s_6_12, 11, 1, 0},
+/* 13 */ { 3, s_6_13, 11, -1, r_VI},
+/* 14 */ { 4, s_6_14, 11, -1, r_LONG},
+/* 15 */ { 3, s_6_15, 11, 2, 0},
+/* 16 */ { 4, s_6_16, 11, -1, r_VI},
+/* 17 */ { 3, s_6_17, 11, 3, 0},
+/* 18 */ { 4, s_6_18, 11, -1, r_VI},
+/* 19 */ { 3, s_6_19, 11, 4, 0},
+/* 20 */ { 3, s_6_20, 11, 5, 0},
+/* 21 */ { 3, s_6_21, 11, 6, 0},
+/* 22 */ { 1, s_6_22, -1, 8, 0},
+/* 23 */ { 3, s_6_23, 22, -1, 0},
+/* 24 */ { 2, s_6_24, 22, -1, 0},
+/* 25 */ { 3, s_6_25, 22, -1, 0},
+/* 26 */ { 2, s_6_26, 22, -1, 0},
+/* 27 */ { 3, s_6_27, 26, -1, 0},
+/* 28 */ { 3, s_6_28, 26, -1, 0},
+/* 29 */ { 3, s_6_29, 26, 9, 0}
+};
+
+static symbol s_7_0[3] = { 'e', 'j', 'a' };
+static symbol s_7_1[3] = { 'm', 'm', 'a' };
+static symbol s_7_2[4] = { 'i', 'm', 'm', 'a' };
+static symbol s_7_3[3] = { 'm', 'p', 'a' };
+static symbol s_7_4[4] = { 'i', 'm', 'p', 'a' };
+static symbol s_7_5[3] = { 'm', 'm', 'i' };
+static symbol s_7_6[4] = { 'i', 'm', 'm', 'i' };
+static symbol s_7_7[3] = { 'm', 'p', 'i' };
+static symbol s_7_8[4] = { 'i', 'm', 'p', 'i' };
+static symbol s_7_9[3] = { 'e', 'j', 0xE4 };
+static symbol s_7_10[3] = { 'm', 'm', 0xE4 };
+static symbol s_7_11[4] = { 'i', 'm', 'm', 0xE4 };
+static symbol s_7_12[3] = { 'm', 'p', 0xE4 };
+static symbol s_7_13[4] = { 'i', 'm', 'p', 0xE4 };
+
+static struct among a_7[14] =
+{
+/*  0 */ { 3, s_7_0, -1, -1, 0},
+/*  1 */ { 3, s_7_1, -1, 1, 0},
+/*  2 */ { 4, s_7_2, 1, -1, 0},
+/*  3 */ { 3, s_7_3, -1, 1, 0},
+/*  4 */ { 4, s_7_4, 3, -1, 0},
+/*  5 */ { 3, s_7_5, -1, 1, 0},
+/*  6 */ { 4, s_7_6, 5, -1, 0},
+/*  7 */ { 3, s_7_7, -1, 1, 0},
+/*  8 */ { 4, s_7_8, 7, -1, 0},
+/*  9 */ { 3, s_7_9, -1, -1, 0},
+/* 10 */ { 3, s_7_10, -1, 1, 0},
+/* 11 */ { 4, s_7_11, 10, -1, 0},
+/* 12 */ { 3, s_7_12, -1, 1, 0},
+/* 13 */ { 4, s_7_13, 12, -1, 0}
+};
+
+static symbol s_8_0[1] = { 'i' };
+static symbol s_8_1[1] = { 'j' };
+
+static struct among a_8[2] =
+{
+/*  0 */ { 1, s_8_0, -1, -1, 0},
+/*  1 */ { 1, s_8_1, -1, -1, 0}
+};
+
+static symbol s_9_0[3] = { 'm', 'm', 'a' };
+static symbol s_9_1[4] = { 'i', 'm', 'm', 'a' };
+
+static struct among a_9[2] =
+{
+/*  0 */ { 3, s_9_0, -1, 1, 0},
+/*  1 */ { 4, s_9_1, 0, -1, 0}
+};
+
+static unsigned char g_AEI[] = { 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 };
+
+static unsigned char g_V1[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 };
+
+static unsigned char g_V2[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 };
+
+static unsigned char g_particle_end[] = { 17, 97, 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 };
+
+static symbol s_0[] = { 'k' };
+static symbol s_1[] = { 'k', 's', 'e' };
+static symbol s_2[] = { 'k', 's', 'i' };
+static symbol s_3[] = { 'i' };
+static symbol s_4[] = { 'a' };
+static symbol s_5[] = { 'e' };
+static symbol s_6[] = { 'i' };
+static symbol s_7[] = { 'o' };
+static symbol s_8[] = { 0xE4 };
+static symbol s_9[] = { 0xF6 };
+static symbol s_10[] = { 'i', 'e' };
+static symbol s_11[] = { 'e' };
+static symbol s_12[] = { 'p', 'o' };
+static symbol s_13[] = { 't' };
+static symbol s_14[] = { 'p', 'o' };
+static symbol s_15[] = { 'j' };
+static symbol s_16[] = { 'o' };
+static symbol s_17[] = { 'u' };
+static symbol s_18[] = { 'o' };
+static symbol s_19[] = { 'j' };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    while(1) { /* goto, line 46 */
+        int c = z->c;
+        if (!(in_grouping(z, g_V1, 97, 246))) goto lab0;
+        z->c = c;
+        break;
+    lab0:
+        z->c = c;
+        if (z->c >= z->l) return 0;
+        z->c++; /* goto, line 46 */
+    }
+    while(1) { /* gopast, line 46 */
+        if (!(out_grouping(z, g_V1, 97, 246))) goto lab1;
+        break;
+    lab1:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 46 */
+    }
+    z->I[0] = z->c; /* setmark p1, line 46 */
+    while(1) { /* goto, line 47 */
+        int c = z->c;
+        if (!(in_grouping(z, g_V1, 97, 246))) goto lab2;
+        z->c = c;
+        break;
+    lab2:
+        z->c = c;
+        if (z->c >= z->l) return 0;
+        z->c++; /* goto, line 47 */
+    }
+    while(1) { /* gopast, line 47 */
+        if (!(out_grouping(z, g_V1, 97, 246))) goto lab3;
+        break;
+    lab3:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 47 */
+    }
+    z->I[1] = z->c; /* setmark p2, line 47 */
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_particle_etc(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 55 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 55 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 55 */
+        among_var = find_among_b(z, a_0, 10); /* substring, line 55 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 55 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            if (!(in_grouping_b(z, g_particle_end, 97, 246))) return 0;
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 64 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 66 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_possessive(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 69 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 69 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 69 */
+        among_var = find_among_b(z, a_4, 9); /* substring, line 69 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 69 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* not, line 72 */
+                if (!(eq_s_b(z, 1, s_0))) goto lab0;
+                return 0;
+            lab0:
+                z->c = z->l - m;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 72 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 74 */
+                if (ret < 0) return ret;
+            }
+            z->ket = z->c; /* [, line 74 */
+            if (!(eq_s_b(z, 3, s_1))) return 0;
+            z->bra = z->c; /* ], line 74 */
+            {   int ret;
+                ret = slice_from_s(z, 3, s_2); /* <-, line 74 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 78 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            if (!(find_among_b(z, a_1, 6))) return 0; /* among, line 81 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 81 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            if (!(find_among_b(z, a_2, 6))) return 0; /* among, line 83 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 84 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            if (!(find_among_b(z, a_3, 2))) return 0; /* among, line 86 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 86 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_LONG(struct SN_env * z) {
+    if (!(find_among_b(z, a_5, 7))) return 0; /* among, line 91 */
+    return 1;
+}
+
+static int r_VI(struct SN_env * z) {
+    if (!(eq_s_b(z, 1, s_3))) return 0;
+    if (!(in_grouping_b(z, g_V2, 97, 246))) return 0;
+    return 1;
+}
+
+static int r_case_ending(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 96 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 96 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 96 */
+        among_var = find_among_b(z, a_6, 30); /* substring, line 96 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 96 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            if (!(eq_s_b(z, 1, s_4))) return 0;
+            break;
+        case 2:
+            if (!(eq_s_b(z, 1, s_5))) return 0;
+            break;
+        case 3:
+            if (!(eq_s_b(z, 1, s_6))) return 0;
+            break;
+        case 4:
+            if (!(eq_s_b(z, 1, s_7))) return 0;
+            break;
+        case 5:
+            if (!(eq_s_b(z, 1, s_8))) return 0;
+            break;
+        case 6:
+            if (!(eq_s_b(z, 1, s_9))) return 0;
+            break;
+        case 7:
+            {   int m = z->l - z->c; (void) m; /* try, line 111 */
+                {   int m = z->l - z->c; (void) m; /* and, line 113 */
+                    {   int m = z->l - z->c; (void) m; /* or, line 112 */
+                        {   int ret = r_LONG(z);
+                            if (ret == 0) goto lab2; /* call LONG, line 111 */
+                            if (ret < 0) return ret;
+                        }
+                        goto lab1;
+                    lab2:
+                        z->c = z->l - m;
+                        if (!(eq_s_b(z, 2, s_10))) { z->c = z->l - m; goto lab0; }
+                    }
+                lab1:
+                    z->c = z->l - m;
+                    if (z->c <= z->lb) { z->c = z->l - m; goto lab0; }
+                    z->c--; /* next, line 113 */
+                }
+                z->bra = z->c; /* ], line 113 */
+            lab0:
+                ;
+            }
+            break;
+        case 8:
+            if (!(in_grouping_b(z, g_V1, 97, 246))) return 0;
+            if (!(out_grouping_b(z, g_V1, 97, 246))) return 0;
+            break;
+        case 9:
+            if (!(eq_s_b(z, 1, s_11))) return 0;
+            break;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 138 */
+        if (ret < 0) return ret;
+    }
+    z->B[0] = 1; /* set ending_removed, line 139 */
+    return 1;
+}
+
+static int r_other_endings(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 142 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[1]) return 0;
+        z->c = z->I[1]; /* tomark, line 142 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 142 */
+        among_var = find_among_b(z, a_7, 14); /* substring, line 142 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 142 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* not, line 146 */
+                if (!(eq_s_b(z, 2, s_12))) goto lab0;
+                return 0;
+            lab0:
+                z->c = z->l - m;
+            }
+            break;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 151 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_i_plural(struct SN_env * z) {
+    {   int m3; /* setlimit, line 154 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 154 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 154 */
+        if (!(find_among_b(z, a_8, 2))) { z->lb = m3; return 0; } /* substring, line 154 */
+        z->bra = z->c; /* ], line 154 */
+        z->lb = m3;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 158 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_t_plural(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 161 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 161 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 162 */
+        if (!(eq_s_b(z, 1, s_13))) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 162 */
+        {   int m_test = z->l - z->c; /* test, line 162 */
+            if (!(in_grouping_b(z, g_V1, 97, 246))) { z->lb = m3; return 0; }
+            z->c = z->l - m_test;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 163 */
+            if (ret < 0) return ret;
+        }
+        z->lb = m3;
+    }
+    {   int m3; /* setlimit, line 165 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[1]) return 0;
+        z->c = z->I[1]; /* tomark, line 165 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 165 */
+        among_var = find_among_b(z, a_9, 2); /* substring, line 165 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 165 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* not, line 167 */
+                if (!(eq_s_b(z, 2, s_14))) goto lab0;
+                return 0;
+            lab0:
+                z->c = z->l - m;
+            }
+            break;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 170 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_tidy(struct SN_env * z) {
+    {   int m3; /* setlimit, line 173 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 173 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        {   int m = z->l - z->c; (void) m; /* do, line 174 */
+            {   int m = z->l - z->c; (void) m; /* and, line 174 */
+                {   int ret = r_LONG(z);
+                    if (ret == 0) goto lab0; /* call LONG, line 174 */
+                    if (ret < 0) return ret;
+                }
+                z->c = z->l - m;
+                z->ket = z->c; /* [, line 174 */
+                if (z->c <= z->lb) goto lab0;
+                z->c--; /* next, line 174 */
+                z->bra = z->c; /* ], line 174 */
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 174 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab0:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* do, line 175 */
+            z->ket = z->c; /* [, line 175 */
+            if (!(in_grouping_b(z, g_AEI, 97, 228))) goto lab1;
+            z->bra = z->c; /* ], line 175 */
+            if (!(out_grouping_b(z, g_V1, 97, 246))) goto lab1;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 175 */
+                if (ret < 0) return ret;
+            }
+        lab1:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* do, line 176 */
+            z->ket = z->c; /* [, line 176 */
+            if (!(eq_s_b(z, 1, s_15))) goto lab2;
+            z->bra = z->c; /* ], line 176 */
+            {   int m = z->l - z->c; (void) m; /* or, line 176 */
+                if (!(eq_s_b(z, 1, s_16))) goto lab4;
+                goto lab3;
+            lab4:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_17))) goto lab2;
+            }
+        lab3:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 176 */
+                if (ret < 0) return ret;
+            }
+        lab2:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* do, line 177 */
+            z->ket = z->c; /* [, line 177 */
+            if (!(eq_s_b(z, 1, s_18))) goto lab5;
+            z->bra = z->c; /* ], line 177 */
+            if (!(eq_s_b(z, 1, s_19))) goto lab5;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 177 */
+                if (ret < 0) return ret;
+            }
+        lab5:
+            z->c = z->l - m;
+        }
+        z->lb = m3;
+    }
+    while(1) { /* goto, line 179 */
+        int m = z->l - z->c; (void) m;
+        if (!(out_grouping_b(z, g_V1, 97, 246))) goto lab6;
+        z->c = z->l - m;
+        break;
+    lab6:
+        z->c = z->l - m;
+        if (z->c <= z->lb) return 0;
+        z->c--; /* goto, line 179 */
+    }
+    z->ket = z->c; /* [, line 179 */
+    if (z->c <= z->lb) return 0;
+    z->c--; /* next, line 179 */
+    z->bra = z->c; /* ], line 179 */
+    z->S[0] = slice_to(z, z->S[0]); /* -> x, line 179 */
+    if (z->S[0] == 0) return -1; /* -> x, line 179 */
+    if (!(eq_v_b(z, z->S[0]))) return 0; /* name x, line 179 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 179 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+extern int finnish_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 185 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 185 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->B[0] = 0; /* unset ending_removed, line 186 */
+    z->lb = z->c; z->c = z->l; /* backwards, line 187 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 188 */
+        {   int ret = r_particle_etc(z);
+            if (ret == 0) goto lab1; /* call particle_etc, line 188 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 189 */
+        {   int ret = r_possessive(z);
+            if (ret == 0) goto lab2; /* call possessive, line 189 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 190 */
+        {   int ret = r_case_ending(z);
+            if (ret == 0) goto lab3; /* call case_ending, line 190 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 191 */
+        {   int ret = r_other_endings(z);
+            if (ret == 0) goto lab4; /* call other_endings, line 191 */
+            if (ret < 0) return ret;
+        }
+    lab4:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* or, line 192 */
+        if (!(z->B[0])) goto lab6; /* Boolean test ending_removed, line 192 */
+        {   int m = z->l - z->c; (void) m; /* do, line 192 */
+            {   int ret = r_i_plural(z);
+                if (ret == 0) goto lab7; /* call i_plural, line 192 */
+                if (ret < 0) return ret;
+            }
+        lab7:
+            z->c = z->l - m;
+        }
+        goto lab5;
+    lab6:
+        z->c = z->l - m;
+        {   int m = z->l - z->c; (void) m; /* do, line 192 */
+            {   int ret = r_t_plural(z);
+                if (ret == 0) goto lab8; /* call t_plural, line 192 */
+                if (ret < 0) return ret;
+            }
+        lab8:
+            z->c = z->l - m;
+        }
+    }
+lab5:
+    {   int m = z->l - z->c; (void) m; /* do, line 193 */
+        {   int ret = r_tidy(z);
+            if (ret == 0) goto lab9; /* call tidy, line 193 */
+            if (ret < 0) return ret;
+        }
+    lab9:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * finnish_ISO_8859_1_create_env(void) { return SN_create_env(1, 2, 1); }
+
+extern void finnish_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_finnish.h b/libstemmer_c/src_c/stem_ISO_8859_1_finnish.h
new file mode 100644
index 0000000..c67b67b
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_finnish.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * finnish_ISO_8859_1_create_env(void);
+extern void finnish_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int finnish_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_french.c b/libstemmer_c/src_c/stem_ISO_8859_1_french.c
new file mode 100644
index 0000000..e4eb80d
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_french.c
@@ -0,0 +1,1276 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int french_ISO_8859_1_stem(struct SN_env * z);
+static int r_un_accent(struct SN_env * z);
+static int r_un_double(struct SN_env * z);
+static int r_residual_suffix(struct SN_env * z);
+static int r_verb_suffix(struct SN_env * z);
+static int r_i_verb_suffix(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_RV(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * french_ISO_8859_1_create_env(void);
+extern void french_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_1[1] = { 'I' };
+static symbol s_0_2[1] = { 'U' };
+static symbol s_0_3[1] = { 'Y' };
+
+static struct among a_0[4] =
+{
+/*  0 */ { 0, 0, -1, 4, 0},
+/*  1 */ { 1, s_0_1, 0, 1, 0},
+/*  2 */ { 1, s_0_2, 0, 2, 0},
+/*  3 */ { 1, s_0_3, 0, 3, 0}
+};
+
+static symbol s_1_0[3] = { 'i', 'q', 'U' };
+static symbol s_1_1[3] = { 'a', 'b', 'l' };
+static symbol s_1_2[3] = { 'I', 0xE8, 'r' };
+static symbol s_1_3[3] = { 'i', 0xE8, 'r' };
+static symbol s_1_4[3] = { 'e', 'u', 's' };
+static symbol s_1_5[2] = { 'i', 'v' };
+
+static struct among a_1[6] =
+{
+/*  0 */ { 3, s_1_0, -1, 3, 0},
+/*  1 */ { 3, s_1_1, -1, 3, 0},
+/*  2 */ { 3, s_1_2, -1, 4, 0},
+/*  3 */ { 3, s_1_3, -1, 4, 0},
+/*  4 */ { 3, s_1_4, -1, 2, 0},
+/*  5 */ { 2, s_1_5, -1, 1, 0}
+};
+
+static symbol s_2_0[2] = { 'i', 'c' };
+static symbol s_2_1[4] = { 'a', 'b', 'i', 'l' };
+static symbol s_2_2[2] = { 'i', 'v' };
+
+static struct among a_2[3] =
+{
+/*  0 */ { 2, s_2_0, -1, 2, 0},
+/*  1 */ { 4, s_2_1, -1, 1, 0},
+/*  2 */ { 2, s_2_2, -1, 3, 0}
+};
+
+static symbol s_3_0[4] = { 'i', 'q', 'U', 'e' };
+static symbol s_3_1[6] = { 'a', 't', 'r', 'i', 'c', 'e' };
+static symbol s_3_2[4] = { 'a', 'n', 'c', 'e' };
+static symbol s_3_3[4] = { 'e', 'n', 'c', 'e' };
+static symbol s_3_4[5] = { 'l', 'o', 'g', 'i', 'e' };
+static symbol s_3_5[4] = { 'a', 'b', 'l', 'e' };
+static symbol s_3_6[4] = { 'i', 's', 'm', 'e' };
+static symbol s_3_7[4] = { 'e', 'u', 's', 'e' };
+static symbol s_3_8[4] = { 'i', 's', 't', 'e' };
+static symbol s_3_9[3] = { 'i', 'v', 'e' };
+static symbol s_3_10[2] = { 'i', 'f' };
+static symbol s_3_11[5] = { 'u', 's', 'i', 'o', 'n' };
+static symbol s_3_12[5] = { 'a', 't', 'i', 'o', 'n' };
+static symbol s_3_13[5] = { 'u', 't', 'i', 'o', 'n' };
+static symbol s_3_14[5] = { 'a', 't', 'e', 'u', 'r' };
+static symbol s_3_15[5] = { 'i', 'q', 'U', 'e', 's' };
+static symbol s_3_16[7] = { 'a', 't', 'r', 'i', 'c', 'e', 's' };
+static symbol s_3_17[5] = { 'a', 'n', 'c', 'e', 's' };
+static symbol s_3_18[5] = { 'e', 'n', 'c', 'e', 's' };
+static symbol s_3_19[6] = { 'l', 'o', 'g', 'i', 'e', 's' };
+static symbol s_3_20[5] = { 'a', 'b', 'l', 'e', 's' };
+static symbol s_3_21[5] = { 'i', 's', 'm', 'e', 's' };
+static symbol s_3_22[5] = { 'e', 'u', 's', 'e', 's' };
+static symbol s_3_23[5] = { 'i', 's', 't', 'e', 's' };
+static symbol s_3_24[4] = { 'i', 'v', 'e', 's' };
+static symbol s_3_25[3] = { 'i', 'f', 's' };
+static symbol s_3_26[6] = { 'u', 's', 'i', 'o', 'n', 's' };
+static symbol s_3_27[6] = { 'a', 't', 'i', 'o', 'n', 's' };
+static symbol s_3_28[6] = { 'u', 't', 'i', 'o', 'n', 's' };
+static symbol s_3_29[6] = { 'a', 't', 'e', 'u', 'r', 's' };
+static symbol s_3_30[5] = { 'm', 'e', 'n', 't', 's' };
+static symbol s_3_31[6] = { 'e', 'm', 'e', 'n', 't', 's' };
+static symbol s_3_32[9] = { 'i', 's', 's', 'e', 'm', 'e', 'n', 't', 's' };
+static symbol s_3_33[4] = { 'i', 't', 0xE9, 's' };
+static symbol s_3_34[4] = { 'm', 'e', 'n', 't' };
+static symbol s_3_35[5] = { 'e', 'm', 'e', 'n', 't' };
+static symbol s_3_36[8] = { 'i', 's', 's', 'e', 'm', 'e', 'n', 't' };
+static symbol s_3_37[6] = { 'a', 'm', 'm', 'e', 'n', 't' };
+static symbol s_3_38[6] = { 'e', 'm', 'm', 'e', 'n', 't' };
+static symbol s_3_39[3] = { 'a', 'u', 'x' };
+static symbol s_3_40[4] = { 'e', 'a', 'u', 'x' };
+static symbol s_3_41[3] = { 'e', 'u', 'x' };
+static symbol s_3_42[3] = { 'i', 't', 0xE9 };
+
+static struct among a_3[43] =
+{
+/*  0 */ { 4, s_3_0, -1, 1, 0},
+/*  1 */ { 6, s_3_1, -1, 2, 0},
+/*  2 */ { 4, s_3_2, -1, 1, 0},
+/*  3 */ { 4, s_3_3, -1, 5, 0},
+/*  4 */ { 5, s_3_4, -1, 3, 0},
+/*  5 */ { 4, s_3_5, -1, 1, 0},
+/*  6 */ { 4, s_3_6, -1, 1, 0},
+/*  7 */ { 4, s_3_7, -1, 11, 0},
+/*  8 */ { 4, s_3_8, -1, 1, 0},
+/*  9 */ { 3, s_3_9, -1, 8, 0},
+/* 10 */ { 2, s_3_10, -1, 8, 0},
+/* 11 */ { 5, s_3_11, -1, 4, 0},
+/* 12 */ { 5, s_3_12, -1, 2, 0},
+/* 13 */ { 5, s_3_13, -1, 4, 0},
+/* 14 */ { 5, s_3_14, -1, 2, 0},
+/* 15 */ { 5, s_3_15, -1, 1, 0},
+/* 16 */ { 7, s_3_16, -1, 2, 0},
+/* 17 */ { 5, s_3_17, -1, 1, 0},
+/* 18 */ { 5, s_3_18, -1, 5, 0},
+/* 19 */ { 6, s_3_19, -1, 3, 0},
+/* 20 */ { 5, s_3_20, -1, 1, 0},
+/* 21 */ { 5, s_3_21, -1, 1, 0},
+/* 22 */ { 5, s_3_22, -1, 11, 0},
+/* 23 */ { 5, s_3_23, -1, 1, 0},
+/* 24 */ { 4, s_3_24, -1, 8, 0},
+/* 25 */ { 3, s_3_25, -1, 8, 0},
+/* 26 */ { 6, s_3_26, -1, 4, 0},
+/* 27 */ { 6, s_3_27, -1, 2, 0},
+/* 28 */ { 6, s_3_28, -1, 4, 0},
+/* 29 */ { 6, s_3_29, -1, 2, 0},
+/* 30 */ { 5, s_3_30, -1, 15, 0},
+/* 31 */ { 6, s_3_31, 30, 6, 0},
+/* 32 */ { 9, s_3_32, 31, 12, 0},
+/* 33 */ { 4, s_3_33, -1, 7, 0},
+/* 34 */ { 4, s_3_34, -1, 15, 0},
+/* 35 */ { 5, s_3_35, 34, 6, 0},
+/* 36 */ { 8, s_3_36, 35, 12, 0},
+/* 37 */ { 6, s_3_37, 34, 13, 0},
+/* 38 */ { 6, s_3_38, 34, 14, 0},
+/* 39 */ { 3, s_3_39, -1, 10, 0},
+/* 40 */ { 4, s_3_40, 39, 9, 0},
+/* 41 */ { 3, s_3_41, -1, 1, 0},
+/* 42 */ { 3, s_3_42, -1, 7, 0}
+};
+
+static symbol s_4_0[3] = { 'i', 'r', 'a' };
+static symbol s_4_1[2] = { 'i', 'e' };
+static symbol s_4_2[4] = { 'i', 's', 's', 'e' };
+static symbol s_4_3[7] = { 'i', 's', 's', 'a', 'n', 't', 'e' };
+static symbol s_4_4[1] = { 'i' };
+static symbol s_4_5[4] = { 'i', 'r', 'a', 'i' };
+static symbol s_4_6[2] = { 'i', 'r' };
+static symbol s_4_7[4] = { 'i', 'r', 'a', 's' };
+static symbol s_4_8[3] = { 'i', 'e', 's' };
+static symbol s_4_9[4] = { 0xEE, 'm', 'e', 's' };
+static symbol s_4_10[5] = { 'i', 's', 's', 'e', 's' };
+static symbol s_4_11[8] = { 'i', 's', 's', 'a', 'n', 't', 'e', 's' };
+static symbol s_4_12[4] = { 0xEE, 't', 'e', 's' };
+static symbol s_4_13[2] = { 'i', 's' };
+static symbol s_4_14[5] = { 'i', 'r', 'a', 'i', 's' };
+static symbol s_4_15[6] = { 'i', 's', 's', 'a', 'i', 's' };
+static symbol s_4_16[6] = { 'i', 'r', 'i', 'o', 'n', 's' };
+static symbol s_4_17[7] = { 'i', 's', 's', 'i', 'o', 'n', 's' };
+static symbol s_4_18[5] = { 'i', 'r', 'o', 'n', 's' };
+static symbol s_4_19[6] = { 'i', 's', 's', 'o', 'n', 's' };
+static symbol s_4_20[7] = { 'i', 's', 's', 'a', 'n', 't', 's' };
+static symbol s_4_21[2] = { 'i', 't' };
+static symbol s_4_22[5] = { 'i', 'r', 'a', 'i', 't' };
+static symbol s_4_23[6] = { 'i', 's', 's', 'a', 'i', 't' };
+static symbol s_4_24[6] = { 'i', 's', 's', 'a', 'n', 't' };
+static symbol s_4_25[7] = { 'i', 'r', 'a', 'I', 'e', 'n', 't' };
+static symbol s_4_26[8] = { 'i', 's', 's', 'a', 'I', 'e', 'n', 't' };
+static symbol s_4_27[5] = { 'i', 'r', 'e', 'n', 't' };
+static symbol s_4_28[6] = { 'i', 's', 's', 'e', 'n', 't' };
+static symbol s_4_29[5] = { 'i', 'r', 'o', 'n', 't' };
+static symbol s_4_30[2] = { 0xEE, 't' };
+static symbol s_4_31[5] = { 'i', 'r', 'i', 'e', 'z' };
+static symbol s_4_32[6] = { 'i', 's', 's', 'i', 'e', 'z' };
+static symbol s_4_33[4] = { 'i', 'r', 'e', 'z' };
+static symbol s_4_34[5] = { 'i', 's', 's', 'e', 'z' };
+
+static struct among a_4[35] =
+{
+/*  0 */ { 3, s_4_0, -1, 1, 0},
+/*  1 */ { 2, s_4_1, -1, 1, 0},
+/*  2 */ { 4, s_4_2, -1, 1, 0},
+/*  3 */ { 7, s_4_3, -1, 1, 0},
+/*  4 */ { 1, s_4_4, -1, 1, 0},
+/*  5 */ { 4, s_4_5, 4, 1, 0},
+/*  6 */ { 2, s_4_6, -1, 1, 0},
+/*  7 */ { 4, s_4_7, -1, 1, 0},
+/*  8 */ { 3, s_4_8, -1, 1, 0},
+/*  9 */ { 4, s_4_9, -1, 1, 0},
+/* 10 */ { 5, s_4_10, -1, 1, 0},
+/* 11 */ { 8, s_4_11, -1, 1, 0},
+/* 12 */ { 4, s_4_12, -1, 1, 0},
+/* 13 */ { 2, s_4_13, -1, 1, 0},
+/* 14 */ { 5, s_4_14, 13, 1, 0},
+/* 15 */ { 6, s_4_15, 13, 1, 0},
+/* 16 */ { 6, s_4_16, -1, 1, 0},
+/* 17 */ { 7, s_4_17, -1, 1, 0},
+/* 18 */ { 5, s_4_18, -1, 1, 0},
+/* 19 */ { 6, s_4_19, -1, 1, 0},
+/* 20 */ { 7, s_4_20, -1, 1, 0},
+/* 21 */ { 2, s_4_21, -1, 1, 0},
+/* 22 */ { 5, s_4_22, 21, 1, 0},
+/* 23 */ { 6, s_4_23, 21, 1, 0},
+/* 24 */ { 6, s_4_24, -1, 1, 0},
+/* 25 */ { 7, s_4_25, -1, 1, 0},
+/* 26 */ { 8, s_4_26, -1, 1, 0},
+/* 27 */ { 5, s_4_27, -1, 1, 0},
+/* 28 */ { 6, s_4_28, -1, 1, 0},
+/* 29 */ { 5, s_4_29, -1, 1, 0},
+/* 30 */ { 2, s_4_30, -1, 1, 0},
+/* 31 */ { 5, s_4_31, -1, 1, 0},
+/* 32 */ { 6, s_4_32, -1, 1, 0},
+/* 33 */ { 4, s_4_33, -1, 1, 0},
+/* 34 */ { 5, s_4_34, -1, 1, 0}
+};
+
+static symbol s_5_0[1] = { 'a' };
+static symbol s_5_1[3] = { 'e', 'r', 'a' };
+static symbol s_5_2[4] = { 'a', 's', 's', 'e' };
+static symbol s_5_3[4] = { 'a', 'n', 't', 'e' };
+static symbol s_5_4[2] = { 0xE9, 'e' };
+static symbol s_5_5[2] = { 'a', 'i' };
+static symbol s_5_6[4] = { 'e', 'r', 'a', 'i' };
+static symbol s_5_7[2] = { 'e', 'r' };
+static symbol s_5_8[2] = { 'a', 's' };
+static symbol s_5_9[4] = { 'e', 'r', 'a', 's' };
+static symbol s_5_10[4] = { 0xE2, 'm', 'e', 's' };
+static symbol s_5_11[5] = { 'a', 's', 's', 'e', 's' };
+static symbol s_5_12[5] = { 'a', 'n', 't', 'e', 's' };
+static symbol s_5_13[4] = { 0xE2, 't', 'e', 's' };
+static symbol s_5_14[3] = { 0xE9, 'e', 's' };
+static symbol s_5_15[3] = { 'a', 'i', 's' };
+static symbol s_5_16[5] = { 'e', 'r', 'a', 'i', 's' };
+static symbol s_5_17[4] = { 'i', 'o', 'n', 's' };
+static symbol s_5_18[6] = { 'e', 'r', 'i', 'o', 'n', 's' };
+static symbol s_5_19[7] = { 'a', 's', 's', 'i', 'o', 'n', 's' };
+static symbol s_5_20[5] = { 'e', 'r', 'o', 'n', 's' };
+static symbol s_5_21[4] = { 'a', 'n', 't', 's' };
+static symbol s_5_22[2] = { 0xE9, 's' };
+static symbol s_5_23[3] = { 'a', 'i', 't' };
+static symbol s_5_24[5] = { 'e', 'r', 'a', 'i', 't' };
+static symbol s_5_25[3] = { 'a', 'n', 't' };
+static symbol s_5_26[5] = { 'a', 'I', 'e', 'n', 't' };
+static symbol s_5_27[7] = { 'e', 'r', 'a', 'I', 'e', 'n', 't' };
+static symbol s_5_28[5] = { 0xE8, 'r', 'e', 'n', 't' };
+static symbol s_5_29[6] = { 'a', 's', 's', 'e', 'n', 't' };
+static symbol s_5_30[5] = { 'e', 'r', 'o', 'n', 't' };
+static symbol s_5_31[2] = { 0xE2, 't' };
+static symbol s_5_32[2] = { 'e', 'z' };
+static symbol s_5_33[3] = { 'i', 'e', 'z' };
+static symbol s_5_34[5] = { 'e', 'r', 'i', 'e', 'z' };
+static symbol s_5_35[6] = { 'a', 's', 's', 'i', 'e', 'z' };
+static symbol s_5_36[4] = { 'e', 'r', 'e', 'z' };
+static symbol s_5_37[1] = { 0xE9 };
+
+static struct among a_5[38] =
+{
+/*  0 */ { 1, s_5_0, -1, 3, 0},
+/*  1 */ { 3, s_5_1, 0, 2, 0},
+/*  2 */ { 4, s_5_2, -1, 3, 0},
+/*  3 */ { 4, s_5_3, -1, 3, 0},
+/*  4 */ { 2, s_5_4, -1, 2, 0},
+/*  5 */ { 2, s_5_5, -1, 3, 0},
+/*  6 */ { 4, s_5_6, 5, 2, 0},
+/*  7 */ { 2, s_5_7, -1, 2, 0},
+/*  8 */ { 2, s_5_8, -1, 3, 0},
+/*  9 */ { 4, s_5_9, 8, 2, 0},
+/* 10 */ { 4, s_5_10, -1, 3, 0},
+/* 11 */ { 5, s_5_11, -1, 3, 0},
+/* 12 */ { 5, s_5_12, -1, 3, 0},
+/* 13 */ { 4, s_5_13, -1, 3, 0},
+/* 14 */ { 3, s_5_14, -1, 2, 0},
+/* 15 */ { 3, s_5_15, -1, 3, 0},
+/* 16 */ { 5, s_5_16, 15, 2, 0},
+/* 17 */ { 4, s_5_17, -1, 1, 0},
+/* 18 */ { 6, s_5_18, 17, 2, 0},
+/* 19 */ { 7, s_5_19, 17, 3, 0},
+/* 20 */ { 5, s_5_20, -1, 2, 0},
+/* 21 */ { 4, s_5_21, -1, 3, 0},
+/* 22 */ { 2, s_5_22, -1, 2, 0},
+/* 23 */ { 3, s_5_23, -1, 3, 0},
+/* 24 */ { 5, s_5_24, 23, 2, 0},
+/* 25 */ { 3, s_5_25, -1, 3, 0},
+/* 26 */ { 5, s_5_26, -1, 3, 0},
+/* 27 */ { 7, s_5_27, 26, 2, 0},
+/* 28 */ { 5, s_5_28, -1, 2, 0},
+/* 29 */ { 6, s_5_29, -1, 3, 0},
+/* 30 */ { 5, s_5_30, -1, 2, 0},
+/* 31 */ { 2, s_5_31, -1, 3, 0},
+/* 32 */ { 2, s_5_32, -1, 2, 0},
+/* 33 */ { 3, s_5_33, 32, 2, 0},
+/* 34 */ { 5, s_5_34, 33, 2, 0},
+/* 35 */ { 6, s_5_35, 33, 3, 0},
+/* 36 */ { 4, s_5_36, 32, 2, 0},
+/* 37 */ { 1, s_5_37, -1, 2, 0}
+};
+
+static symbol s_6_0[1] = { 'e' };
+static symbol s_6_1[4] = { 'I', 0xE8, 'r', 'e' };
+static symbol s_6_2[4] = { 'i', 0xE8, 'r', 'e' };
+static symbol s_6_3[3] = { 'i', 'o', 'n' };
+static symbol s_6_4[3] = { 'I', 'e', 'r' };
+static symbol s_6_5[3] = { 'i', 'e', 'r' };
+static symbol s_6_6[1] = { 0xEB };
+
+static struct among a_6[7] =
+{
+/*  0 */ { 1, s_6_0, -1, 3, 0},
+/*  1 */ { 4, s_6_1, 0, 2, 0},
+/*  2 */ { 4, s_6_2, 0, 2, 0},
+/*  3 */ { 3, s_6_3, -1, 1, 0},
+/*  4 */ { 3, s_6_4, -1, 2, 0},
+/*  5 */ { 3, s_6_5, -1, 2, 0},
+/*  6 */ { 1, s_6_6, -1, 4, 0}
+};
+
+static symbol s_7_0[3] = { 'e', 'l', 'l' };
+static symbol s_7_1[4] = { 'e', 'i', 'l', 'l' };
+static symbol s_7_2[3] = { 'e', 'n', 'n' };
+static symbol s_7_3[3] = { 'o', 'n', 'n' };
+static symbol s_7_4[3] = { 'e', 't', 't' };
+
+static struct among a_7[5] =
+{
+/*  0 */ { 3, s_7_0, -1, -1, 0},
+/*  1 */ { 4, s_7_1, -1, -1, 0},
+/*  2 */ { 3, s_7_2, -1, -1, 0},
+/*  3 */ { 3, s_7_3, -1, -1, 0},
+/*  4 */ { 3, s_7_4, -1, -1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 130, 103, 8, 5 };
+
+static unsigned char g_keep_with_s[] = { 1, 65, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
+
+static symbol s_0[] = { 'u' };
+static symbol s_1[] = { 'U' };
+static symbol s_2[] = { 'i' };
+static symbol s_3[] = { 'I' };
+static symbol s_4[] = { 'y' };
+static symbol s_5[] = { 'Y' };
+static symbol s_6[] = { 'y' };
+static symbol s_7[] = { 'Y' };
+static symbol s_8[] = { 'q' };
+static symbol s_9[] = { 'u' };
+static symbol s_10[] = { 'U' };
+static symbol s_11[] = { 'i' };
+static symbol s_12[] = { 'u' };
+static symbol s_13[] = { 'y' };
+static symbol s_14[] = { 'i', 'c' };
+static symbol s_15[] = { 'i', 'q', 'U' };
+static symbol s_16[] = { 'l', 'o', 'g' };
+static symbol s_17[] = { 'u' };
+static symbol s_18[] = { 'e', 'n', 't' };
+static symbol s_19[] = { 'a', 't' };
+static symbol s_20[] = { 'e', 'u', 'x' };
+static symbol s_21[] = { 'i' };
+static symbol s_22[] = { 'a', 'b', 'l' };
+static symbol s_23[] = { 'i', 'q', 'U' };
+static symbol s_24[] = { 'a', 't' };
+static symbol s_25[] = { 'i', 'c' };
+static symbol s_26[] = { 'i', 'q', 'U' };
+static symbol s_27[] = { 'e', 'a', 'u' };
+static symbol s_28[] = { 'a', 'l' };
+static symbol s_29[] = { 'e', 'u', 'x' };
+static symbol s_30[] = { 'a', 'n', 't' };
+static symbol s_31[] = { 'e', 'n', 't' };
+static symbol s_32[] = { 'e' };
+static symbol s_33[] = { 's' };
+static symbol s_34[] = { 's' };
+static symbol s_35[] = { 't' };
+static symbol s_36[] = { 'i' };
+static symbol s_37[] = { 'g', 'u' };
+static symbol s_38[] = { 0xE9 };
+static symbol s_39[] = { 0xE8 };
+static symbol s_40[] = { 'e' };
+static symbol s_41[] = { 'Y' };
+static symbol s_42[] = { 'i' };
+static symbol s_43[] = { 0xE7 };
+static symbol s_44[] = { 'c' };
+
+static int r_prelude(struct SN_env * z) {
+    while(1) { /* repeat, line 38 */
+        int c = z->c;
+        while(1) { /* goto, line 38 */
+            int c = z->c;
+            {   int c = z->c; /* or, line 44 */
+                if (!(in_grouping(z, g_v, 97, 251))) goto lab3;
+                z->bra = z->c; /* [, line 40 */
+                {   int c = z->c; /* or, line 40 */
+                    if (!(eq_s(z, 1, s_0))) goto lab5;
+                    z->ket = z->c; /* ], line 40 */
+                    if (!(in_grouping(z, g_v, 97, 251))) goto lab5;
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_1); /* <-, line 40 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab4;
+                lab5:
+                    z->c = c;
+                    if (!(eq_s(z, 1, s_2))) goto lab6;
+                    z->ket = z->c; /* ], line 41 */
+                    if (!(in_grouping(z, g_v, 97, 251))) goto lab6;
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_3); /* <-, line 41 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab4;
+                lab6:
+                    z->c = c;
+                    if (!(eq_s(z, 1, s_4))) goto lab3;
+                    z->ket = z->c; /* ], line 42 */
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_5); /* <-, line 42 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab4:
+                goto lab2;
+            lab3:
+                z->c = c;
+                z->bra = z->c; /* [, line 45 */
+                if (!(eq_s(z, 1, s_6))) goto lab7;
+                z->ket = z->c; /* ], line 45 */
+                if (!(in_grouping(z, g_v, 97, 251))) goto lab7;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_7); /* <-, line 45 */
+                    if (ret < 0) return ret;
+                }
+                goto lab2;
+            lab7:
+                z->c = c;
+                if (!(eq_s(z, 1, s_8))) goto lab1;
+                z->bra = z->c; /* [, line 47 */
+                if (!(eq_s(z, 1, s_9))) goto lab1;
+                z->ket = z->c; /* ], line 47 */
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_10); /* <-, line 47 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab2:
+            z->c = c;
+            break;
+        lab1:
+            z->c = c;
+            if (z->c >= z->l) goto lab0;
+            z->c++; /* goto, line 38 */
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    z->I[2] = z->l;
+    {   int c = z->c; /* do, line 56 */
+        {   int c = z->c; /* or, line 57 */
+            if (!(in_grouping(z, g_v, 97, 251))) goto lab2;
+            if (!(in_grouping(z, g_v, 97, 251))) goto lab2;
+            if (z->c >= z->l) goto lab2;
+            z->c++; /* next, line 57 */
+            goto lab1;
+        lab2:
+            z->c = c;
+            if (z->c >= z->l) goto lab0;
+            z->c++; /* next, line 57 */
+            while(1) { /* gopast, line 57 */
+                if (!(in_grouping(z, g_v, 97, 251))) goto lab3;
+                break;
+            lab3:
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* gopast, line 57 */
+            }
+        }
+    lab1:
+        z->I[0] = z->c; /* setmark pV, line 58 */
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 60 */
+        while(1) { /* gopast, line 61 */
+            if (!(in_grouping(z, g_v, 97, 251))) goto lab5;
+            break;
+        lab5:
+            if (z->c >= z->l) goto lab4;
+            z->c++; /* gopast, line 61 */
+        }
+        while(1) { /* gopast, line 61 */
+            if (!(out_grouping(z, g_v, 97, 251))) goto lab6;
+            break;
+        lab6:
+            if (z->c >= z->l) goto lab4;
+            z->c++; /* gopast, line 61 */
+        }
+        z->I[1] = z->c; /* setmark p1, line 61 */
+        while(1) { /* gopast, line 62 */
+            if (!(in_grouping(z, g_v, 97, 251))) goto lab7;
+            break;
+        lab7:
+            if (z->c >= z->l) goto lab4;
+            z->c++; /* gopast, line 62 */
+        }
+        while(1) { /* gopast, line 62 */
+            if (!(out_grouping(z, g_v, 97, 251))) goto lab8;
+            break;
+        lab8:
+            if (z->c >= z->l) goto lab4;
+            z->c++; /* gopast, line 62 */
+        }
+        z->I[2] = z->c; /* setmark p2, line 62 */
+    lab4:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 66 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 68 */
+        among_var = find_among(z, a_0, 4); /* substring, line 68 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 68 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_11); /* <-, line 69 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_12); /* <-, line 70 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_13); /* <-, line 71 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 4:
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 72 */
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_RV(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[2] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 83 */
+    among_var = find_among_b(z, a_3, 43); /* substring, line 83 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 83 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 87 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 87 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 90 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 90 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 91 */
+                z->ket = z->c; /* [, line 91 */
+                if (!(eq_s_b(z, 2, s_14))) { z->c = z->l - m; goto lab0; }
+                z->bra = z->c; /* ], line 91 */
+                {   int m = z->l - z->c; (void) m; /* or, line 91 */
+                    {   int ret = r_R2(z);
+                        if (ret == 0) goto lab2; /* call R2, line 91 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 91 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab1;
+                lab2:
+                    z->c = z->l - m;
+                    {   int ret;
+                        ret = slice_from_s(z, 3, s_15); /* <-, line 91 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab1:
+            lab0:
+                ;
+            }
+            break;
+        case 3:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 95 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_16); /* <-, line 95 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 98 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_17); /* <-, line 98 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 101 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_18); /* <-, line 101 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 105 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 105 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 106 */
+                z->ket = z->c; /* [, line 107 */
+                among_var = find_among_b(z, a_1, 6); /* substring, line 107 */
+                if (!(among_var)) { z->c = z->l - m; goto lab3; }
+                z->bra = z->c; /* ], line 107 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab3; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 108 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 108 */
+                            if (ret < 0) return ret;
+                        }
+                        z->ket = z->c; /* [, line 108 */
+                        if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m; goto lab3; }
+                        z->bra = z->c; /* ], line 108 */
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 108 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 108 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                    case 2:
+                        {   int m = z->l - z->c; (void) m; /* or, line 109 */
+                            {   int ret = r_R2(z);
+                                if (ret == 0) goto lab5; /* call R2, line 109 */
+                                if (ret < 0) return ret;
+                            }
+                            {   int ret;
+                                ret = slice_del(z); /* delete, line 109 */
+                                if (ret < 0) return ret;
+                            }
+                            goto lab4;
+                        lab5:
+                            z->c = z->l - m;
+                            {   int ret = r_R1(z);
+                                if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R1, line 109 */
+                                if (ret < 0) return ret;
+                            }
+                            {   int ret;
+                                ret = slice_from_s(z, 3, s_20); /* <-, line 109 */
+                                if (ret < 0) return ret;
+                            }
+                        }
+                    lab4:
+                        break;
+                    case 3:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 111 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 111 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                    case 4:
+                        {   int ret = r_RV(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab3; } /* call RV, line 113 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_from_s(z, 1, s_21); /* <-, line 113 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab3:
+                ;
+            }
+            break;
+        case 7:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 120 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 120 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 121 */
+                z->ket = z->c; /* [, line 122 */
+                among_var = find_among_b(z, a_2, 3); /* substring, line 122 */
+                if (!(among_var)) { z->c = z->l - m; goto lab6; }
+                z->bra = z->c; /* ], line 122 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab6; }
+                    case 1:
+                        {   int m = z->l - z->c; (void) m; /* or, line 123 */
+                            {   int ret = r_R2(z);
+                                if (ret == 0) goto lab8; /* call R2, line 123 */
+                                if (ret < 0) return ret;
+                            }
+                            {   int ret;
+                                ret = slice_del(z); /* delete, line 123 */
+                                if (ret < 0) return ret;
+                            }
+                            goto lab7;
+                        lab8:
+                            z->c = z->l - m;
+                            {   int ret;
+                                ret = slice_from_s(z, 3, s_22); /* <-, line 123 */
+                                if (ret < 0) return ret;
+                            }
+                        }
+                    lab7:
+                        break;
+                    case 2:
+                        {   int m = z->l - z->c; (void) m; /* or, line 124 */
+                            {   int ret = r_R2(z);
+                                if (ret == 0) goto lab10; /* call R2, line 124 */
+                                if (ret < 0) return ret;
+                            }
+                            {   int ret;
+                                ret = slice_del(z); /* delete, line 124 */
+                                if (ret < 0) return ret;
+                            }
+                            goto lab9;
+                        lab10:
+                            z->c = z->l - m;
+                            {   int ret;
+                                ret = slice_from_s(z, 3, s_23); /* <-, line 124 */
+                                if (ret < 0) return ret;
+                            }
+                        }
+                    lab9:
+                        break;
+                    case 3:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab6; } /* call R2, line 125 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 125 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab6:
+                ;
+            }
+            break;
+        case 8:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 132 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 132 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 133 */
+                z->ket = z->c; /* [, line 133 */
+                if (!(eq_s_b(z, 2, s_24))) { z->c = z->l - m; goto lab11; }
+                z->bra = z->c; /* ], line 133 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab11; } /* call R2, line 133 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 133 */
+                    if (ret < 0) return ret;
+                }
+                z->ket = z->c; /* [, line 133 */
+                if (!(eq_s_b(z, 2, s_25))) { z->c = z->l - m; goto lab11; }
+                z->bra = z->c; /* ], line 133 */
+                {   int m = z->l - z->c; (void) m; /* or, line 133 */
+                    {   int ret = r_R2(z);
+                        if (ret == 0) goto lab13; /* call R2, line 133 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 133 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab12;
+                lab13:
+                    z->c = z->l - m;
+                    {   int ret;
+                        ret = slice_from_s(z, 3, s_26); /* <-, line 133 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab12:
+            lab11:
+                ;
+            }
+            break;
+        case 9:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_27); /* <-, line 135 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 10:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 136 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 2, s_28); /* <-, line 136 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 11:
+            {   int m = z->l - z->c; (void) m; /* or, line 138 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab15; /* call R2, line 138 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 138 */
+                    if (ret < 0) return ret;
+                }
+                goto lab14;
+            lab15:
+                z->c = z->l - m;
+                {   int ret = r_R1(z);
+                    if (ret == 0) return 0; /* call R1, line 138 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_from_s(z, 3, s_29); /* <-, line 138 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab14:
+            break;
+        case 12:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 141 */
+                if (ret < 0) return ret;
+            }
+            if (!(out_grouping_b(z, g_v, 97, 251))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 141 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 13:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 146 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_30); /* <-, line 146 */
+                if (ret < 0) return ret;
+            }
+            return 0; /* fail, line 146 */
+            break;
+        case 14:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 147 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_31); /* <-, line 147 */
+                if (ret < 0) return ret;
+            }
+            return 0; /* fail, line 147 */
+            break;
+        case 15:
+            {   int m_test = z->l - z->c; /* test, line 149 */
+                if (!(in_grouping_b(z, g_v, 97, 251))) return 0;
+                {   int ret = r_RV(z);
+                    if (ret == 0) return 0; /* call RV, line 149 */
+                    if (ret < 0) return ret;
+                }
+                z->c = z->l - m_test;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 149 */
+                if (ret < 0) return ret;
+            }
+            return 0; /* fail, line 149 */
+            break;
+    }
+    return 1;
+}
+
+static int r_i_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 154 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 154 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 155 */
+        among_var = find_among_b(z, a_4, 35); /* substring, line 155 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 155 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                if (!(out_grouping_b(z, g_v, 97, 251))) { z->lb = m3; return 0; }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 161 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 165 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 165 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 166 */
+        among_var = find_among_b(z, a_5, 38); /* substring, line 166 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 166 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->lb = m3; return 0; } /* call R2, line 168 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 168 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 176 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 181 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* try, line 182 */
+                    z->ket = z->c; /* [, line 182 */
+                    if (!(eq_s_b(z, 1, s_32))) { z->c = z->l - m; goto lab0; }
+                    z->bra = z->c; /* ], line 182 */
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 182 */
+                        if (ret < 0) return ret;
+                    }
+                lab0:
+                    ;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_residual_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m = z->l - z->c; (void) m; /* try, line 190 */
+        z->ket = z->c; /* [, line 190 */
+        if (!(eq_s_b(z, 1, s_33))) { z->c = z->l - m; goto lab0; }
+        z->bra = z->c; /* ], line 190 */
+        {   int m_test = z->l - z->c; /* test, line 190 */
+            if (!(out_grouping_b(z, g_keep_with_s, 97, 232))) { z->c = z->l - m; goto lab0; }
+            z->c = z->l - m_test;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 190 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        ;
+    }
+    {   int m3; /* setlimit, line 191 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 191 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 192 */
+        among_var = find_among_b(z, a_6, 7); /* substring, line 192 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 192 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->lb = m3; return 0; } /* call R2, line 193 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* or, line 193 */
+                    if (!(eq_s_b(z, 1, s_34))) goto lab2;
+                    goto lab1;
+                lab2:
+                    z->c = z->l - m;
+                    if (!(eq_s_b(z, 1, s_35))) { z->lb = m3; return 0; }
+                }
+            lab1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 193 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_36); /* <-, line 195 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 196 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 4:
+                if (!(eq_s_b(z, 2, s_37))) { z->lb = m3; return 0; }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 197 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_un_double(struct SN_env * z) {
+    {   int m_test = z->l - z->c; /* test, line 203 */
+        if (!(find_among_b(z, a_7, 5))) return 0; /* among, line 203 */
+        z->c = z->l - m_test;
+    }
+    z->ket = z->c; /* [, line 203 */
+    if (z->c <= z->lb) return 0;
+    z->c--; /* next, line 203 */
+    z->bra = z->c; /* ], line 203 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 203 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_un_accent(struct SN_env * z) {
+    {   int i = 1;
+        while(1) { /* atleast, line 207 */
+            if (!(out_grouping_b(z, g_v, 97, 251))) goto lab0;
+            i--;
+            continue;
+        lab0:
+            break;
+        }
+        if (i > 0) return 0;
+    }
+    z->ket = z->c; /* [, line 208 */
+    {   int m = z->l - z->c; (void) m; /* or, line 208 */
+        if (!(eq_s_b(z, 1, s_38))) goto lab2;
+        goto lab1;
+    lab2:
+        z->c = z->l - m;
+        if (!(eq_s_b(z, 1, s_39))) return 0;
+    }
+lab1:
+    z->bra = z->c; /* ], line 208 */
+    {   int ret;
+        ret = slice_from_s(z, 1, s_40); /* <-, line 208 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+extern int french_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 214 */
+        {   int ret = r_prelude(z);
+            if (ret == 0) goto lab0; /* call prelude, line 214 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 215 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab1; /* call mark_regions, line 215 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 216 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 218 */
+        {   int m = z->l - z->c; (void) m; /* or, line 228 */
+            {   int m = z->l - z->c; (void) m; /* and, line 224 */
+                {   int m = z->l - z->c; (void) m; /* or, line 220 */
+                    {   int ret = r_standard_suffix(z);
+                        if (ret == 0) goto lab6; /* call standard_suffix, line 220 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab6:
+                    z->c = z->l - m;
+                    {   int ret = r_i_verb_suffix(z);
+                        if (ret == 0) goto lab7; /* call i_verb_suffix, line 221 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab7:
+                    z->c = z->l - m;
+                    {   int ret = r_verb_suffix(z);
+                        if (ret == 0) goto lab4; /* call verb_suffix, line 222 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab5:
+                z->c = z->l - m;
+                {   int m = z->l - z->c; (void) m; /* try, line 225 */
+                    z->ket = z->c; /* [, line 225 */
+                    {   int m = z->l - z->c; (void) m; /* or, line 225 */
+                        if (!(eq_s_b(z, 1, s_41))) goto lab10;
+                        z->bra = z->c; /* ], line 225 */
+                        {   int ret;
+                            ret = slice_from_s(z, 1, s_42); /* <-, line 225 */
+                            if (ret < 0) return ret;
+                        }
+                        goto lab9;
+                    lab10:
+                        z->c = z->l - m;
+                        if (!(eq_s_b(z, 1, s_43))) { z->c = z->l - m; goto lab8; }
+                        z->bra = z->c; /* ], line 226 */
+                        {   int ret;
+                            ret = slice_from_s(z, 1, s_44); /* <-, line 226 */
+                            if (ret < 0) return ret;
+                        }
+                    }
+                lab9:
+                lab8:
+                    ;
+                }
+            }
+            goto lab3;
+        lab4:
+            z->c = z->l - m;
+            {   int ret = r_residual_suffix(z);
+                if (ret == 0) goto lab2; /* call residual_suffix, line 229 */
+                if (ret < 0) return ret;
+            }
+        }
+    lab3:
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 234 */
+        {   int ret = r_un_double(z);
+            if (ret == 0) goto lab11; /* call un_double, line 234 */
+            if (ret < 0) return ret;
+        }
+    lab11:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 235 */
+        {   int ret = r_un_accent(z);
+            if (ret == 0) goto lab12; /* call un_accent, line 235 */
+            if (ret < 0) return ret;
+        }
+    lab12:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 237 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab13; /* call postlude, line 237 */
+            if (ret < 0) return ret;
+        }
+    lab13:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * french_ISO_8859_1_create_env(void) { return SN_create_env(0, 3, 0); }
+
+extern void french_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_french.h b/libstemmer_c/src_c/stem_ISO_8859_1_french.h
new file mode 100644
index 0000000..21244d6
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_french.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * french_ISO_8859_1_create_env(void);
+extern void french_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int french_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_german.c b/libstemmer_c/src_c/stem_ISO_8859_1_german.c
new file mode 100644
index 0000000..633bf03
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_german.c
@@ -0,0 +1,512 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int german_ISO_8859_1_stem(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * german_ISO_8859_1_create_env(void);
+extern void german_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_1[1] = { 'U' };
+static symbol s_0_2[1] = { 'Y' };
+static symbol s_0_3[1] = { 0xE4 };
+static symbol s_0_4[1] = { 0xF6 };
+static symbol s_0_5[1] = { 0xFC };
+
+static struct among a_0[6] =
+{
+/*  0 */ { 0, 0, -1, 6, 0},
+/*  1 */ { 1, s_0_1, 0, 2, 0},
+/*  2 */ { 1, s_0_2, 0, 1, 0},
+/*  3 */ { 1, s_0_3, 0, 3, 0},
+/*  4 */ { 1, s_0_4, 0, 4, 0},
+/*  5 */ { 1, s_0_5, 0, 5, 0}
+};
+
+static symbol s_1_0[1] = { 'e' };
+static symbol s_1_1[2] = { 'e', 'm' };
+static symbol s_1_2[2] = { 'e', 'n' };
+static symbol s_1_3[3] = { 'e', 'r', 'n' };
+static symbol s_1_4[2] = { 'e', 'r' };
+static symbol s_1_5[1] = { 's' };
+static symbol s_1_6[2] = { 'e', 's' };
+
+static struct among a_1[7] =
+{
+/*  0 */ { 1, s_1_0, -1, 1, 0},
+/*  1 */ { 2, s_1_1, -1, 1, 0},
+/*  2 */ { 2, s_1_2, -1, 1, 0},
+/*  3 */ { 3, s_1_3, -1, 1, 0},
+/*  4 */ { 2, s_1_4, -1, 1, 0},
+/*  5 */ { 1, s_1_5, -1, 2, 0},
+/*  6 */ { 2, s_1_6, 5, 1, 0}
+};
+
+static symbol s_2_0[2] = { 'e', 'n' };
+static symbol s_2_1[2] = { 'e', 'r' };
+static symbol s_2_2[2] = { 's', 't' };
+static symbol s_2_3[3] = { 'e', 's', 't' };
+
+static struct among a_2[4] =
+{
+/*  0 */ { 2, s_2_0, -1, 1, 0},
+/*  1 */ { 2, s_2_1, -1, 1, 0},
+/*  2 */ { 2, s_2_2, -1, 2, 0},
+/*  3 */ { 3, s_2_3, 2, 1, 0}
+};
+
+static symbol s_3_0[2] = { 'i', 'g' };
+static symbol s_3_1[4] = { 'l', 'i', 'c', 'h' };
+
+static struct among a_3[2] =
+{
+/*  0 */ { 2, s_3_0, -1, 1, 0},
+/*  1 */ { 4, s_3_1, -1, 1, 0}
+};
+
+static symbol s_4_0[3] = { 'e', 'n', 'd' };
+static symbol s_4_1[2] = { 'i', 'g' };
+static symbol s_4_2[3] = { 'u', 'n', 'g' };
+static symbol s_4_3[4] = { 'l', 'i', 'c', 'h' };
+static symbol s_4_4[4] = { 'i', 's', 'c', 'h' };
+static symbol s_4_5[2] = { 'i', 'k' };
+static symbol s_4_6[4] = { 'h', 'e', 'i', 't' };
+static symbol s_4_7[4] = { 'k', 'e', 'i', 't' };
+
+static struct among a_4[8] =
+{
+/*  0 */ { 3, s_4_0, -1, 1, 0},
+/*  1 */ { 2, s_4_1, -1, 2, 0},
+/*  2 */ { 3, s_4_2, -1, 1, 0},
+/*  3 */ { 4, s_4_3, -1, 3, 0},
+/*  4 */ { 4, s_4_4, -1, 2, 0},
+/*  5 */ { 2, s_4_5, -1, 2, 0},
+/*  6 */ { 4, s_4_6, -1, 3, 0},
+/*  7 */ { 4, s_4_7, -1, 4, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32, 8 };
+
+static unsigned char g_s_ending[] = { 117, 30, 5 };
+
+static unsigned char g_st_ending[] = { 117, 30, 4 };
+
+static symbol s_0[] = { 0xDF };
+static symbol s_1[] = { 's', 's' };
+static symbol s_2[] = { 'u' };
+static symbol s_3[] = { 'U' };
+static symbol s_4[] = { 'y' };
+static symbol s_5[] = { 'Y' };
+static symbol s_6[] = { 'y' };
+static symbol s_7[] = { 'u' };
+static symbol s_8[] = { 'a' };
+static symbol s_9[] = { 'o' };
+static symbol s_10[] = { 'u' };
+static symbol s_11[] = { 'i', 'g' };
+static symbol s_12[] = { 'e' };
+static symbol s_13[] = { 'e' };
+static symbol s_14[] = { 'e', 'r' };
+static symbol s_15[] = { 'e', 'n' };
+
+static int r_prelude(struct SN_env * z) {
+    {   int c_test = z->c; /* test, line 30 */
+        while(1) { /* repeat, line 30 */
+            int c = z->c;
+            {   int c = z->c; /* or, line 33 */
+                z->bra = z->c; /* [, line 32 */
+                if (!(eq_s(z, 1, s_0))) goto lab2;
+                z->ket = z->c; /* ], line 32 */
+                {   int ret;
+                    ret = slice_from_s(z, 2, s_1); /* <-, line 32 */
+                    if (ret < 0) return ret;
+                }
+                goto lab1;
+            lab2:
+                z->c = c;
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 33 */
+            }
+        lab1:
+            continue;
+        lab0:
+            z->c = c;
+            break;
+        }
+        z->c = c_test;
+    }
+    while(1) { /* repeat, line 36 */
+        int c = z->c;
+        while(1) { /* goto, line 36 */
+            int c = z->c;
+            if (!(in_grouping(z, g_v, 97, 252))) goto lab4;
+            z->bra = z->c; /* [, line 37 */
+            {   int c = z->c; /* or, line 37 */
+                if (!(eq_s(z, 1, s_2))) goto lab6;
+                z->ket = z->c; /* ], line 37 */
+                if (!(in_grouping(z, g_v, 97, 252))) goto lab6;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_3); /* <-, line 37 */
+                    if (ret < 0) return ret;
+                }
+                goto lab5;
+            lab6:
+                z->c = c;
+                if (!(eq_s(z, 1, s_4))) goto lab4;
+                z->ket = z->c; /* ], line 38 */
+                if (!(in_grouping(z, g_v, 97, 252))) goto lab4;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_5); /* <-, line 38 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab5:
+            z->c = c;
+            break;
+        lab4:
+            z->c = c;
+            if (z->c >= z->l) goto lab3;
+            z->c++; /* goto, line 36 */
+        }
+        continue;
+    lab3:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    {   int c_test = z->c; /* test, line 47 */
+        {   int c = z->c + 3;
+            if (0 > c || c > z->l) return 0;
+            z->c = c; /* hop, line 47 */
+        }
+        z->I[2] = z->c; /* setmark x, line 47 */
+        z->c = c_test;
+    }
+    while(1) { /* gopast, line 49 */
+        if (!(in_grouping(z, g_v, 97, 252))) goto lab0;
+        break;
+    lab0:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 49 */
+    }
+    while(1) { /* gopast, line 49 */
+        if (!(out_grouping(z, g_v, 97, 252))) goto lab1;
+        break;
+    lab1:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 49 */
+    }
+    z->I[0] = z->c; /* setmark p1, line 49 */
+     /* try, line 50 */
+    if (!(z->I[0] < z->I[2])) goto lab2;
+    z->I[0] = z->I[2];
+lab2:
+    while(1) { /* gopast, line 51 */
+        if (!(in_grouping(z, g_v, 97, 252))) goto lab3;
+        break;
+    lab3:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 51 */
+    }
+    while(1) { /* gopast, line 51 */
+        if (!(out_grouping(z, g_v, 97, 252))) goto lab4;
+        break;
+    lab4:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 51 */
+    }
+    z->I[1] = z->c; /* setmark p2, line 51 */
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 55 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 57 */
+        among_var = find_among(z, a_0, 6); /* substring, line 57 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 57 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_6); /* <-, line 58 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_7); /* <-, line 59 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_8); /* <-, line 60 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 4:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_9); /* <-, line 61 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 5:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_10); /* <-, line 62 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 6:
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 63 */
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m = z->l - z->c; (void) m; /* do, line 74 */
+        z->ket = z->c; /* [, line 75 */
+        among_var = find_among_b(z, a_1, 7); /* substring, line 75 */
+        if (!(among_var)) goto lab0;
+        z->bra = z->c; /* ], line 75 */
+        {   int ret = r_R1(z);
+            if (ret == 0) goto lab0; /* call R1, line 75 */
+            if (ret < 0) return ret;
+        }
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 77 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                if (!(in_grouping_b(z, g_s_ending, 98, 116))) goto lab0;
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 80 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab0:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 84 */
+        z->ket = z->c; /* [, line 85 */
+        among_var = find_among_b(z, a_2, 4); /* substring, line 85 */
+        if (!(among_var)) goto lab1;
+        z->bra = z->c; /* ], line 85 */
+        {   int ret = r_R1(z);
+            if (ret == 0) goto lab1; /* call R1, line 85 */
+            if (ret < 0) return ret;
+        }
+        switch(among_var) {
+            case 0: goto lab1;
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 87 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                if (!(in_grouping_b(z, g_st_ending, 98, 116))) goto lab1;
+                {   int c = z->c - 3;
+                    if (z->lb > c || c > z->l) goto lab1;
+                    z->c = c; /* hop, line 90 */
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 90 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 94 */
+        z->ket = z->c; /* [, line 95 */
+        among_var = find_among_b(z, a_4, 8); /* substring, line 95 */
+        if (!(among_var)) goto lab2;
+        z->bra = z->c; /* ], line 95 */
+        {   int ret = r_R2(z);
+            if (ret == 0) goto lab2; /* call R2, line 95 */
+            if (ret < 0) return ret;
+        }
+        switch(among_var) {
+            case 0: goto lab2;
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 97 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* try, line 98 */
+                    z->ket = z->c; /* [, line 98 */
+                    if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m; goto lab3; }
+                    z->bra = z->c; /* ], line 98 */
+                    {   int m = z->l - z->c; (void) m; /* not, line 98 */
+                        if (!(eq_s_b(z, 1, s_12))) goto lab4;
+                        { z->c = z->l - m; goto lab3; }
+                    lab4:
+                        z->c = z->l - m;
+                    }
+                    {   int ret = r_R2(z);
+                        if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 98 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 98 */
+                        if (ret < 0) return ret;
+                    }
+                lab3:
+                    ;
+                }
+                break;
+            case 2:
+                {   int m = z->l - z->c; (void) m; /* not, line 101 */
+                    if (!(eq_s_b(z, 1, s_13))) goto lab5;
+                    goto lab2;
+                lab5:
+                    z->c = z->l - m;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 101 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 104 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* try, line 105 */
+                    z->ket = z->c; /* [, line 106 */
+                    {   int m = z->l - z->c; (void) m; /* or, line 106 */
+                        if (!(eq_s_b(z, 2, s_14))) goto lab8;
+                        goto lab7;
+                    lab8:
+                        z->c = z->l - m;
+                        if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m; goto lab6; }
+                    }
+                lab7:
+                    z->bra = z->c; /* ], line 106 */
+                    {   int ret = r_R1(z);
+                        if (ret == 0) { z->c = z->l - m; goto lab6; } /* call R1, line 106 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 106 */
+                        if (ret < 0) return ret;
+                    }
+                lab6:
+                    ;
+                }
+                break;
+            case 4:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 110 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* try, line 111 */
+                    z->ket = z->c; /* [, line 112 */
+                    among_var = find_among_b(z, a_3, 2); /* substring, line 112 */
+                    if (!(among_var)) { z->c = z->l - m; goto lab9; }
+                    z->bra = z->c; /* ], line 112 */
+                    {   int ret = r_R2(z);
+                        if (ret == 0) { z->c = z->l - m; goto lab9; } /* call R2, line 112 */
+                        if (ret < 0) return ret;
+                    }
+                    switch(among_var) {
+                        case 0: { z->c = z->l - m; goto lab9; }
+                        case 1:
+                            {   int ret;
+                                ret = slice_del(z); /* delete, line 114 */
+                                if (ret < 0) return ret;
+                            }
+                            break;
+                    }
+                lab9:
+                    ;
+                }
+                break;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    return 1;
+}
+
+extern int german_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 125 */
+        {   int ret = r_prelude(z);
+            if (ret == 0) goto lab0; /* call prelude, line 125 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 126 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab1; /* call mark_regions, line 126 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 127 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 128 */
+        {   int ret = r_standard_suffix(z);
+            if (ret == 0) goto lab2; /* call standard_suffix, line 128 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 129 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab3; /* call postlude, line 129 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * german_ISO_8859_1_create_env(void) { return SN_create_env(0, 3, 0); }
+
+extern void german_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_german.h b/libstemmer_c/src_c/stem_ISO_8859_1_german.h
new file mode 100644
index 0000000..8525389
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_german.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * german_ISO_8859_1_create_env(void);
+extern void german_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int german_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_italian.c b/libstemmer_c/src_c/stem_ISO_8859_1_italian.c
new file mode 100644
index 0000000..9fe9776
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_italian.c
@@ -0,0 +1,1091 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int italian_ISO_8859_1_stem(struct SN_env * z);
+static int r_vowel_suffix(struct SN_env * z);
+static int r_verb_suffix(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_attached_pronoun(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_RV(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * italian_ISO_8859_1_create_env(void);
+extern void italian_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_1[2] = { 'q', 'u' };
+static symbol s_0_2[1] = { 0xE1 };
+static symbol s_0_3[1] = { 0xE9 };
+static symbol s_0_4[1] = { 0xED };
+static symbol s_0_5[1] = { 0xF3 };
+static symbol s_0_6[1] = { 0xFA };
+
+static struct among a_0[7] =
+{
+/*  0 */ { 0, 0, -1, 7, 0},
+/*  1 */ { 2, s_0_1, 0, 6, 0},
+/*  2 */ { 1, s_0_2, 0, 1, 0},
+/*  3 */ { 1, s_0_3, 0, 2, 0},
+/*  4 */ { 1, s_0_4, 0, 3, 0},
+/*  5 */ { 1, s_0_5, 0, 4, 0},
+/*  6 */ { 1, s_0_6, 0, 5, 0}
+};
+
+static symbol s_1_1[1] = { 'I' };
+static symbol s_1_2[1] = { 'U' };
+
+static struct among a_1[3] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 1, s_1_1, 0, 1, 0},
+/*  2 */ { 1, s_1_2, 0, 2, 0}
+};
+
+static symbol s_2_0[2] = { 'l', 'a' };
+static symbol s_2_1[4] = { 'c', 'e', 'l', 'a' };
+static symbol s_2_2[6] = { 'g', 'l', 'i', 'e', 'l', 'a' };
+static symbol s_2_3[4] = { 'm', 'e', 'l', 'a' };
+static symbol s_2_4[4] = { 't', 'e', 'l', 'a' };
+static symbol s_2_5[4] = { 'v', 'e', 'l', 'a' };
+static symbol s_2_6[2] = { 'l', 'e' };
+static symbol s_2_7[4] = { 'c', 'e', 'l', 'e' };
+static symbol s_2_8[6] = { 'g', 'l', 'i', 'e', 'l', 'e' };
+static symbol s_2_9[4] = { 'm', 'e', 'l', 'e' };
+static symbol s_2_10[4] = { 't', 'e', 'l', 'e' };
+static symbol s_2_11[4] = { 'v', 'e', 'l', 'e' };
+static symbol s_2_12[2] = { 'n', 'e' };
+static symbol s_2_13[4] = { 'c', 'e', 'n', 'e' };
+static symbol s_2_14[6] = { 'g', 'l', 'i', 'e', 'n', 'e' };
+static symbol s_2_15[4] = { 'm', 'e', 'n', 'e' };
+static symbol s_2_16[4] = { 's', 'e', 'n', 'e' };
+static symbol s_2_17[4] = { 't', 'e', 'n', 'e' };
+static symbol s_2_18[4] = { 'v', 'e', 'n', 'e' };
+static symbol s_2_19[2] = { 'c', 'i' };
+static symbol s_2_20[2] = { 'l', 'i' };
+static symbol s_2_21[4] = { 'c', 'e', 'l', 'i' };
+static symbol s_2_22[6] = { 'g', 'l', 'i', 'e', 'l', 'i' };
+static symbol s_2_23[4] = { 'm', 'e', 'l', 'i' };
+static symbol s_2_24[4] = { 't', 'e', 'l', 'i' };
+static symbol s_2_25[4] = { 'v', 'e', 'l', 'i' };
+static symbol s_2_26[3] = { 'g', 'l', 'i' };
+static symbol s_2_27[2] = { 'm', 'i' };
+static symbol s_2_28[2] = { 's', 'i' };
+static symbol s_2_29[2] = { 't', 'i' };
+static symbol s_2_30[2] = { 'v', 'i' };
+static symbol s_2_31[2] = { 'l', 'o' };
+static symbol s_2_32[4] = { 'c', 'e', 'l', 'o' };
+static symbol s_2_33[6] = { 'g', 'l', 'i', 'e', 'l', 'o' };
+static symbol s_2_34[4] = { 'm', 'e', 'l', 'o' };
+static symbol s_2_35[4] = { 't', 'e', 'l', 'o' };
+static symbol s_2_36[4] = { 'v', 'e', 'l', 'o' };
+
+static struct among a_2[37] =
+{
+/*  0 */ { 2, s_2_0, -1, -1, 0},
+/*  1 */ { 4, s_2_1, 0, -1, 0},
+/*  2 */ { 6, s_2_2, 0, -1, 0},
+/*  3 */ { 4, s_2_3, 0, -1, 0},
+/*  4 */ { 4, s_2_4, 0, -1, 0},
+/*  5 */ { 4, s_2_5, 0, -1, 0},
+/*  6 */ { 2, s_2_6, -1, -1, 0},
+/*  7 */ { 4, s_2_7, 6, -1, 0},
+/*  8 */ { 6, s_2_8, 6, -1, 0},
+/*  9 */ { 4, s_2_9, 6, -1, 0},
+/* 10 */ { 4, s_2_10, 6, -1, 0},
+/* 11 */ { 4, s_2_11, 6, -1, 0},
+/* 12 */ { 2, s_2_12, -1, -1, 0},
+/* 13 */ { 4, s_2_13, 12, -1, 0},
+/* 14 */ { 6, s_2_14, 12, -1, 0},
+/* 15 */ { 4, s_2_15, 12, -1, 0},
+/* 16 */ { 4, s_2_16, 12, -1, 0},
+/* 17 */ { 4, s_2_17, 12, -1, 0},
+/* 18 */ { 4, s_2_18, 12, -1, 0},
+/* 19 */ { 2, s_2_19, -1, -1, 0},
+/* 20 */ { 2, s_2_20, -1, -1, 0},
+/* 21 */ { 4, s_2_21, 20, -1, 0},
+/* 22 */ { 6, s_2_22, 20, -1, 0},
+/* 23 */ { 4, s_2_23, 20, -1, 0},
+/* 24 */ { 4, s_2_24, 20, -1, 0},
+/* 25 */ { 4, s_2_25, 20, -1, 0},
+/* 26 */ { 3, s_2_26, 20, -1, 0},
+/* 27 */ { 2, s_2_27, -1, -1, 0},
+/* 28 */ { 2, s_2_28, -1, -1, 0},
+/* 29 */ { 2, s_2_29, -1, -1, 0},
+/* 30 */ { 2, s_2_30, -1, -1, 0},
+/* 31 */ { 2, s_2_31, -1, -1, 0},
+/* 32 */ { 4, s_2_32, 31, -1, 0},
+/* 33 */ { 6, s_2_33, 31, -1, 0},
+/* 34 */ { 4, s_2_34, 31, -1, 0},
+/* 35 */ { 4, s_2_35, 31, -1, 0},
+/* 36 */ { 4, s_2_36, 31, -1, 0}
+};
+
+static symbol s_3_0[4] = { 'a', 'n', 'd', 'o' };
+static symbol s_3_1[4] = { 'e', 'n', 'd', 'o' };
+static symbol s_3_2[2] = { 'a', 'r' };
+static symbol s_3_3[2] = { 'e', 'r' };
+static symbol s_3_4[2] = { 'i', 'r' };
+
+static struct among a_3[5] =
+{
+/*  0 */ { 4, s_3_0, -1, 1, 0},
+/*  1 */ { 4, s_3_1, -1, 1, 0},
+/*  2 */ { 2, s_3_2, -1, 2, 0},
+/*  3 */ { 2, s_3_3, -1, 2, 0},
+/*  4 */ { 2, s_3_4, -1, 2, 0}
+};
+
+static symbol s_4_0[2] = { 'i', 'c' };
+static symbol s_4_1[4] = { 'a', 'b', 'i', 'l' };
+static symbol s_4_2[2] = { 'o', 's' };
+static symbol s_4_3[2] = { 'i', 'v' };
+
+static struct among a_4[4] =
+{
+/*  0 */ { 2, s_4_0, -1, -1, 0},
+/*  1 */ { 4, s_4_1, -1, -1, 0},
+/*  2 */ { 2, s_4_2, -1, -1, 0},
+/*  3 */ { 2, s_4_3, -1, 1, 0}
+};
+
+static symbol s_5_0[2] = { 'i', 'c' };
+static symbol s_5_1[4] = { 'a', 'b', 'i', 'l' };
+static symbol s_5_2[2] = { 'i', 'v' };
+
+static struct among a_5[3] =
+{
+/*  0 */ { 2, s_5_0, -1, 1, 0},
+/*  1 */ { 4, s_5_1, -1, 1, 0},
+/*  2 */ { 2, s_5_2, -1, 1, 0}
+};
+
+static symbol s_6_0[3] = { 'i', 'c', 'a' };
+static symbol s_6_1[5] = { 'l', 'o', 'g', 'i', 'a' };
+static symbol s_6_2[3] = { 'o', 's', 'a' };
+static symbol s_6_3[4] = { 'i', 's', 't', 'a' };
+static symbol s_6_4[3] = { 'i', 'v', 'a' };
+static symbol s_6_5[4] = { 'a', 'n', 'z', 'a' };
+static symbol s_6_6[4] = { 'e', 'n', 'z', 'a' };
+static symbol s_6_7[3] = { 'i', 'c', 'e' };
+static symbol s_6_8[6] = { 'a', 't', 'r', 'i', 'c', 'e' };
+static symbol s_6_9[4] = { 'i', 'c', 'h', 'e' };
+static symbol s_6_10[5] = { 'l', 'o', 'g', 'i', 'e' };
+static symbol s_6_11[5] = { 'a', 'b', 'i', 'l', 'e' };
+static symbol s_6_12[5] = { 'i', 'b', 'i', 'l', 'e' };
+static symbol s_6_13[6] = { 'u', 's', 'i', 'o', 'n', 'e' };
+static symbol s_6_14[6] = { 'a', 'z', 'i', 'o', 'n', 'e' };
+static symbol s_6_15[6] = { 'u', 'z', 'i', 'o', 'n', 'e' };
+static symbol s_6_16[5] = { 'a', 't', 'o', 'r', 'e' };
+static symbol s_6_17[3] = { 'o', 's', 'e' };
+static symbol s_6_18[4] = { 'a', 'n', 't', 'e' };
+static symbol s_6_19[5] = { 'm', 'e', 'n', 't', 'e' };
+static symbol s_6_20[6] = { 'a', 'm', 'e', 'n', 't', 'e' };
+static symbol s_6_21[4] = { 'i', 's', 't', 'e' };
+static symbol s_6_22[3] = { 'i', 'v', 'e' };
+static symbol s_6_23[4] = { 'a', 'n', 'z', 'e' };
+static symbol s_6_24[4] = { 'e', 'n', 'z', 'e' };
+static symbol s_6_25[3] = { 'i', 'c', 'i' };
+static symbol s_6_26[6] = { 'a', 't', 'r', 'i', 'c', 'i' };
+static symbol s_6_27[4] = { 'i', 'c', 'h', 'i' };
+static symbol s_6_28[5] = { 'a', 'b', 'i', 'l', 'i' };
+static symbol s_6_29[5] = { 'i', 'b', 'i', 'l', 'i' };
+static symbol s_6_30[4] = { 'i', 's', 'm', 'i' };
+static symbol s_6_31[6] = { 'u', 's', 'i', 'o', 'n', 'i' };
+static symbol s_6_32[6] = { 'a', 'z', 'i', 'o', 'n', 'i' };
+static symbol s_6_33[6] = { 'u', 'z', 'i', 'o', 'n', 'i' };
+static symbol s_6_34[5] = { 'a', 't', 'o', 'r', 'i' };
+static symbol s_6_35[3] = { 'o', 's', 'i' };
+static symbol s_6_36[4] = { 'a', 'n', 't', 'i' };
+static symbol s_6_37[6] = { 'a', 'm', 'e', 'n', 't', 'i' };
+static symbol s_6_38[6] = { 'i', 'm', 'e', 'n', 't', 'i' };
+static symbol s_6_39[4] = { 'i', 's', 't', 'i' };
+static symbol s_6_40[3] = { 'i', 'v', 'i' };
+static symbol s_6_41[3] = { 'i', 'c', 'o' };
+static symbol s_6_42[4] = { 'i', 's', 'm', 'o' };
+static symbol s_6_43[3] = { 'o', 's', 'o' };
+static symbol s_6_44[6] = { 'a', 'm', 'e', 'n', 't', 'o' };
+static symbol s_6_45[6] = { 'i', 'm', 'e', 'n', 't', 'o' };
+static symbol s_6_46[3] = { 'i', 'v', 'o' };
+static symbol s_6_47[3] = { 'i', 't', 0xE0 };
+static symbol s_6_48[4] = { 'i', 's', 't', 0xE0 };
+static symbol s_6_49[4] = { 'i', 's', 't', 0xE8 };
+static symbol s_6_50[4] = { 'i', 's', 't', 0xEC };
+
+static struct among a_6[51] =
+{
+/*  0 */ { 3, s_6_0, -1, 1, 0},
+/*  1 */ { 5, s_6_1, -1, 3, 0},
+/*  2 */ { 3, s_6_2, -1, 1, 0},
+/*  3 */ { 4, s_6_3, -1, 1, 0},
+/*  4 */ { 3, s_6_4, -1, 9, 0},
+/*  5 */ { 4, s_6_5, -1, 1, 0},
+/*  6 */ { 4, s_6_6, -1, 5, 0},
+/*  7 */ { 3, s_6_7, -1, 1, 0},
+/*  8 */ { 6, s_6_8, 7, 1, 0},
+/*  9 */ { 4, s_6_9, -1, 1, 0},
+/* 10 */ { 5, s_6_10, -1, 3, 0},
+/* 11 */ { 5, s_6_11, -1, 1, 0},
+/* 12 */ { 5, s_6_12, -1, 1, 0},
+/* 13 */ { 6, s_6_13, -1, 4, 0},
+/* 14 */ { 6, s_6_14, -1, 2, 0},
+/* 15 */ { 6, s_6_15, -1, 4, 0},
+/* 16 */ { 5, s_6_16, -1, 2, 0},
+/* 17 */ { 3, s_6_17, -1, 1, 0},
+/* 18 */ { 4, s_6_18, -1, 1, 0},
+/* 19 */ { 5, s_6_19, -1, 1, 0},
+/* 20 */ { 6, s_6_20, 19, 7, 0},
+/* 21 */ { 4, s_6_21, -1, 1, 0},
+/* 22 */ { 3, s_6_22, -1, 9, 0},
+/* 23 */ { 4, s_6_23, -1, 1, 0},
+/* 24 */ { 4, s_6_24, -1, 5, 0},
+/* 25 */ { 3, s_6_25, -1, 1, 0},
+/* 26 */ { 6, s_6_26, 25, 1, 0},
+/* 27 */ { 4, s_6_27, -1, 1, 0},
+/* 28 */ { 5, s_6_28, -1, 1, 0},
+/* 29 */ { 5, s_6_29, -1, 1, 0},
+/* 30 */ { 4, s_6_30, -1, 1, 0},
+/* 31 */ { 6, s_6_31, -1, 4, 0},
+/* 32 */ { 6, s_6_32, -1, 2, 0},
+/* 33 */ { 6, s_6_33, -1, 4, 0},
+/* 34 */ { 5, s_6_34, -1, 2, 0},
+/* 35 */ { 3, s_6_35, -1, 1, 0},
+/* 36 */ { 4, s_6_36, -1, 1, 0},
+/* 37 */ { 6, s_6_37, -1, 6, 0},
+/* 38 */ { 6, s_6_38, -1, 6, 0},
+/* 39 */ { 4, s_6_39, -1, 1, 0},
+/* 40 */ { 3, s_6_40, -1, 9, 0},
+/* 41 */ { 3, s_6_41, -1, 1, 0},
+/* 42 */ { 4, s_6_42, -1, 1, 0},
+/* 43 */ { 3, s_6_43, -1, 1, 0},
+/* 44 */ { 6, s_6_44, -1, 6, 0},
+/* 45 */ { 6, s_6_45, -1, 6, 0},
+/* 46 */ { 3, s_6_46, -1, 9, 0},
+/* 47 */ { 3, s_6_47, -1, 8, 0},
+/* 48 */ { 4, s_6_48, -1, 1, 0},
+/* 49 */ { 4, s_6_49, -1, 1, 0},
+/* 50 */ { 4, s_6_50, -1, 1, 0}
+};
+
+static symbol s_7_0[4] = { 'i', 's', 'c', 'a' };
+static symbol s_7_1[4] = { 'e', 'n', 'd', 'a' };
+static symbol s_7_2[3] = { 'a', 't', 'a' };
+static symbol s_7_3[3] = { 'i', 't', 'a' };
+static symbol s_7_4[3] = { 'u', 't', 'a' };
+static symbol s_7_5[3] = { 'a', 'v', 'a' };
+static symbol s_7_6[3] = { 'e', 'v', 'a' };
+static symbol s_7_7[3] = { 'i', 'v', 'a' };
+static symbol s_7_8[6] = { 'e', 'r', 'e', 'b', 'b', 'e' };
+static symbol s_7_9[6] = { 'i', 'r', 'e', 'b', 'b', 'e' };
+static symbol s_7_10[4] = { 'i', 's', 'c', 'e' };
+static symbol s_7_11[4] = { 'e', 'n', 'd', 'e' };
+static symbol s_7_12[3] = { 'a', 'r', 'e' };
+static symbol s_7_13[3] = { 'e', 'r', 'e' };
+static symbol s_7_14[3] = { 'i', 'r', 'e' };
+static symbol s_7_15[4] = { 'a', 's', 's', 'e' };
+static symbol s_7_16[3] = { 'a', 't', 'e' };
+static symbol s_7_17[5] = { 'a', 'v', 'a', 't', 'e' };
+static symbol s_7_18[5] = { 'e', 'v', 'a', 't', 'e' };
+static symbol s_7_19[5] = { 'i', 'v', 'a', 't', 'e' };
+static symbol s_7_20[3] = { 'e', 't', 'e' };
+static symbol s_7_21[5] = { 'e', 'r', 'e', 't', 'e' };
+static symbol s_7_22[5] = { 'i', 'r', 'e', 't', 'e' };
+static symbol s_7_23[3] = { 'i', 't', 'e' };
+static symbol s_7_24[6] = { 'e', 'r', 'e', 's', 't', 'e' };
+static symbol s_7_25[6] = { 'i', 'r', 'e', 's', 't', 'e' };
+static symbol s_7_26[3] = { 'u', 't', 'e' };
+static symbol s_7_27[4] = { 'e', 'r', 'a', 'i' };
+static symbol s_7_28[4] = { 'i', 'r', 'a', 'i' };
+static symbol s_7_29[4] = { 'i', 's', 'c', 'i' };
+static symbol s_7_30[4] = { 'e', 'n', 'd', 'i' };
+static symbol s_7_31[4] = { 'e', 'r', 'e', 'i' };
+static symbol s_7_32[4] = { 'i', 'r', 'e', 'i' };
+static symbol s_7_33[4] = { 'a', 's', 's', 'i' };
+static symbol s_7_34[3] = { 'a', 't', 'i' };
+static symbol s_7_35[3] = { 'i', 't', 'i' };
+static symbol s_7_36[6] = { 'e', 'r', 'e', 's', 't', 'i' };
+static symbol s_7_37[6] = { 'i', 'r', 'e', 's', 't', 'i' };
+static symbol s_7_38[3] = { 'u', 't', 'i' };
+static symbol s_7_39[3] = { 'a', 'v', 'i' };
+static symbol s_7_40[3] = { 'e', 'v', 'i' };
+static symbol s_7_41[3] = { 'i', 'v', 'i' };
+static symbol s_7_42[4] = { 'i', 's', 'c', 'o' };
+static symbol s_7_43[4] = { 'a', 'n', 'd', 'o' };
+static symbol s_7_44[4] = { 'e', 'n', 'd', 'o' };
+static symbol s_7_45[4] = { 'Y', 'a', 'm', 'o' };
+static symbol s_7_46[4] = { 'i', 'a', 'm', 'o' };
+static symbol s_7_47[5] = { 'a', 'v', 'a', 'm', 'o' };
+static symbol s_7_48[5] = { 'e', 'v', 'a', 'm', 'o' };
+static symbol s_7_49[5] = { 'i', 'v', 'a', 'm', 'o' };
+static symbol s_7_50[5] = { 'e', 'r', 'e', 'm', 'o' };
+static symbol s_7_51[5] = { 'i', 'r', 'e', 'm', 'o' };
+static symbol s_7_52[6] = { 'a', 's', 's', 'i', 'm', 'o' };
+static symbol s_7_53[4] = { 'a', 'm', 'm', 'o' };
+static symbol s_7_54[4] = { 'e', 'm', 'm', 'o' };
+static symbol s_7_55[6] = { 'e', 'r', 'e', 'm', 'm', 'o' };
+static symbol s_7_56[6] = { 'i', 'r', 'e', 'm', 'm', 'o' };
+static symbol s_7_57[4] = { 'i', 'm', 'm', 'o' };
+static symbol s_7_58[3] = { 'a', 'n', 'o' };
+static symbol s_7_59[6] = { 'i', 's', 'c', 'a', 'n', 'o' };
+static symbol s_7_60[5] = { 'a', 'v', 'a', 'n', 'o' };
+static symbol s_7_61[5] = { 'e', 'v', 'a', 'n', 'o' };
+static symbol s_7_62[5] = { 'i', 'v', 'a', 'n', 'o' };
+static symbol s_7_63[6] = { 'e', 'r', 'a', 'n', 'n', 'o' };
+static symbol s_7_64[6] = { 'i', 'r', 'a', 'n', 'n', 'o' };
+static symbol s_7_65[3] = { 'o', 'n', 'o' };
+static symbol s_7_66[6] = { 'i', 's', 'c', 'o', 'n', 'o' };
+static symbol s_7_67[5] = { 'a', 'r', 'o', 'n', 'o' };
+static symbol s_7_68[5] = { 'e', 'r', 'o', 'n', 'o' };
+static symbol s_7_69[5] = { 'i', 'r', 'o', 'n', 'o' };
+static symbol s_7_70[8] = { 'e', 'r', 'e', 'b', 'b', 'e', 'r', 'o' };
+static symbol s_7_71[8] = { 'i', 'r', 'e', 'b', 'b', 'e', 'r', 'o' };
+static symbol s_7_72[6] = { 'a', 's', 's', 'e', 'r', 'o' };
+static symbol s_7_73[6] = { 'e', 's', 's', 'e', 'r', 'o' };
+static symbol s_7_74[6] = { 'i', 's', 's', 'e', 'r', 'o' };
+static symbol s_7_75[3] = { 'a', 't', 'o' };
+static symbol s_7_76[3] = { 'i', 't', 'o' };
+static symbol s_7_77[3] = { 'u', 't', 'o' };
+static symbol s_7_78[3] = { 'a', 'v', 'o' };
+static symbol s_7_79[3] = { 'e', 'v', 'o' };
+static symbol s_7_80[3] = { 'i', 'v', 'o' };
+static symbol s_7_81[2] = { 'a', 'r' };
+static symbol s_7_82[2] = { 'i', 'r' };
+static symbol s_7_83[3] = { 'e', 'r', 0xE0 };
+static symbol s_7_84[3] = { 'i', 'r', 0xE0 };
+static symbol s_7_85[3] = { 'e', 'r', 0xF2 };
+static symbol s_7_86[3] = { 'i', 'r', 0xF2 };
+
+static struct among a_7[87] =
+{
+/*  0 */ { 4, s_7_0, -1, 1, 0},
+/*  1 */ { 4, s_7_1, -1, 1, 0},
+/*  2 */ { 3, s_7_2, -1, 1, 0},
+/*  3 */ { 3, s_7_3, -1, 1, 0},
+/*  4 */ { 3, s_7_4, -1, 1, 0},
+/*  5 */ { 3, s_7_5, -1, 1, 0},
+/*  6 */ { 3, s_7_6, -1, 1, 0},
+/*  7 */ { 3, s_7_7, -1, 1, 0},
+/*  8 */ { 6, s_7_8, -1, 1, 0},
+/*  9 */ { 6, s_7_9, -1, 1, 0},
+/* 10 */ { 4, s_7_10, -1, 1, 0},
+/* 11 */ { 4, s_7_11, -1, 1, 0},
+/* 12 */ { 3, s_7_12, -1, 1, 0},
+/* 13 */ { 3, s_7_13, -1, 1, 0},
+/* 14 */ { 3, s_7_14, -1, 1, 0},
+/* 15 */ { 4, s_7_15, -1, 1, 0},
+/* 16 */ { 3, s_7_16, -1, 1, 0},
+/* 17 */ { 5, s_7_17, 16, 1, 0},
+/* 18 */ { 5, s_7_18, 16, 1, 0},
+/* 19 */ { 5, s_7_19, 16, 1, 0},
+/* 20 */ { 3, s_7_20, -1, 1, 0},
+/* 21 */ { 5, s_7_21, 20, 1, 0},
+/* 22 */ { 5, s_7_22, 20, 1, 0},
+/* 23 */ { 3, s_7_23, -1, 1, 0},
+/* 24 */ { 6, s_7_24, -1, 1, 0},
+/* 25 */ { 6, s_7_25, -1, 1, 0},
+/* 26 */ { 3, s_7_26, -1, 1, 0},
+/* 27 */ { 4, s_7_27, -1, 1, 0},
+/* 28 */ { 4, s_7_28, -1, 1, 0},
+/* 29 */ { 4, s_7_29, -1, 1, 0},
+/* 30 */ { 4, s_7_30, -1, 1, 0},
+/* 31 */ { 4, s_7_31, -1, 1, 0},
+/* 32 */ { 4, s_7_32, -1, 1, 0},
+/* 33 */ { 4, s_7_33, -1, 1, 0},
+/* 34 */ { 3, s_7_34, -1, 1, 0},
+/* 35 */ { 3, s_7_35, -1, 1, 0},
+/* 36 */ { 6, s_7_36, -1, 1, 0},
+/* 37 */ { 6, s_7_37, -1, 1, 0},
+/* 38 */ { 3, s_7_38, -1, 1, 0},
+/* 39 */ { 3, s_7_39, -1, 1, 0},
+/* 40 */ { 3, s_7_40, -1, 1, 0},
+/* 41 */ { 3, s_7_41, -1, 1, 0},
+/* 42 */ { 4, s_7_42, -1, 1, 0},
+/* 43 */ { 4, s_7_43, -1, 1, 0},
+/* 44 */ { 4, s_7_44, -1, 1, 0},
+/* 45 */ { 4, s_7_45, -1, 1, 0},
+/* 46 */ { 4, s_7_46, -1, 1, 0},
+/* 47 */ { 5, s_7_47, -1, 1, 0},
+/* 48 */ { 5, s_7_48, -1, 1, 0},
+/* 49 */ { 5, s_7_49, -1, 1, 0},
+/* 50 */ { 5, s_7_50, -1, 1, 0},
+/* 51 */ { 5, s_7_51, -1, 1, 0},
+/* 52 */ { 6, s_7_52, -1, 1, 0},
+/* 53 */ { 4, s_7_53, -1, 1, 0},
+/* 54 */ { 4, s_7_54, -1, 1, 0},
+/* 55 */ { 6, s_7_55, 54, 1, 0},
+/* 56 */ { 6, s_7_56, 54, 1, 0},
+/* 57 */ { 4, s_7_57, -1, 1, 0},
+/* 58 */ { 3, s_7_58, -1, 1, 0},
+/* 59 */ { 6, s_7_59, 58, 1, 0},
+/* 60 */ { 5, s_7_60, 58, 1, 0},
+/* 61 */ { 5, s_7_61, 58, 1, 0},
+/* 62 */ { 5, s_7_62, 58, 1, 0},
+/* 63 */ { 6, s_7_63, -1, 1, 0},
+/* 64 */ { 6, s_7_64, -1, 1, 0},
+/* 65 */ { 3, s_7_65, -1, 1, 0},
+/* 66 */ { 6, s_7_66, 65, 1, 0},
+/* 67 */ { 5, s_7_67, 65, 1, 0},
+/* 68 */ { 5, s_7_68, 65, 1, 0},
+/* 69 */ { 5, s_7_69, 65, 1, 0},
+/* 70 */ { 8, s_7_70, -1, 1, 0},
+/* 71 */ { 8, s_7_71, -1, 1, 0},
+/* 72 */ { 6, s_7_72, -1, 1, 0},
+/* 73 */ { 6, s_7_73, -1, 1, 0},
+/* 74 */ { 6, s_7_74, -1, 1, 0},
+/* 75 */ { 3, s_7_75, -1, 1, 0},
+/* 76 */ { 3, s_7_76, -1, 1, 0},
+/* 77 */ { 3, s_7_77, -1, 1, 0},
+/* 78 */ { 3, s_7_78, -1, 1, 0},
+/* 79 */ { 3, s_7_79, -1, 1, 0},
+/* 80 */ { 3, s_7_80, -1, 1, 0},
+/* 81 */ { 2, s_7_81, -1, 1, 0},
+/* 82 */ { 2, s_7_82, -1, 1, 0},
+/* 83 */ { 3, s_7_83, -1, 1, 0},
+/* 84 */ { 3, s_7_84, -1, 1, 0},
+/* 85 */ { 3, s_7_85, -1, 1, 0},
+/* 86 */ { 3, s_7_86, -1, 1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2, 1 };
+
+static unsigned char g_AEIO[] = { 17, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2 };
+
+static unsigned char g_CG[] = { 17 };
+
+static symbol s_0[] = { 0xE0 };
+static symbol s_1[] = { 0xE8 };
+static symbol s_2[] = { 0xEC };
+static symbol s_3[] = { 0xF2 };
+static symbol s_4[] = { 0xF9 };
+static symbol s_5[] = { 'q', 'U' };
+static symbol s_6[] = { 'u' };
+static symbol s_7[] = { 'U' };
+static symbol s_8[] = { 'i' };
+static symbol s_9[] = { 'I' };
+static symbol s_10[] = { 'i' };
+static symbol s_11[] = { 'u' };
+static symbol s_12[] = { 'e' };
+static symbol s_13[] = { 'i', 'c' };
+static symbol s_14[] = { 'l', 'o', 'g' };
+static symbol s_15[] = { 'u' };
+static symbol s_16[] = { 'e', 'n', 't', 'e' };
+static symbol s_17[] = { 'a', 't' };
+static symbol s_18[] = { 'a', 't' };
+static symbol s_19[] = { 'i', 'c' };
+static symbol s_20[] = { 'i' };
+static symbol s_21[] = { 'h' };
+
+static int r_prelude(struct SN_env * z) {
+    int among_var;
+    {   int c_test = z->c; /* test, line 35 */
+        while(1) { /* repeat, line 35 */
+            int c = z->c;
+            z->bra = z->c; /* [, line 36 */
+            among_var = find_among(z, a_0, 7); /* substring, line 36 */
+            if (!(among_var)) goto lab0;
+            z->ket = z->c; /* ], line 36 */
+            switch(among_var) {
+                case 0: goto lab0;
+                case 1:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_0); /* <-, line 37 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 2:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_1); /* <-, line 38 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 3:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_2); /* <-, line 39 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 4:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_3); /* <-, line 40 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 5:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_4); /* <-, line 41 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 6:
+                    {   int ret;
+                        ret = slice_from_s(z, 2, s_5); /* <-, line 42 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 7:
+                    if (z->c >= z->l) goto lab0;
+                    z->c++; /* next, line 43 */
+                    break;
+            }
+            continue;
+        lab0:
+            z->c = c;
+            break;
+        }
+        z->c = c_test;
+    }
+    while(1) { /* repeat, line 46 */
+        int c = z->c;
+        while(1) { /* goto, line 46 */
+            int c = z->c;
+            if (!(in_grouping(z, g_v, 97, 249))) goto lab2;
+            z->bra = z->c; /* [, line 47 */
+            {   int c = z->c; /* or, line 47 */
+                if (!(eq_s(z, 1, s_6))) goto lab4;
+                z->ket = z->c; /* ], line 47 */
+                if (!(in_grouping(z, g_v, 97, 249))) goto lab4;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_7); /* <-, line 47 */
+                    if (ret < 0) return ret;
+                }
+                goto lab3;
+            lab4:
+                z->c = c;
+                if (!(eq_s(z, 1, s_8))) goto lab2;
+                z->ket = z->c; /* ], line 48 */
+                if (!(in_grouping(z, g_v, 97, 249))) goto lab2;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_9); /* <-, line 48 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab3:
+            z->c = c;
+            break;
+        lab2:
+            z->c = c;
+            if (z->c >= z->l) goto lab1;
+            z->c++; /* goto, line 46 */
+        }
+        continue;
+    lab1:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    z->I[2] = z->l;
+    {   int c = z->c; /* do, line 58 */
+        {   int c = z->c; /* or, line 60 */
+            if (!(in_grouping(z, g_v, 97, 249))) goto lab2;
+            {   int c = z->c; /* or, line 59 */
+                if (!(out_grouping(z, g_v, 97, 249))) goto lab4;
+                while(1) { /* gopast, line 59 */
+                    if (!(in_grouping(z, g_v, 97, 249))) goto lab5;
+                    break;
+                lab5:
+                    if (z->c >= z->l) goto lab4;
+                    z->c++; /* gopast, line 59 */
+                }
+                goto lab3;
+            lab4:
+                z->c = c;
+                if (!(in_grouping(z, g_v, 97, 249))) goto lab2;
+                while(1) { /* gopast, line 59 */
+                    if (!(out_grouping(z, g_v, 97, 249))) goto lab6;
+                    break;
+                lab6:
+                    if (z->c >= z->l) goto lab2;
+                    z->c++; /* gopast, line 59 */
+                }
+            }
+        lab3:
+            goto lab1;
+        lab2:
+            z->c = c;
+            if (!(out_grouping(z, g_v, 97, 249))) goto lab0;
+            {   int c = z->c; /* or, line 61 */
+                if (!(out_grouping(z, g_v, 97, 249))) goto lab8;
+                while(1) { /* gopast, line 61 */
+                    if (!(in_grouping(z, g_v, 97, 249))) goto lab9;
+                    break;
+                lab9:
+                    if (z->c >= z->l) goto lab8;
+                    z->c++; /* gopast, line 61 */
+                }
+                goto lab7;
+            lab8:
+                z->c = c;
+                if (!(in_grouping(z, g_v, 97, 249))) goto lab0;
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 61 */
+            }
+        lab7:
+            ;
+        }
+    lab1:
+        z->I[0] = z->c; /* setmark pV, line 62 */
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 64 */
+        while(1) { /* gopast, line 65 */
+            if (!(in_grouping(z, g_v, 97, 249))) goto lab11;
+            break;
+        lab11:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 65 */
+        }
+        while(1) { /* gopast, line 65 */
+            if (!(out_grouping(z, g_v, 97, 249))) goto lab12;
+            break;
+        lab12:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 65 */
+        }
+        z->I[1] = z->c; /* setmark p1, line 65 */
+        while(1) { /* gopast, line 66 */
+            if (!(in_grouping(z, g_v, 97, 249))) goto lab13;
+            break;
+        lab13:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 66 */
+        }
+        while(1) { /* gopast, line 66 */
+            if (!(out_grouping(z, g_v, 97, 249))) goto lab14;
+            break;
+        lab14:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 66 */
+        }
+        z->I[2] = z->c; /* setmark p2, line 66 */
+    lab10:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 70 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 72 */
+        among_var = find_among(z, a_1, 3); /* substring, line 72 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 72 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_10); /* <-, line 73 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_11); /* <-, line 74 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 75 */
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_RV(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[2] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_attached_pronoun(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 87 */
+    if (!(find_among_b(z, a_2, 37))) return 0; /* substring, line 87 */
+    z->bra = z->c; /* ], line 87 */
+    among_var = find_among_b(z, a_3, 5); /* among, line 97 */
+    if (!(among_var)) return 0;
+    {   int ret = r_RV(z);
+        if (ret == 0) return 0; /* call RV, line 97 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 98 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 1, s_12); /* <-, line 99 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 104 */
+    among_var = find_among_b(z, a_6, 51); /* substring, line 104 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 104 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 111 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 111 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 113 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 113 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 114 */
+                z->ket = z->c; /* [, line 114 */
+                if (!(eq_s_b(z, 2, s_13))) { z->c = z->l - m; goto lab0; }
+                z->bra = z->c; /* ], line 114 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 114 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 114 */
+                    if (ret < 0) return ret;
+                }
+            lab0:
+                ;
+            }
+            break;
+        case 3:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 117 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_14); /* <-, line 117 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 119 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_15); /* <-, line 119 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 121 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 4, s_16); /* <-, line 121 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 123 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 123 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 7:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 125 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 125 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 126 */
+                z->ket = z->c; /* [, line 127 */
+                among_var = find_among_b(z, a_4, 4); /* substring, line 127 */
+                if (!(among_var)) { z->c = z->l - m; goto lab1; }
+                z->bra = z->c; /* ], line 127 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 127 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 127 */
+                    if (ret < 0) return ret;
+                }
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab1; }
+                    case 1:
+                        z->ket = z->c; /* [, line 128 */
+                        if (!(eq_s_b(z, 2, s_17))) { z->c = z->l - m; goto lab1; }
+                        z->bra = z->c; /* ], line 128 */
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 128 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 128 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab1:
+                ;
+            }
+            break;
+        case 8:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 134 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 134 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 135 */
+                z->ket = z->c; /* [, line 136 */
+                among_var = find_among_b(z, a_5, 3); /* substring, line 136 */
+                if (!(among_var)) { z->c = z->l - m; goto lab2; }
+                z->bra = z->c; /* ], line 136 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab2; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 137 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 137 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab2:
+                ;
+            }
+            break;
+        case 9:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 142 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 142 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 143 */
+                z->ket = z->c; /* [, line 143 */
+                if (!(eq_s_b(z, 2, s_18))) { z->c = z->l - m; goto lab3; }
+                z->bra = z->c; /* ], line 143 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 143 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 143 */
+                    if (ret < 0) return ret;
+                }
+                z->ket = z->c; /* [, line 143 */
+                if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m; goto lab3; }
+                z->bra = z->c; /* ], line 143 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 143 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 143 */
+                    if (ret < 0) return ret;
+                }
+            lab3:
+                ;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 148 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 148 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 149 */
+        among_var = find_among_b(z, a_7, 87); /* substring, line 149 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 149 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 163 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_vowel_suffix(struct SN_env * z) {
+    {   int m = z->l - z->c; (void) m; /* try, line 171 */
+        z->ket = z->c; /* [, line 172 */
+        if (!(in_grouping_b(z, g_AEIO, 97, 242))) { z->c = z->l - m; goto lab0; }
+        z->bra = z->c; /* ], line 172 */
+        {   int ret = r_RV(z);
+            if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 172 */
+            if (ret < 0) return ret;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 172 */
+            if (ret < 0) return ret;
+        }
+        z->ket = z->c; /* [, line 173 */
+        if (!(eq_s_b(z, 1, s_20))) { z->c = z->l - m; goto lab0; }
+        z->bra = z->c; /* ], line 173 */
+        {   int ret = r_RV(z);
+            if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 173 */
+            if (ret < 0) return ret;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 173 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        ;
+    }
+    {   int m = z->l - z->c; (void) m; /* try, line 175 */
+        z->ket = z->c; /* [, line 176 */
+        if (!(eq_s_b(z, 1, s_21))) { z->c = z->l - m; goto lab1; }
+        z->bra = z->c; /* ], line 176 */
+        if (!(in_grouping_b(z, g_CG, 99, 103))) { z->c = z->l - m; goto lab1; }
+        {   int ret = r_RV(z);
+            if (ret == 0) { z->c = z->l - m; goto lab1; } /* call RV, line 176 */
+            if (ret < 0) return ret;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 176 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        ;
+    }
+    return 1;
+}
+
+extern int italian_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 182 */
+        {   int ret = r_prelude(z);
+            if (ret == 0) goto lab0; /* call prelude, line 182 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 183 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab1; /* call mark_regions, line 183 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 184 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 185 */
+        {   int ret = r_attached_pronoun(z);
+            if (ret == 0) goto lab2; /* call attached_pronoun, line 185 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 186 */
+        {   int m = z->l - z->c; (void) m; /* or, line 186 */
+            {   int ret = r_standard_suffix(z);
+                if (ret == 0) goto lab5; /* call standard_suffix, line 186 */
+                if (ret < 0) return ret;
+            }
+            goto lab4;
+        lab5:
+            z->c = z->l - m;
+            {   int ret = r_verb_suffix(z);
+                if (ret == 0) goto lab3; /* call verb_suffix, line 186 */
+                if (ret < 0) return ret;
+            }
+        }
+    lab4:
+    lab3:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 187 */
+        {   int ret = r_vowel_suffix(z);
+            if (ret == 0) goto lab6; /* call vowel_suffix, line 187 */
+            if (ret < 0) return ret;
+        }
+    lab6:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 189 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab7; /* call postlude, line 189 */
+            if (ret < 0) return ret;
+        }
+    lab7:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * italian_ISO_8859_1_create_env(void) { return SN_create_env(0, 3, 0); }
+
+extern void italian_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_italian.h b/libstemmer_c/src_c/stem_ISO_8859_1_italian.h
new file mode 100644
index 0000000..dccbfd5
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_italian.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * italian_ISO_8859_1_create_env(void);
+extern void italian_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int italian_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_norwegian.c b/libstemmer_c/src_c/stem_ISO_8859_1_norwegian.c
new file mode 100644
index 0000000..c28e2f0
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_norwegian.c
@@ -0,0 +1,296 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int norwegian_ISO_8859_1_stem(struct SN_env * z);
+static int r_other_suffix(struct SN_env * z);
+static int r_consonant_pair(struct SN_env * z);
+static int r_main_suffix(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+
+extern struct SN_env * norwegian_ISO_8859_1_create_env(void);
+extern void norwegian_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_0[1] = { 'a' };
+static symbol s_0_1[1] = { 'e' };
+static symbol s_0_2[3] = { 'e', 'd', 'e' };
+static symbol s_0_3[4] = { 'a', 'n', 'd', 'e' };
+static symbol s_0_4[4] = { 'e', 'n', 'd', 'e' };
+static symbol s_0_5[3] = { 'a', 'n', 'e' };
+static symbol s_0_6[3] = { 'e', 'n', 'e' };
+static symbol s_0_7[6] = { 'h', 'e', 't', 'e', 'n', 'e' };
+static symbol s_0_8[4] = { 'e', 'r', 't', 'e' };
+static symbol s_0_9[2] = { 'e', 'n' };
+static symbol s_0_10[5] = { 'h', 'e', 't', 'e', 'n' };
+static symbol s_0_11[2] = { 'a', 'r' };
+static symbol s_0_12[2] = { 'e', 'r' };
+static symbol s_0_13[5] = { 'h', 'e', 't', 'e', 'r' };
+static symbol s_0_14[1] = { 's' };
+static symbol s_0_15[2] = { 'a', 's' };
+static symbol s_0_16[2] = { 'e', 's' };
+static symbol s_0_17[4] = { 'e', 'd', 'e', 's' };
+static symbol s_0_18[5] = { 'e', 'n', 'd', 'e', 's' };
+static symbol s_0_19[4] = { 'e', 'n', 'e', 's' };
+static symbol s_0_20[7] = { 'h', 'e', 't', 'e', 'n', 'e', 's' };
+static symbol s_0_21[3] = { 'e', 'n', 's' };
+static symbol s_0_22[6] = { 'h', 'e', 't', 'e', 'n', 's' };
+static symbol s_0_23[3] = { 'e', 'r', 's' };
+static symbol s_0_24[3] = { 'e', 't', 's' };
+static symbol s_0_25[2] = { 'e', 't' };
+static symbol s_0_26[3] = { 'h', 'e', 't' };
+static symbol s_0_27[3] = { 'e', 'r', 't' };
+static symbol s_0_28[3] = { 'a', 's', 't' };
+
+static struct among a_0[29] =
+{
+/*  0 */ { 1, s_0_0, -1, 1, 0},
+/*  1 */ { 1, s_0_1, -1, 1, 0},
+/*  2 */ { 3, s_0_2, 1, 1, 0},
+/*  3 */ { 4, s_0_3, 1, 1, 0},
+/*  4 */ { 4, s_0_4, 1, 1, 0},
+/*  5 */ { 3, s_0_5, 1, 1, 0},
+/*  6 */ { 3, s_0_6, 1, 1, 0},
+/*  7 */ { 6, s_0_7, 6, 1, 0},
+/*  8 */ { 4, s_0_8, 1, 3, 0},
+/*  9 */ { 2, s_0_9, -1, 1, 0},
+/* 10 */ { 5, s_0_10, 9, 1, 0},
+/* 11 */ { 2, s_0_11, -1, 1, 0},
+/* 12 */ { 2, s_0_12, -1, 1, 0},
+/* 13 */ { 5, s_0_13, 12, 1, 0},
+/* 14 */ { 1, s_0_14, -1, 2, 0},
+/* 15 */ { 2, s_0_15, 14, 1, 0},
+/* 16 */ { 2, s_0_16, 14, 1, 0},
+/* 17 */ { 4, s_0_17, 16, 1, 0},
+/* 18 */ { 5, s_0_18, 16, 1, 0},
+/* 19 */ { 4, s_0_19, 16, 1, 0},
+/* 20 */ { 7, s_0_20, 19, 1, 0},
+/* 21 */ { 3, s_0_21, 14, 1, 0},
+/* 22 */ { 6, s_0_22, 21, 1, 0},
+/* 23 */ { 3, s_0_23, 14, 1, 0},
+/* 24 */ { 3, s_0_24, 14, 1, 0},
+/* 25 */ { 2, s_0_25, -1, 1, 0},
+/* 26 */ { 3, s_0_26, 25, 1, 0},
+/* 27 */ { 3, s_0_27, -1, 3, 0},
+/* 28 */ { 3, s_0_28, -1, 1, 0}
+};
+
+static symbol s_1_0[2] = { 'd', 't' };
+static symbol s_1_1[2] = { 'v', 't' };
+
+static struct among a_1[2] =
+{
+/*  0 */ { 2, s_1_0, -1, -1, 0},
+/*  1 */ { 2, s_1_1, -1, -1, 0}
+};
+
+static symbol s_2_0[3] = { 'l', 'e', 'g' };
+static symbol s_2_1[4] = { 'e', 'l', 'e', 'g' };
+static symbol s_2_2[2] = { 'i', 'g' };
+static symbol s_2_3[3] = { 'e', 'i', 'g' };
+static symbol s_2_4[3] = { 'l', 'i', 'g' };
+static symbol s_2_5[4] = { 'e', 'l', 'i', 'g' };
+static symbol s_2_6[3] = { 'e', 'l', 's' };
+static symbol s_2_7[3] = { 'l', 'o', 'v' };
+static symbol s_2_8[4] = { 'e', 'l', 'o', 'v' };
+static symbol s_2_9[4] = { 's', 'l', 'o', 'v' };
+static symbol s_2_10[7] = { 'h', 'e', 't', 's', 'l', 'o', 'v' };
+
+static struct among a_2[11] =
+{
+/*  0 */ { 3, s_2_0, -1, 1, 0},
+/*  1 */ { 4, s_2_1, 0, 1, 0},
+/*  2 */ { 2, s_2_2, -1, 1, 0},
+/*  3 */ { 3, s_2_3, 2, 1, 0},
+/*  4 */ { 3, s_2_4, 2, 1, 0},
+/*  5 */ { 4, s_2_5, 4, 1, 0},
+/*  6 */ { 3, s_2_6, -1, 1, 0},
+/*  7 */ { 3, s_2_7, -1, 1, 0},
+/*  8 */ { 4, s_2_8, 7, 1, 0},
+/*  9 */ { 4, s_2_9, 7, 1, 0},
+/* 10 */ { 7, s_2_10, 9, 1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128 };
+
+static unsigned char g_s_ending[] = { 119, 125, 149, 1 };
+
+static symbol s_0[] = { 'k' };
+static symbol s_1[] = { 'e', 'r' };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    {   int c_test = z->c; /* test, line 30 */
+        {   int c = z->c + 3;
+            if (0 > c || c > z->l) return 0;
+            z->c = c; /* hop, line 30 */
+        }
+        z->I[1] = z->c; /* setmark x, line 30 */
+        z->c = c_test;
+    }
+    while(1) { /* goto, line 31 */
+        int c = z->c;
+        if (!(in_grouping(z, g_v, 97, 248))) goto lab0;
+        z->c = c;
+        break;
+    lab0:
+        z->c = c;
+        if (z->c >= z->l) return 0;
+        z->c++; /* goto, line 31 */
+    }
+    while(1) { /* gopast, line 31 */
+        if (!(out_grouping(z, g_v, 97, 248))) goto lab1;
+        break;
+    lab1:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 31 */
+    }
+    z->I[0] = z->c; /* setmark p1, line 31 */
+     /* try, line 32 */
+    if (!(z->I[0] < z->I[1])) goto lab2;
+    z->I[0] = z->I[1];
+lab2:
+    return 1;
+}
+
+static int r_main_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 38 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 38 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 38 */
+        among_var = find_among_b(z, a_0, 29); /* substring, line 38 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 38 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 44 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m = z->l - z->c; (void) m; /* or, line 46 */
+                if (!(in_grouping_b(z, g_s_ending, 98, 122))) goto lab1;
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_0))) return 0;
+                if (!(out_grouping_b(z, g_v, 97, 248))) return 0;
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 46 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_1); /* <-, line 48 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_consonant_pair(struct SN_env * z) {
+    {   int m_test = z->l - z->c; /* test, line 53 */
+        {   int m3; /* setlimit, line 54 */
+            int m = z->l - z->c; (void) m;
+            if (z->c < z->I[0]) return 0;
+            z->c = z->I[0]; /* tomark, line 54 */
+            m3 = z->lb; z->lb = z->c;
+            z->c = z->l - m;
+            z->ket = z->c; /* [, line 54 */
+            if (!(find_among_b(z, a_1, 2))) { z->lb = m3; return 0; } /* substring, line 54 */
+            z->bra = z->c; /* ], line 54 */
+            z->lb = m3;
+        }
+        z->c = z->l - m_test;
+    }
+    if (z->c <= z->lb) return 0;
+    z->c--; /* next, line 59 */
+    z->bra = z->c; /* ], line 59 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 59 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_other_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 63 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 63 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 63 */
+        among_var = find_among_b(z, a_2, 11); /* substring, line 63 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 63 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 67 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+extern int norwegian_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 74 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 74 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 75 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 76 */
+        {   int ret = r_main_suffix(z);
+            if (ret == 0) goto lab1; /* call main_suffix, line 76 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 77 */
+        {   int ret = r_consonant_pair(z);
+            if (ret == 0) goto lab2; /* call consonant_pair, line 77 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 78 */
+        {   int ret = r_other_suffix(z);
+            if (ret == 0) goto lab3; /* call other_suffix, line 78 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * norwegian_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 0); }
+
+extern void norwegian_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_norwegian.h b/libstemmer_c/src_c/stem_ISO_8859_1_norwegian.h
new file mode 100644
index 0000000..e09e34e
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_norwegian.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * norwegian_ISO_8859_1_create_env(void);
+extern void norwegian_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int norwegian_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_porter.c b/libstemmer_c/src_c/stem_ISO_8859_1_porter.c
new file mode 100644
index 0000000..b2c6ad0
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_porter.c
@@ -0,0 +1,776 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int porter_ISO_8859_1_stem(struct SN_env * z);
+static int r_Step_5b(struct SN_env * z);
+static int r_Step_5a(struct SN_env * z);
+static int r_Step_4(struct SN_env * z);
+static int r_Step_3(struct SN_env * z);
+static int r_Step_2(struct SN_env * z);
+static int r_Step_1c(struct SN_env * z);
+static int r_Step_1b(struct SN_env * z);
+static int r_Step_1a(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_shortv(struct SN_env * z);
+
+extern struct SN_env * porter_ISO_8859_1_create_env(void);
+extern void porter_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_0[1] = { 's' };
+static symbol s_0_1[3] = { 'i', 'e', 's' };
+static symbol s_0_2[4] = { 's', 's', 'e', 's' };
+static symbol s_0_3[2] = { 's', 's' };
+
+static struct among a_0[4] =
+{
+/*  0 */ { 1, s_0_0, -1, 3, 0},
+/*  1 */ { 3, s_0_1, 0, 2, 0},
+/*  2 */ { 4, s_0_2, 0, 1, 0},
+/*  3 */ { 2, s_0_3, 0, -1, 0}
+};
+
+static symbol s_1_1[2] = { 'b', 'b' };
+static symbol s_1_2[2] = { 'd', 'd' };
+static symbol s_1_3[2] = { 'f', 'f' };
+static symbol s_1_4[2] = { 'g', 'g' };
+static symbol s_1_5[2] = { 'b', 'l' };
+static symbol s_1_6[2] = { 'm', 'm' };
+static symbol s_1_7[2] = { 'n', 'n' };
+static symbol s_1_8[2] = { 'p', 'p' };
+static symbol s_1_9[2] = { 'r', 'r' };
+static symbol s_1_10[2] = { 'a', 't' };
+static symbol s_1_11[2] = { 't', 't' };
+static symbol s_1_12[2] = { 'i', 'z' };
+
+static struct among a_1[13] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 2, s_1_1, 0, 2, 0},
+/*  2 */ { 2, s_1_2, 0, 2, 0},
+/*  3 */ { 2, s_1_3, 0, 2, 0},
+/*  4 */ { 2, s_1_4, 0, 2, 0},
+/*  5 */ { 2, s_1_5, 0, 1, 0},
+/*  6 */ { 2, s_1_6, 0, 2, 0},
+/*  7 */ { 2, s_1_7, 0, 2, 0},
+/*  8 */ { 2, s_1_8, 0, 2, 0},
+/*  9 */ { 2, s_1_9, 0, 2, 0},
+/* 10 */ { 2, s_1_10, 0, 1, 0},
+/* 11 */ { 2, s_1_11, 0, 2, 0},
+/* 12 */ { 2, s_1_12, 0, 1, 0}
+};
+
+static symbol s_2_0[2] = { 'e', 'd' };
+static symbol s_2_1[3] = { 'e', 'e', 'd' };
+static symbol s_2_2[3] = { 'i', 'n', 'g' };
+
+static struct among a_2[3] =
+{
+/*  0 */ { 2, s_2_0, -1, 2, 0},
+/*  1 */ { 3, s_2_1, 0, 1, 0},
+/*  2 */ { 3, s_2_2, -1, 2, 0}
+};
+
+static symbol s_3_0[4] = { 'a', 'n', 'c', 'i' };
+static symbol s_3_1[4] = { 'e', 'n', 'c', 'i' };
+static symbol s_3_2[4] = { 'a', 'b', 'l', 'i' };
+static symbol s_3_3[3] = { 'e', 'l', 'i' };
+static symbol s_3_4[4] = { 'a', 'l', 'l', 'i' };
+static symbol s_3_5[5] = { 'o', 'u', 's', 'l', 'i' };
+static symbol s_3_6[5] = { 'e', 'n', 't', 'l', 'i' };
+static symbol s_3_7[5] = { 'a', 'l', 'i', 't', 'i' };
+static symbol s_3_8[6] = { 'b', 'i', 'l', 'i', 't', 'i' };
+static symbol s_3_9[5] = { 'i', 'v', 'i', 't', 'i' };
+static symbol s_3_10[6] = { 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_3_11[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_3_12[5] = { 'a', 'l', 'i', 's', 'm' };
+static symbol s_3_13[5] = { 'a', 't', 'i', 'o', 'n' };
+static symbol s_3_14[7] = { 'i', 'z', 'a', 't', 'i', 'o', 'n' };
+static symbol s_3_15[4] = { 'i', 'z', 'e', 'r' };
+static symbol s_3_16[4] = { 'a', 't', 'o', 'r' };
+static symbol s_3_17[7] = { 'i', 'v', 'e', 'n', 'e', 's', 's' };
+static symbol s_3_18[7] = { 'f', 'u', 'l', 'n', 'e', 's', 's' };
+static symbol s_3_19[7] = { 'o', 'u', 's', 'n', 'e', 's', 's' };
+
+static struct among a_3[20] =
+{
+/*  0 */ { 4, s_3_0, -1, 3, 0},
+/*  1 */ { 4, s_3_1, -1, 2, 0},
+/*  2 */ { 4, s_3_2, -1, 4, 0},
+/*  3 */ { 3, s_3_3, -1, 6, 0},
+/*  4 */ { 4, s_3_4, -1, 9, 0},
+/*  5 */ { 5, s_3_5, -1, 12, 0},
+/*  6 */ { 5, s_3_6, -1, 5, 0},
+/*  7 */ { 5, s_3_7, -1, 10, 0},
+/*  8 */ { 6, s_3_8, -1, 14, 0},
+/*  9 */ { 5, s_3_9, -1, 13, 0},
+/* 10 */ { 6, s_3_10, -1, 1, 0},
+/* 11 */ { 7, s_3_11, 10, 8, 0},
+/* 12 */ { 5, s_3_12, -1, 10, 0},
+/* 13 */ { 5, s_3_13, -1, 8, 0},
+/* 14 */ { 7, s_3_14, 13, 7, 0},
+/* 15 */ { 4, s_3_15, -1, 7, 0},
+/* 16 */ { 4, s_3_16, -1, 8, 0},
+/* 17 */ { 7, s_3_17, -1, 13, 0},
+/* 18 */ { 7, s_3_18, -1, 11, 0},
+/* 19 */ { 7, s_3_19, -1, 12, 0}
+};
+
+static symbol s_4_0[5] = { 'i', 'c', 'a', 't', 'e' };
+static symbol s_4_1[5] = { 'a', 't', 'i', 'v', 'e' };
+static symbol s_4_2[5] = { 'a', 'l', 'i', 'z', 'e' };
+static symbol s_4_3[5] = { 'i', 'c', 'i', 't', 'i' };
+static symbol s_4_4[4] = { 'i', 'c', 'a', 'l' };
+static symbol s_4_5[3] = { 'f', 'u', 'l' };
+static symbol s_4_6[4] = { 'n', 'e', 's', 's' };
+
+static struct among a_4[7] =
+{
+/*  0 */ { 5, s_4_0, -1, 2, 0},
+/*  1 */ { 5, s_4_1, -1, 3, 0},
+/*  2 */ { 5, s_4_2, -1, 1, 0},
+/*  3 */ { 5, s_4_3, -1, 2, 0},
+/*  4 */ { 4, s_4_4, -1, 2, 0},
+/*  5 */ { 3, s_4_5, -1, 3, 0},
+/*  6 */ { 4, s_4_6, -1, 3, 0}
+};
+
+static symbol s_5_0[2] = { 'i', 'c' };
+static symbol s_5_1[4] = { 'a', 'n', 'c', 'e' };
+static symbol s_5_2[4] = { 'e', 'n', 'c', 'e' };
+static symbol s_5_3[4] = { 'a', 'b', 'l', 'e' };
+static symbol s_5_4[4] = { 'i', 'b', 'l', 'e' };
+static symbol s_5_5[3] = { 'a', 't', 'e' };
+static symbol s_5_6[3] = { 'i', 'v', 'e' };
+static symbol s_5_7[3] = { 'i', 'z', 'e' };
+static symbol s_5_8[3] = { 'i', 't', 'i' };
+static symbol s_5_9[2] = { 'a', 'l' };
+static symbol s_5_10[3] = { 'i', 's', 'm' };
+static symbol s_5_11[3] = { 'i', 'o', 'n' };
+static symbol s_5_12[2] = { 'e', 'r' };
+static symbol s_5_13[3] = { 'o', 'u', 's' };
+static symbol s_5_14[3] = { 'a', 'n', 't' };
+static symbol s_5_15[3] = { 'e', 'n', 't' };
+static symbol s_5_16[4] = { 'm', 'e', 'n', 't' };
+static symbol s_5_17[5] = { 'e', 'm', 'e', 'n', 't' };
+static symbol s_5_18[2] = { 'o', 'u' };
+
+static struct among a_5[19] =
+{
+/*  0 */ { 2, s_5_0, -1, 1, 0},
+/*  1 */ { 4, s_5_1, -1, 1, 0},
+/*  2 */ { 4, s_5_2, -1, 1, 0},
+/*  3 */ { 4, s_5_3, -1, 1, 0},
+/*  4 */ { 4, s_5_4, -1, 1, 0},
+/*  5 */ { 3, s_5_5, -1, 1, 0},
+/*  6 */ { 3, s_5_6, -1, 1, 0},
+/*  7 */ { 3, s_5_7, -1, 1, 0},
+/*  8 */ { 3, s_5_8, -1, 1, 0},
+/*  9 */ { 2, s_5_9, -1, 1, 0},
+/* 10 */ { 3, s_5_10, -1, 1, 0},
+/* 11 */ { 3, s_5_11, -1, 2, 0},
+/* 12 */ { 2, s_5_12, -1, 1, 0},
+/* 13 */ { 3, s_5_13, -1, 1, 0},
+/* 14 */ { 3, s_5_14, -1, 1, 0},
+/* 15 */ { 3, s_5_15, -1, 1, 0},
+/* 16 */ { 4, s_5_16, 15, 1, 0},
+/* 17 */ { 5, s_5_17, 16, 1, 0},
+/* 18 */ { 2, s_5_18, -1, 1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1 };
+
+static unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 };
+
+static symbol s_0[] = { 's', 's' };
+static symbol s_1[] = { 'i' };
+static symbol s_2[] = { 'e', 'e' };
+static symbol s_3[] = { 'e' };
+static symbol s_4[] = { 'e' };
+static symbol s_5[] = { 'y' };
+static symbol s_6[] = { 'Y' };
+static symbol s_7[] = { 'i' };
+static symbol s_8[] = { 't', 'i', 'o', 'n' };
+static symbol s_9[] = { 'e', 'n', 'c', 'e' };
+static symbol s_10[] = { 'a', 'n', 'c', 'e' };
+static symbol s_11[] = { 'a', 'b', 'l', 'e' };
+static symbol s_12[] = { 'e', 'n', 't' };
+static symbol s_13[] = { 'e' };
+static symbol s_14[] = { 'i', 'z', 'e' };
+static symbol s_15[] = { 'a', 't', 'e' };
+static symbol s_16[] = { 'a', 'l' };
+static symbol s_17[] = { 'a', 'l' };
+static symbol s_18[] = { 'f', 'u', 'l' };
+static symbol s_19[] = { 'o', 'u', 's' };
+static symbol s_20[] = { 'i', 'v', 'e' };
+static symbol s_21[] = { 'b', 'l', 'e' };
+static symbol s_22[] = { 'a', 'l' };
+static symbol s_23[] = { 'i', 'c' };
+static symbol s_24[] = { 's' };
+static symbol s_25[] = { 't' };
+static symbol s_26[] = { 'e' };
+static symbol s_27[] = { 'l' };
+static symbol s_28[] = { 'l' };
+static symbol s_29[] = { 'y' };
+static symbol s_30[] = { 'Y' };
+static symbol s_31[] = { 'y' };
+static symbol s_32[] = { 'Y' };
+static symbol s_33[] = { 'Y' };
+static symbol s_34[] = { 'y' };
+
+static int r_shortv(struct SN_env * z) {
+    if (!(out_grouping_b(z, g_v_WXY, 89, 121))) return 0;
+    if (!(in_grouping_b(z, g_v, 97, 121))) return 0;
+    if (!(out_grouping_b(z, g_v, 97, 121))) return 0;
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_Step_1a(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 25 */
+    among_var = find_among_b(z, a_0, 4); /* substring, line 25 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 25 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_0); /* <-, line 26 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 1, s_1); /* <-, line 27 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 29 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_1b(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 34 */
+    among_var = find_among_b(z, a_2, 3); /* substring, line 34 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 34 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 35 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 2, s_2); /* <-, line 35 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m_test = z->l - z->c; /* test, line 38 */
+                while(1) { /* gopast, line 38 */
+                    if (!(in_grouping_b(z, g_v, 97, 121))) goto lab0;
+                    break;
+                lab0:
+                    if (z->c <= z->lb) return 0;
+                    z->c--; /* gopast, line 38 */
+                }
+                z->c = z->l - m_test;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 38 */
+                if (ret < 0) return ret;
+            }
+            {   int m_test = z->l - z->c; /* test, line 39 */
+                among_var = find_among_b(z, a_1, 13); /* substring, line 39 */
+                if (!(among_var)) return 0;
+                z->c = z->l - m_test;
+            }
+            switch(among_var) {
+                case 0: return 0;
+                case 1:
+                    {   int ret;
+                        {   int c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_3); /* <+, line 41 */
+                            z->c = c;
+                        }
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 2:
+                    z->ket = z->c; /* [, line 44 */
+                    if (z->c <= z->lb) return 0;
+                    z->c--; /* next, line 44 */
+                    z->bra = z->c; /* ], line 44 */
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 44 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 3:
+                    if (z->c != z->I[0]) return 0; /* atmark, line 45 */
+                    {   int m_test = z->l - z->c; /* test, line 45 */
+                        {   int ret = r_shortv(z);
+                            if (ret == 0) return 0; /* call shortv, line 45 */
+                            if (ret < 0) return ret;
+                        }
+                        z->c = z->l - m_test;
+                    }
+                    {   int ret;
+                        {   int c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_4); /* <+, line 45 */
+                            z->c = c;
+                        }
+                        if (ret < 0) return ret;
+                    }
+                    break;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_1c(struct SN_env * z) {
+    z->ket = z->c; /* [, line 52 */
+    {   int m = z->l - z->c; (void) m; /* or, line 52 */
+        if (!(eq_s_b(z, 1, s_5))) goto lab1;
+        goto lab0;
+    lab1:
+        z->c = z->l - m;
+        if (!(eq_s_b(z, 1, s_6))) return 0;
+    }
+lab0:
+    z->bra = z->c; /* ], line 52 */
+    while(1) { /* gopast, line 53 */
+        if (!(in_grouping_b(z, g_v, 97, 121))) goto lab2;
+        break;
+    lab2:
+        if (z->c <= z->lb) return 0;
+        z->c--; /* gopast, line 53 */
+    }
+    {   int ret;
+        ret = slice_from_s(z, 1, s_7); /* <-, line 54 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_Step_2(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 58 */
+    among_var = find_among_b(z, a_3, 20); /* substring, line 58 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 58 */
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 58 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_8); /* <-, line 59 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_9); /* <-, line 60 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_10); /* <-, line 61 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_11); /* <-, line 62 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_12); /* <-, line 63 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret;
+                ret = slice_from_s(z, 1, s_13); /* <-, line 64 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 7:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_14); /* <-, line 66 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 8:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_15); /* <-, line 68 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 9:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_16); /* <-, line 69 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 10:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_17); /* <-, line 71 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 11:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_18); /* <-, line 72 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 12:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_19); /* <-, line 74 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 13:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_20); /* <-, line 76 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 14:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_21); /* <-, line 77 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_3(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 82 */
+    among_var = find_among_b(z, a_4, 7); /* substring, line 82 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 82 */
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 82 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_22); /* <-, line 83 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_23); /* <-, line 85 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 87 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_4(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 92 */
+    among_var = find_among_b(z, a_5, 19); /* substring, line 92 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 92 */
+    {   int ret = r_R2(z);
+        if (ret == 0) return 0; /* call R2, line 92 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 95 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m = z->l - z->c; (void) m; /* or, line 96 */
+                if (!(eq_s_b(z, 1, s_24))) goto lab1;
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_25))) return 0;
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 96 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_5a(struct SN_env * z) {
+    z->ket = z->c; /* [, line 101 */
+    if (!(eq_s_b(z, 1, s_26))) return 0;
+    z->bra = z->c; /* ], line 101 */
+    {   int m = z->l - z->c; (void) m; /* or, line 102 */
+        {   int ret = r_R2(z);
+            if (ret == 0) goto lab1; /* call R2, line 102 */
+            if (ret < 0) return ret;
+        }
+        goto lab0;
+    lab1:
+        z->c = z->l - m;
+        {   int ret = r_R1(z);
+            if (ret == 0) return 0; /* call R1, line 102 */
+            if (ret < 0) return ret;
+        }
+        {   int m = z->l - z->c; (void) m; /* not, line 102 */
+            {   int ret = r_shortv(z);
+                if (ret == 0) goto lab2; /* call shortv, line 102 */
+                if (ret < 0) return ret;
+            }
+            return 0;
+        lab2:
+            z->c = z->l - m;
+        }
+    }
+lab0:
+    {   int ret;
+        ret = slice_del(z); /* delete, line 103 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_Step_5b(struct SN_env * z) {
+    z->ket = z->c; /* [, line 107 */
+    if (!(eq_s_b(z, 1, s_27))) return 0;
+    z->bra = z->c; /* ], line 107 */
+    {   int ret = r_R2(z);
+        if (ret == 0) return 0; /* call R2, line 108 */
+        if (ret < 0) return ret;
+    }
+    if (!(eq_s_b(z, 1, s_28))) return 0;
+    {   int ret;
+        ret = slice_del(z); /* delete, line 109 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+extern int porter_ISO_8859_1_stem(struct SN_env * z) {
+    z->B[0] = 0; /* unset Y_found, line 115 */
+    {   int c = z->c; /* do, line 116 */
+        z->bra = z->c; /* [, line 116 */
+        if (!(eq_s(z, 1, s_29))) goto lab0;
+        z->ket = z->c; /* ], line 116 */
+        {   int ret;
+            ret = slice_from_s(z, 1, s_30); /* <-, line 116 */
+            if (ret < 0) return ret;
+        }
+        z->B[0] = 1; /* set Y_found, line 116 */
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 117 */
+        while(1) { /* repeat, line 117 */
+            int c = z->c;
+            while(1) { /* goto, line 117 */
+                int c = z->c;
+                if (!(in_grouping(z, g_v, 97, 121))) goto lab3;
+                z->bra = z->c; /* [, line 117 */
+                if (!(eq_s(z, 1, s_31))) goto lab3;
+                z->ket = z->c; /* ], line 117 */
+                z->c = c;
+                break;
+            lab3:
+                z->c = c;
+                if (z->c >= z->l) goto lab2;
+                z->c++; /* goto, line 117 */
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_32); /* <-, line 117 */
+                if (ret < 0) return ret;
+            }
+            z->B[0] = 1; /* set Y_found, line 117 */
+            continue;
+        lab2:
+            z->c = c;
+            break;
+        }
+        z->c = c;
+    }
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    {   int c = z->c; /* do, line 121 */
+        while(1) { /* gopast, line 122 */
+            if (!(in_grouping(z, g_v, 97, 121))) goto lab5;
+            break;
+        lab5:
+            if (z->c >= z->l) goto lab4;
+            z->c++; /* gopast, line 122 */
+        }
+        while(1) { /* gopast, line 122 */
+            if (!(out_grouping(z, g_v, 97, 121))) goto lab6;
+            break;
+        lab6:
+            if (z->c >= z->l) goto lab4;
+            z->c++; /* gopast, line 122 */
+        }
+        z->I[0] = z->c; /* setmark p1, line 122 */
+        while(1) { /* gopast, line 123 */
+            if (!(in_grouping(z, g_v, 97, 121))) goto lab7;
+            break;
+        lab7:
+            if (z->c >= z->l) goto lab4;
+            z->c++; /* gopast, line 123 */
+        }
+        while(1) { /* gopast, line 123 */
+            if (!(out_grouping(z, g_v, 97, 121))) goto lab8;
+            break;
+        lab8:
+            if (z->c >= z->l) goto lab4;
+            z->c++; /* gopast, line 123 */
+        }
+        z->I[1] = z->c; /* setmark p2, line 123 */
+    lab4:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 126 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 127 */
+        {   int ret = r_Step_1a(z);
+            if (ret == 0) goto lab9; /* call Step_1a, line 127 */
+            if (ret < 0) return ret;
+        }
+    lab9:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 128 */
+        {   int ret = r_Step_1b(z);
+            if (ret == 0) goto lab10; /* call Step_1b, line 128 */
+            if (ret < 0) return ret;
+        }
+    lab10:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 129 */
+        {   int ret = r_Step_1c(z);
+            if (ret == 0) goto lab11; /* call Step_1c, line 129 */
+            if (ret < 0) return ret;
+        }
+    lab11:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 130 */
+        {   int ret = r_Step_2(z);
+            if (ret == 0) goto lab12; /* call Step_2, line 130 */
+            if (ret < 0) return ret;
+        }
+    lab12:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 131 */
+        {   int ret = r_Step_3(z);
+            if (ret == 0) goto lab13; /* call Step_3, line 131 */
+            if (ret < 0) return ret;
+        }
+    lab13:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 132 */
+        {   int ret = r_Step_4(z);
+            if (ret == 0) goto lab14; /* call Step_4, line 132 */
+            if (ret < 0) return ret;
+        }
+    lab14:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 133 */
+        {   int ret = r_Step_5a(z);
+            if (ret == 0) goto lab15; /* call Step_5a, line 133 */
+            if (ret < 0) return ret;
+        }
+    lab15:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 134 */
+        {   int ret = r_Step_5b(z);
+            if (ret == 0) goto lab16; /* call Step_5b, line 134 */
+            if (ret < 0) return ret;
+        }
+    lab16:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 137 */
+        if (!(z->B[0])) goto lab17; /* Boolean test Y_found, line 137 */
+        while(1) { /* repeat, line 137 */
+            int c = z->c;
+            while(1) { /* goto, line 137 */
+                int c = z->c;
+                z->bra = z->c; /* [, line 137 */
+                if (!(eq_s(z, 1, s_33))) goto lab19;
+                z->ket = z->c; /* ], line 137 */
+                z->c = c;
+                break;
+            lab19:
+                z->c = c;
+                if (z->c >= z->l) goto lab18;
+                z->c++; /* goto, line 137 */
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_34); /* <-, line 137 */
+                if (ret < 0) return ret;
+            }
+            continue;
+        lab18:
+            z->c = c;
+            break;
+        }
+    lab17:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * porter_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 1); }
+
+extern void porter_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_porter.h b/libstemmer_c/src_c/stem_ISO_8859_1_porter.h
new file mode 100644
index 0000000..5c8fd01
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_porter.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * porter_ISO_8859_1_create_env(void);
+extern void porter_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int porter_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_portuguese.c b/libstemmer_c/src_c/stem_ISO_8859_1_portuguese.c
new file mode 100644
index 0000000..d586909
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_portuguese.c
@@ -0,0 +1,1035 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int portuguese_ISO_8859_1_stem(struct SN_env * z);
+static int r_residual_form(struct SN_env * z);
+static int r_residual_suffix(struct SN_env * z);
+static int r_verb_suffix(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_RV(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * portuguese_ISO_8859_1_create_env(void);
+extern void portuguese_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_1[1] = { 0xE3 };
+static symbol s_0_2[1] = { 0xF5 };
+
+static struct among a_0[3] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 1, s_0_1, 0, 1, 0},
+/*  2 */ { 1, s_0_2, 0, 2, 0}
+};
+
+static symbol s_1_1[2] = { 'a', '~' };
+static symbol s_1_2[2] = { 'o', '~' };
+
+static struct among a_1[3] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 2, s_1_1, 0, 1, 0},
+/*  2 */ { 2, s_1_2, 0, 2, 0}
+};
+
+static symbol s_2_0[2] = { 'i', 'c' };
+static symbol s_2_1[2] = { 'a', 'd' };
+static symbol s_2_2[2] = { 'o', 's' };
+static symbol s_2_3[2] = { 'i', 'v' };
+
+static struct among a_2[4] =
+{
+/*  0 */ { 2, s_2_0, -1, -1, 0},
+/*  1 */ { 2, s_2_1, -1, -1, 0},
+/*  2 */ { 2, s_2_2, -1, -1, 0},
+/*  3 */ { 2, s_2_3, -1, 1, 0}
+};
+
+static symbol s_3_0[4] = { 'a', 'n', 't', 'e' };
+static symbol s_3_1[4] = { 'a', 'v', 'e', 'l' };
+static symbol s_3_2[4] = { 0xED, 'v', 'e', 'l' };
+
+static struct among a_3[3] =
+{
+/*  0 */ { 4, s_3_0, -1, 1, 0},
+/*  1 */ { 4, s_3_1, -1, 1, 0},
+/*  2 */ { 4, s_3_2, -1, 1, 0}
+};
+
+static symbol s_4_0[2] = { 'i', 'c' };
+static symbol s_4_1[4] = { 'a', 'b', 'i', 'l' };
+static symbol s_4_2[2] = { 'i', 'v' };
+
+static struct among a_4[3] =
+{
+/*  0 */ { 2, s_4_0, -1, 1, 0},
+/*  1 */ { 4, s_4_1, -1, 1, 0},
+/*  2 */ { 2, s_4_2, -1, 1, 0}
+};
+
+static symbol s_5_0[3] = { 'i', 'c', 'a' };
+static symbol s_5_1[5] = { 0xE2, 'n', 'c', 'i', 'a' };
+static symbol s_5_2[5] = { 0xEA, 'n', 'c', 'i', 'a' };
+static symbol s_5_3[3] = { 'i', 'r', 'a' };
+static symbol s_5_4[5] = { 'a', 'd', 'o', 'r', 'a' };
+static symbol s_5_5[3] = { 'o', 's', 'a' };
+static symbol s_5_6[4] = { 'i', 's', 't', 'a' };
+static symbol s_5_7[3] = { 'i', 'v', 'a' };
+static symbol s_5_8[3] = { 'e', 'z', 'a' };
+static symbol s_5_9[5] = { 'l', 'o', 'g', 0xED, 'a' };
+static symbol s_5_10[5] = { 'i', 'd', 'a', 'd', 'e' };
+static symbol s_5_11[4] = { 'a', 'n', 't', 'e' };
+static symbol s_5_12[5] = { 'm', 'e', 'n', 't', 'e' };
+static symbol s_5_13[6] = { 'a', 'm', 'e', 'n', 't', 'e' };
+static symbol s_5_14[4] = { 0xE1, 'v', 'e', 'l' };
+static symbol s_5_15[4] = { 0xED, 'v', 'e', 'l' };
+static symbol s_5_16[5] = { 'u', 'c', 'i', 0xF3, 'n' };
+static symbol s_5_17[3] = { 'i', 'c', 'o' };
+static symbol s_5_18[4] = { 'i', 's', 'm', 'o' };
+static symbol s_5_19[3] = { 'o', 's', 'o' };
+static symbol s_5_20[6] = { 'a', 'm', 'e', 'n', 't', 'o' };
+static symbol s_5_21[6] = { 'i', 'm', 'e', 'n', 't', 'o' };
+static symbol s_5_22[3] = { 'i', 'v', 'o' };
+static symbol s_5_23[5] = { 'a', 0xE7, 'a', '~', 'o' };
+static symbol s_5_24[4] = { 'a', 'd', 'o', 'r' };
+static symbol s_5_25[4] = { 'i', 'c', 'a', 's' };
+static symbol s_5_26[6] = { 0xEA, 'n', 'c', 'i', 'a', 's' };
+static symbol s_5_27[4] = { 'i', 'r', 'a', 's' };
+static symbol s_5_28[6] = { 'a', 'd', 'o', 'r', 'a', 's' };
+static symbol s_5_29[4] = { 'o', 's', 'a', 's' };
+static symbol s_5_30[5] = { 'i', 's', 't', 'a', 's' };
+static symbol s_5_31[4] = { 'i', 'v', 'a', 's' };
+static symbol s_5_32[4] = { 'e', 'z', 'a', 's' };
+static symbol s_5_33[6] = { 'l', 'o', 'g', 0xED, 'a', 's' };
+static symbol s_5_34[6] = { 'i', 'd', 'a', 'd', 'e', 's' };
+static symbol s_5_35[7] = { 'u', 'c', 'i', 'o', 'n', 'e', 's' };
+static symbol s_5_36[6] = { 'a', 'd', 'o', 'r', 'e', 's' };
+static symbol s_5_37[5] = { 'a', 'n', 't', 'e', 's' };
+static symbol s_5_38[6] = { 'a', 0xE7, 'o', '~', 'e', 's' };
+static symbol s_5_39[4] = { 'i', 'c', 'o', 's' };
+static symbol s_5_40[5] = { 'i', 's', 'm', 'o', 's' };
+static symbol s_5_41[4] = { 'o', 's', 'o', 's' };
+static symbol s_5_42[7] = { 'a', 'm', 'e', 'n', 't', 'o', 's' };
+static symbol s_5_43[7] = { 'i', 'm', 'e', 'n', 't', 'o', 's' };
+static symbol s_5_44[4] = { 'i', 'v', 'o', 's' };
+
+static struct among a_5[45] =
+{
+/*  0 */ { 3, s_5_0, -1, 1, 0},
+/*  1 */ { 5, s_5_1, -1, 1, 0},
+/*  2 */ { 5, s_5_2, -1, 4, 0},
+/*  3 */ { 3, s_5_3, -1, 9, 0},
+/*  4 */ { 5, s_5_4, -1, 1, 0},
+/*  5 */ { 3, s_5_5, -1, 1, 0},
+/*  6 */ { 4, s_5_6, -1, 1, 0},
+/*  7 */ { 3, s_5_7, -1, 8, 0},
+/*  8 */ { 3, s_5_8, -1, 1, 0},
+/*  9 */ { 5, s_5_9, -1, 2, 0},
+/* 10 */ { 5, s_5_10, -1, 7, 0},
+/* 11 */ { 4, s_5_11, -1, 1, 0},
+/* 12 */ { 5, s_5_12, -1, 6, 0},
+/* 13 */ { 6, s_5_13, 12, 5, 0},
+/* 14 */ { 4, s_5_14, -1, 1, 0},
+/* 15 */ { 4, s_5_15, -1, 1, 0},
+/* 16 */ { 5, s_5_16, -1, 3, 0},
+/* 17 */ { 3, s_5_17, -1, 1, 0},
+/* 18 */ { 4, s_5_18, -1, 1, 0},
+/* 19 */ { 3, s_5_19, -1, 1, 0},
+/* 20 */ { 6, s_5_20, -1, 1, 0},
+/* 21 */ { 6, s_5_21, -1, 1, 0},
+/* 22 */ { 3, s_5_22, -1, 8, 0},
+/* 23 */ { 5, s_5_23, -1, 1, 0},
+/* 24 */ { 4, s_5_24, -1, 1, 0},
+/* 25 */ { 4, s_5_25, -1, 1, 0},
+/* 26 */ { 6, s_5_26, -1, 4, 0},
+/* 27 */ { 4, s_5_27, -1, 9, 0},
+/* 28 */ { 6, s_5_28, -1, 1, 0},
+/* 29 */ { 4, s_5_29, -1, 1, 0},
+/* 30 */ { 5, s_5_30, -1, 1, 0},
+/* 31 */ { 4, s_5_31, -1, 8, 0},
+/* 32 */ { 4, s_5_32, -1, 1, 0},
+/* 33 */ { 6, s_5_33, -1, 2, 0},
+/* 34 */ { 6, s_5_34, -1, 7, 0},
+/* 35 */ { 7, s_5_35, -1, 3, 0},
+/* 36 */ { 6, s_5_36, -1, 1, 0},
+/* 37 */ { 5, s_5_37, -1, 1, 0},
+/* 38 */ { 6, s_5_38, -1, 1, 0},
+/* 39 */ { 4, s_5_39, -1, 1, 0},
+/* 40 */ { 5, s_5_40, -1, 1, 0},
+/* 41 */ { 4, s_5_41, -1, 1, 0},
+/* 42 */ { 7, s_5_42, -1, 1, 0},
+/* 43 */ { 7, s_5_43, -1, 1, 0},
+/* 44 */ { 4, s_5_44, -1, 8, 0}
+};
+
+static symbol s_6_0[3] = { 'a', 'd', 'a' };
+static symbol s_6_1[3] = { 'i', 'd', 'a' };
+static symbol s_6_2[2] = { 'i', 'a' };
+static symbol s_6_3[4] = { 'a', 'r', 'i', 'a' };
+static symbol s_6_4[4] = { 'e', 'r', 'i', 'a' };
+static symbol s_6_5[4] = { 'i', 'r', 'i', 'a' };
+static symbol s_6_6[3] = { 'a', 'r', 'a' };
+static symbol s_6_7[3] = { 'e', 'r', 'a' };
+static symbol s_6_8[3] = { 'i', 'r', 'a' };
+static symbol s_6_9[3] = { 'a', 'v', 'a' };
+static symbol s_6_10[4] = { 'a', 's', 's', 'e' };
+static symbol s_6_11[4] = { 'e', 's', 's', 'e' };
+static symbol s_6_12[4] = { 'i', 's', 's', 'e' };
+static symbol s_6_13[4] = { 'a', 's', 't', 'e' };
+static symbol s_6_14[4] = { 'e', 's', 't', 'e' };
+static symbol s_6_15[4] = { 'i', 's', 't', 'e' };
+static symbol s_6_16[2] = { 'e', 'i' };
+static symbol s_6_17[4] = { 'a', 'r', 'e', 'i' };
+static symbol s_6_18[4] = { 'e', 'r', 'e', 'i' };
+static symbol s_6_19[4] = { 'i', 'r', 'e', 'i' };
+static symbol s_6_20[2] = { 'a', 'm' };
+static symbol s_6_21[3] = { 'i', 'a', 'm' };
+static symbol s_6_22[5] = { 'a', 'r', 'i', 'a', 'm' };
+static symbol s_6_23[5] = { 'e', 'r', 'i', 'a', 'm' };
+static symbol s_6_24[5] = { 'i', 'r', 'i', 'a', 'm' };
+static symbol s_6_25[4] = { 'a', 'r', 'a', 'm' };
+static symbol s_6_26[4] = { 'e', 'r', 'a', 'm' };
+static symbol s_6_27[4] = { 'i', 'r', 'a', 'm' };
+static symbol s_6_28[4] = { 'a', 'v', 'a', 'm' };
+static symbol s_6_29[2] = { 'e', 'm' };
+static symbol s_6_30[4] = { 'a', 'r', 'e', 'm' };
+static symbol s_6_31[4] = { 'e', 'r', 'e', 'm' };
+static symbol s_6_32[4] = { 'i', 'r', 'e', 'm' };
+static symbol s_6_33[5] = { 'a', 's', 's', 'e', 'm' };
+static symbol s_6_34[5] = { 'e', 's', 's', 'e', 'm' };
+static symbol s_6_35[5] = { 'i', 's', 's', 'e', 'm' };
+static symbol s_6_36[3] = { 'a', 'd', 'o' };
+static symbol s_6_37[3] = { 'i', 'd', 'o' };
+static symbol s_6_38[4] = { 'a', 'n', 'd', 'o' };
+static symbol s_6_39[4] = { 'e', 'n', 'd', 'o' };
+static symbol s_6_40[4] = { 'i', 'n', 'd', 'o' };
+static symbol s_6_41[5] = { 'a', 'r', 'a', '~', 'o' };
+static symbol s_6_42[5] = { 'e', 'r', 'a', '~', 'o' };
+static symbol s_6_43[5] = { 'i', 'r', 'a', '~', 'o' };
+static symbol s_6_44[2] = { 'a', 'r' };
+static symbol s_6_45[2] = { 'e', 'r' };
+static symbol s_6_46[2] = { 'i', 'r' };
+static symbol s_6_47[2] = { 'a', 's' };
+static symbol s_6_48[4] = { 'a', 'd', 'a', 's' };
+static symbol s_6_49[4] = { 'i', 'd', 'a', 's' };
+static symbol s_6_50[3] = { 'i', 'a', 's' };
+static symbol s_6_51[5] = { 'a', 'r', 'i', 'a', 's' };
+static symbol s_6_52[5] = { 'e', 'r', 'i', 'a', 's' };
+static symbol s_6_53[5] = { 'i', 'r', 'i', 'a', 's' };
+static symbol s_6_54[4] = { 'a', 'r', 'a', 's' };
+static symbol s_6_55[4] = { 'e', 'r', 'a', 's' };
+static symbol s_6_56[4] = { 'i', 'r', 'a', 's' };
+static symbol s_6_57[4] = { 'a', 'v', 'a', 's' };
+static symbol s_6_58[2] = { 'e', 's' };
+static symbol s_6_59[5] = { 'a', 'r', 'd', 'e', 's' };
+static symbol s_6_60[5] = { 'e', 'r', 'd', 'e', 's' };
+static symbol s_6_61[5] = { 'i', 'r', 'd', 'e', 's' };
+static symbol s_6_62[4] = { 'a', 'r', 'e', 's' };
+static symbol s_6_63[4] = { 'e', 'r', 'e', 's' };
+static symbol s_6_64[4] = { 'i', 'r', 'e', 's' };
+static symbol s_6_65[5] = { 'a', 's', 's', 'e', 's' };
+static symbol s_6_66[5] = { 'e', 's', 's', 'e', 's' };
+static symbol s_6_67[5] = { 'i', 's', 's', 'e', 's' };
+static symbol s_6_68[5] = { 'a', 's', 't', 'e', 's' };
+static symbol s_6_69[5] = { 'e', 's', 't', 'e', 's' };
+static symbol s_6_70[5] = { 'i', 's', 't', 'e', 's' };
+static symbol s_6_71[2] = { 'i', 's' };
+static symbol s_6_72[3] = { 'a', 'i', 's' };
+static symbol s_6_73[3] = { 'e', 'i', 's' };
+static symbol s_6_74[5] = { 'a', 'r', 'e', 'i', 's' };
+static symbol s_6_75[5] = { 'e', 'r', 'e', 'i', 's' };
+static symbol s_6_76[5] = { 'i', 'r', 'e', 'i', 's' };
+static symbol s_6_77[5] = { 0xE1, 'r', 'e', 'i', 's' };
+static symbol s_6_78[5] = { 0xE9, 'r', 'e', 'i', 's' };
+static symbol s_6_79[5] = { 0xED, 'r', 'e', 'i', 's' };
+static symbol s_6_80[6] = { 0xE1, 's', 's', 'e', 'i', 's' };
+static symbol s_6_81[6] = { 0xE9, 's', 's', 'e', 'i', 's' };
+static symbol s_6_82[6] = { 0xED, 's', 's', 'e', 'i', 's' };
+static symbol s_6_83[5] = { 0xE1, 'v', 'e', 'i', 's' };
+static symbol s_6_84[4] = { 0xED, 'e', 'i', 's' };
+static symbol s_6_85[6] = { 'a', 'r', 0xED, 'e', 'i', 's' };
+static symbol s_6_86[6] = { 'e', 'r', 0xED, 'e', 'i', 's' };
+static symbol s_6_87[6] = { 'i', 'r', 0xED, 'e', 'i', 's' };
+static symbol s_6_88[4] = { 'a', 'd', 'o', 's' };
+static symbol s_6_89[4] = { 'i', 'd', 'o', 's' };
+static symbol s_6_90[4] = { 'a', 'm', 'o', 's' };
+static symbol s_6_91[6] = { 0xE1, 'r', 'a', 'm', 'o', 's' };
+static symbol s_6_92[6] = { 0xE9, 'r', 'a', 'm', 'o', 's' };
+static symbol s_6_93[6] = { 0xED, 'r', 'a', 'm', 'o', 's' };
+static symbol s_6_94[6] = { 0xE1, 'v', 'a', 'm', 'o', 's' };
+static symbol s_6_95[5] = { 0xED, 'a', 'm', 'o', 's' };
+static symbol s_6_96[7] = { 'a', 'r', 0xED, 'a', 'm', 'o', 's' };
+static symbol s_6_97[7] = { 'e', 'r', 0xED, 'a', 'm', 'o', 's' };
+static symbol s_6_98[7] = { 'i', 'r', 0xED, 'a', 'm', 'o', 's' };
+static symbol s_6_99[4] = { 'e', 'm', 'o', 's' };
+static symbol s_6_100[6] = { 'a', 'r', 'e', 'm', 'o', 's' };
+static symbol s_6_101[6] = { 'e', 'r', 'e', 'm', 'o', 's' };
+static symbol s_6_102[6] = { 'i', 'r', 'e', 'm', 'o', 's' };
+static symbol s_6_103[7] = { 0xE1, 's', 's', 'e', 'm', 'o', 's' };
+static symbol s_6_104[7] = { 0xEA, 's', 's', 'e', 'm', 'o', 's' };
+static symbol s_6_105[7] = { 0xED, 's', 's', 'e', 'm', 'o', 's' };
+static symbol s_6_106[4] = { 'i', 'm', 'o', 's' };
+static symbol s_6_107[5] = { 'a', 'r', 'm', 'o', 's' };
+static symbol s_6_108[5] = { 'e', 'r', 'm', 'o', 's' };
+static symbol s_6_109[5] = { 'i', 'r', 'm', 'o', 's' };
+static symbol s_6_110[4] = { 0xE1, 'm', 'o', 's' };
+static symbol s_6_111[4] = { 'a', 'r', 0xE1, 's' };
+static symbol s_6_112[4] = { 'e', 'r', 0xE1, 's' };
+static symbol s_6_113[4] = { 'i', 'r', 0xE1, 's' };
+static symbol s_6_114[2] = { 'e', 'u' };
+static symbol s_6_115[2] = { 'i', 'u' };
+static symbol s_6_116[2] = { 'o', 'u' };
+static symbol s_6_117[3] = { 'a', 'r', 0xE1 };
+static symbol s_6_118[3] = { 'e', 'r', 0xE1 };
+static symbol s_6_119[3] = { 'i', 'r', 0xE1 };
+
+static struct among a_6[120] =
+{
+/*  0 */ { 3, s_6_0, -1, 1, 0},
+/*  1 */ { 3, s_6_1, -1, 1, 0},
+/*  2 */ { 2, s_6_2, -1, 1, 0},
+/*  3 */ { 4, s_6_3, 2, 1, 0},
+/*  4 */ { 4, s_6_4, 2, 1, 0},
+/*  5 */ { 4, s_6_5, 2, 1, 0},
+/*  6 */ { 3, s_6_6, -1, 1, 0},
+/*  7 */ { 3, s_6_7, -1, 1, 0},
+/*  8 */ { 3, s_6_8, -1, 1, 0},
+/*  9 */ { 3, s_6_9, -1, 1, 0},
+/* 10 */ { 4, s_6_10, -1, 1, 0},
+/* 11 */ { 4, s_6_11, -1, 1, 0},
+/* 12 */ { 4, s_6_12, -1, 1, 0},
+/* 13 */ { 4, s_6_13, -1, 1, 0},
+/* 14 */ { 4, s_6_14, -1, 1, 0},
+/* 15 */ { 4, s_6_15, -1, 1, 0},
+/* 16 */ { 2, s_6_16, -1, 1, 0},
+/* 17 */ { 4, s_6_17, 16, 1, 0},
+/* 18 */ { 4, s_6_18, 16, 1, 0},
+/* 19 */ { 4, s_6_19, 16, 1, 0},
+/* 20 */ { 2, s_6_20, -1, 1, 0},
+/* 21 */ { 3, s_6_21, 20, 1, 0},
+/* 22 */ { 5, s_6_22, 21, 1, 0},
+/* 23 */ { 5, s_6_23, 21, 1, 0},
+/* 24 */ { 5, s_6_24, 21, 1, 0},
+/* 25 */ { 4, s_6_25, 20, 1, 0},
+/* 26 */ { 4, s_6_26, 20, 1, 0},
+/* 27 */ { 4, s_6_27, 20, 1, 0},
+/* 28 */ { 4, s_6_28, 20, 1, 0},
+/* 29 */ { 2, s_6_29, -1, 1, 0},
+/* 30 */ { 4, s_6_30, 29, 1, 0},
+/* 31 */ { 4, s_6_31, 29, 1, 0},
+/* 32 */ { 4, s_6_32, 29, 1, 0},
+/* 33 */ { 5, s_6_33, 29, 1, 0},
+/* 34 */ { 5, s_6_34, 29, 1, 0},
+/* 35 */ { 5, s_6_35, 29, 1, 0},
+/* 36 */ { 3, s_6_36, -1, 1, 0},
+/* 37 */ { 3, s_6_37, -1, 1, 0},
+/* 38 */ { 4, s_6_38, -1, 1, 0},
+/* 39 */ { 4, s_6_39, -1, 1, 0},
+/* 40 */ { 4, s_6_40, -1, 1, 0},
+/* 41 */ { 5, s_6_41, -1, 1, 0},
+/* 42 */ { 5, s_6_42, -1, 1, 0},
+/* 43 */ { 5, s_6_43, -1, 1, 0},
+/* 44 */ { 2, s_6_44, -1, 1, 0},
+/* 45 */ { 2, s_6_45, -1, 1, 0},
+/* 46 */ { 2, s_6_46, -1, 1, 0},
+/* 47 */ { 2, s_6_47, -1, 1, 0},
+/* 48 */ { 4, s_6_48, 47, 1, 0},
+/* 49 */ { 4, s_6_49, 47, 1, 0},
+/* 50 */ { 3, s_6_50, 47, 1, 0},
+/* 51 */ { 5, s_6_51, 50, 1, 0},
+/* 52 */ { 5, s_6_52, 50, 1, 0},
+/* 53 */ { 5, s_6_53, 50, 1, 0},
+/* 54 */ { 4, s_6_54, 47, 1, 0},
+/* 55 */ { 4, s_6_55, 47, 1, 0},
+/* 56 */ { 4, s_6_56, 47, 1, 0},
+/* 57 */ { 4, s_6_57, 47, 1, 0},
+/* 58 */ { 2, s_6_58, -1, 1, 0},
+/* 59 */ { 5, s_6_59, 58, 1, 0},
+/* 60 */ { 5, s_6_60, 58, 1, 0},
+/* 61 */ { 5, s_6_61, 58, 1, 0},
+/* 62 */ { 4, s_6_62, 58, 1, 0},
+/* 63 */ { 4, s_6_63, 58, 1, 0},
+/* 64 */ { 4, s_6_64, 58, 1, 0},
+/* 65 */ { 5, s_6_65, 58, 1, 0},
+/* 66 */ { 5, s_6_66, 58, 1, 0},
+/* 67 */ { 5, s_6_67, 58, 1, 0},
+/* 68 */ { 5, s_6_68, 58, 1, 0},
+/* 69 */ { 5, s_6_69, 58, 1, 0},
+/* 70 */ { 5, s_6_70, 58, 1, 0},
+/* 71 */ { 2, s_6_71, -1, 1, 0},
+/* 72 */ { 3, s_6_72, 71, 1, 0},
+/* 73 */ { 3, s_6_73, 71, 1, 0},
+/* 74 */ { 5, s_6_74, 73, 1, 0},
+/* 75 */ { 5, s_6_75, 73, 1, 0},
+/* 76 */ { 5, s_6_76, 73, 1, 0},
+/* 77 */ { 5, s_6_77, 73, 1, 0},
+/* 78 */ { 5, s_6_78, 73, 1, 0},
+/* 79 */ { 5, s_6_79, 73, 1, 0},
+/* 80 */ { 6, s_6_80, 73, 1, 0},
+/* 81 */ { 6, s_6_81, 73, 1, 0},
+/* 82 */ { 6, s_6_82, 73, 1, 0},
+/* 83 */ { 5, s_6_83, 73, 1, 0},
+/* 84 */ { 4, s_6_84, 73, 1, 0},
+/* 85 */ { 6, s_6_85, 84, 1, 0},
+/* 86 */ { 6, s_6_86, 84, 1, 0},
+/* 87 */ { 6, s_6_87, 84, 1, 0},
+/* 88 */ { 4, s_6_88, -1, 1, 0},
+/* 89 */ { 4, s_6_89, -1, 1, 0},
+/* 90 */ { 4, s_6_90, -1, 1, 0},
+/* 91 */ { 6, s_6_91, 90, 1, 0},
+/* 92 */ { 6, s_6_92, 90, 1, 0},
+/* 93 */ { 6, s_6_93, 90, 1, 0},
+/* 94 */ { 6, s_6_94, 90, 1, 0},
+/* 95 */ { 5, s_6_95, 90, 1, 0},
+/* 96 */ { 7, s_6_96, 95, 1, 0},
+/* 97 */ { 7, s_6_97, 95, 1, 0},
+/* 98 */ { 7, s_6_98, 95, 1, 0},
+/* 99 */ { 4, s_6_99, -1, 1, 0},
+/*100 */ { 6, s_6_100, 99, 1, 0},
+/*101 */ { 6, s_6_101, 99, 1, 0},
+/*102 */ { 6, s_6_102, 99, 1, 0},
+/*103 */ { 7, s_6_103, 99, 1, 0},
+/*104 */ { 7, s_6_104, 99, 1, 0},
+/*105 */ { 7, s_6_105, 99, 1, 0},
+/*106 */ { 4, s_6_106, -1, 1, 0},
+/*107 */ { 5, s_6_107, -1, 1, 0},
+/*108 */ { 5, s_6_108, -1, 1, 0},
+/*109 */ { 5, s_6_109, -1, 1, 0},
+/*110 */ { 4, s_6_110, -1, 1, 0},
+/*111 */ { 4, s_6_111, -1, 1, 0},
+/*112 */ { 4, s_6_112, -1, 1, 0},
+/*113 */ { 4, s_6_113, -1, 1, 0},
+/*114 */ { 2, s_6_114, -1, 1, 0},
+/*115 */ { 2, s_6_115, -1, 1, 0},
+/*116 */ { 2, s_6_116, -1, 1, 0},
+/*117 */ { 3, s_6_117, -1, 1, 0},
+/*118 */ { 3, s_6_118, -1, 1, 0},
+/*119 */ { 3, s_6_119, -1, 1, 0}
+};
+
+static symbol s_7_0[1] = { 'a' };
+static symbol s_7_1[1] = { 'i' };
+static symbol s_7_2[1] = { 'o' };
+static symbol s_7_3[2] = { 'o', 's' };
+static symbol s_7_4[1] = { 0xE1 };
+static symbol s_7_5[1] = { 0xED };
+static symbol s_7_6[1] = { 0xF3 };
+
+static struct among a_7[7] =
+{
+/*  0 */ { 1, s_7_0, -1, 1, 0},
+/*  1 */ { 1, s_7_1, -1, 1, 0},
+/*  2 */ { 1, s_7_2, -1, 1, 0},
+/*  3 */ { 2, s_7_3, -1, 1, 0},
+/*  4 */ { 1, s_7_4, -1, 1, 0},
+/*  5 */ { 1, s_7_5, -1, 1, 0},
+/*  6 */ { 1, s_7_6, -1, 1, 0}
+};
+
+static symbol s_8_0[1] = { 'e' };
+static symbol s_8_1[1] = { 0xE7 };
+static symbol s_8_2[1] = { 0xE9 };
+static symbol s_8_3[1] = { 0xEA };
+
+static struct among a_8[4] =
+{
+/*  0 */ { 1, s_8_0, -1, 1, 0},
+/*  1 */ { 1, s_8_1, -1, 2, 0},
+/*  2 */ { 1, s_8_2, -1, 1, 0},
+/*  3 */ { 1, s_8_3, -1, 1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 12, 2 };
+
+static symbol s_0[] = { 'a', '~' };
+static symbol s_1[] = { 'o', '~' };
+static symbol s_2[] = { 0xE3 };
+static symbol s_3[] = { 0xF5 };
+static symbol s_4[] = { 'l', 'o', 'g' };
+static symbol s_5[] = { 'u' };
+static symbol s_6[] = { 'e', 'n', 't', 'e' };
+static symbol s_7[] = { 'a', 't' };
+static symbol s_8[] = { 'a', 't' };
+static symbol s_9[] = { 'e' };
+static symbol s_10[] = { 'i', 'r' };
+static symbol s_11[] = { 'u' };
+static symbol s_12[] = { 'g' };
+static symbol s_13[] = { 'i' };
+static symbol s_14[] = { 'c' };
+static symbol s_15[] = { 'c' };
+static symbol s_16[] = { 'i' };
+static symbol s_17[] = { 'c' };
+
+static int r_prelude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 36 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 37 */
+        among_var = find_among(z, a_0, 3); /* substring, line 37 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 37 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 2, s_0); /* <-, line 38 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 2, s_1); /* <-, line 39 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 40 */
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    z->I[2] = z->l;
+    {   int c = z->c; /* do, line 50 */
+        {   int c = z->c; /* or, line 52 */
+            if (!(in_grouping(z, g_v, 97, 250))) goto lab2;
+            {   int c = z->c; /* or, line 51 */
+                if (!(out_grouping(z, g_v, 97, 250))) goto lab4;
+                while(1) { /* gopast, line 51 */
+                    if (!(in_grouping(z, g_v, 97, 250))) goto lab5;
+                    break;
+                lab5:
+                    if (z->c >= z->l) goto lab4;
+                    z->c++; /* gopast, line 51 */
+                }
+                goto lab3;
+            lab4:
+                z->c = c;
+                if (!(in_grouping(z, g_v, 97, 250))) goto lab2;
+                while(1) { /* gopast, line 51 */
+                    if (!(out_grouping(z, g_v, 97, 250))) goto lab6;
+                    break;
+                lab6:
+                    if (z->c >= z->l) goto lab2;
+                    z->c++; /* gopast, line 51 */
+                }
+            }
+        lab3:
+            goto lab1;
+        lab2:
+            z->c = c;
+            if (!(out_grouping(z, g_v, 97, 250))) goto lab0;
+            {   int c = z->c; /* or, line 53 */
+                if (!(out_grouping(z, g_v, 97, 250))) goto lab8;
+                while(1) { /* gopast, line 53 */
+                    if (!(in_grouping(z, g_v, 97, 250))) goto lab9;
+                    break;
+                lab9:
+                    if (z->c >= z->l) goto lab8;
+                    z->c++; /* gopast, line 53 */
+                }
+                goto lab7;
+            lab8:
+                z->c = c;
+                if (!(in_grouping(z, g_v, 97, 250))) goto lab0;
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 53 */
+            }
+        lab7:
+            ;
+        }
+    lab1:
+        z->I[0] = z->c; /* setmark pV, line 54 */
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 56 */
+        while(1) { /* gopast, line 57 */
+            if (!(in_grouping(z, g_v, 97, 250))) goto lab11;
+            break;
+        lab11:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 57 */
+        }
+        while(1) { /* gopast, line 57 */
+            if (!(out_grouping(z, g_v, 97, 250))) goto lab12;
+            break;
+        lab12:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 57 */
+        }
+        z->I[1] = z->c; /* setmark p1, line 57 */
+        while(1) { /* gopast, line 58 */
+            if (!(in_grouping(z, g_v, 97, 250))) goto lab13;
+            break;
+        lab13:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 58 */
+        }
+        while(1) { /* gopast, line 58 */
+            if (!(out_grouping(z, g_v, 97, 250))) goto lab14;
+            break;
+        lab14:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 58 */
+        }
+        z->I[2] = z->c; /* setmark p2, line 58 */
+    lab10:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 62 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 63 */
+        among_var = find_among(z, a_1, 3); /* substring, line 63 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 63 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_2); /* <-, line 64 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_3); /* <-, line 65 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 66 */
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_RV(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[2] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 77 */
+    among_var = find_among_b(z, a_5, 45); /* substring, line 77 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 77 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 93 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 93 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 98 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_4); /* <-, line 98 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 102 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_5); /* <-, line 102 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 106 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 4, s_6); /* <-, line 106 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 110 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 110 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 111 */
+                z->ket = z->c; /* [, line 112 */
+                among_var = find_among_b(z, a_2, 4); /* substring, line 112 */
+                if (!(among_var)) { z->c = z->l - m; goto lab0; }
+                z->bra = z->c; /* ], line 112 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 112 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 112 */
+                    if (ret < 0) return ret;
+                }
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab0; }
+                    case 1:
+                        z->ket = z->c; /* [, line 113 */
+                        if (!(eq_s_b(z, 2, s_7))) { z->c = z->l - m; goto lab0; }
+                        z->bra = z->c; /* ], line 113 */
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 113 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 113 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab0:
+                ;
+            }
+            break;
+        case 6:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 122 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 122 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 123 */
+                z->ket = z->c; /* [, line 124 */
+                among_var = find_among_b(z, a_3, 3); /* substring, line 124 */
+                if (!(among_var)) { z->c = z->l - m; goto lab1; }
+                z->bra = z->c; /* ], line 124 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab1; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 127 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 127 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab1:
+                ;
+            }
+            break;
+        case 7:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 134 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 134 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 135 */
+                z->ket = z->c; /* [, line 136 */
+                among_var = find_among_b(z, a_4, 3); /* substring, line 136 */
+                if (!(among_var)) { z->c = z->l - m; goto lab2; }
+                z->bra = z->c; /* ], line 136 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab2; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 139 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 139 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab2:
+                ;
+            }
+            break;
+        case 8:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 146 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 146 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 147 */
+                z->ket = z->c; /* [, line 148 */
+                if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m; goto lab3; }
+                z->bra = z->c; /* ], line 148 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 148 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 148 */
+                    if (ret < 0) return ret;
+                }
+            lab3:
+                ;
+            }
+            break;
+        case 9:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 153 */
+                if (ret < 0) return ret;
+            }
+            if (!(eq_s_b(z, 1, s_9))) return 0;
+            {   int ret;
+                ret = slice_from_s(z, 2, s_10); /* <-, line 154 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 159 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 159 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 160 */
+        among_var = find_among_b(z, a_6, 120); /* substring, line 160 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 160 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 179 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_residual_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 184 */
+    among_var = find_among_b(z, a_7, 7); /* substring, line 184 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 184 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 187 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 187 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_residual_form(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 192 */
+    among_var = find_among_b(z, a_8, 4); /* substring, line 192 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 192 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 194 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 194 */
+                if (ret < 0) return ret;
+            }
+            z->ket = z->c; /* [, line 194 */
+            {   int m = z->l - z->c; (void) m; /* or, line 194 */
+                if (!(eq_s_b(z, 1, s_11))) goto lab1;
+                z->bra = z->c; /* ], line 194 */
+                {   int m_test = z->l - z->c; /* test, line 194 */
+                    if (!(eq_s_b(z, 1, s_12))) goto lab1;
+                    z->c = z->l - m_test;
+                }
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_13))) return 0;
+                z->bra = z->c; /* ], line 195 */
+                {   int m_test = z->l - z->c; /* test, line 195 */
+                    if (!(eq_s_b(z, 1, s_14))) return 0;
+                    z->c = z->l - m_test;
+                }
+            }
+        lab0:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 195 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 195 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 1, s_15); /* <-, line 196 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+extern int portuguese_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 202 */
+        {   int ret = r_prelude(z);
+            if (ret == 0) goto lab0; /* call prelude, line 202 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 203 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab1; /* call mark_regions, line 203 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 204 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 205 */
+        {   int m = z->l - z->c; (void) m; /* or, line 209 */
+            {   int m = z->l - z->c; (void) m; /* and, line 207 */
+                {   int m = z->l - z->c; (void) m; /* or, line 206 */
+                    {   int ret = r_standard_suffix(z);
+                        if (ret == 0) goto lab6; /* call standard_suffix, line 206 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab6:
+                    z->c = z->l - m;
+                    {   int ret = r_verb_suffix(z);
+                        if (ret == 0) goto lab4; /* call verb_suffix, line 206 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab5:
+                z->c = z->l - m;
+                {   int m = z->l - z->c; (void) m; /* do, line 207 */
+                    z->ket = z->c; /* [, line 207 */
+                    if (!(eq_s_b(z, 1, s_16))) goto lab7;
+                    z->bra = z->c; /* ], line 207 */
+                    {   int m_test = z->l - z->c; /* test, line 207 */
+                        if (!(eq_s_b(z, 1, s_17))) goto lab7;
+                        z->c = z->l - m_test;
+                    }
+                    {   int ret = r_RV(z);
+                        if (ret == 0) goto lab7; /* call RV, line 207 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 207 */
+                        if (ret < 0) return ret;
+                    }
+                lab7:
+                    z->c = z->l - m;
+                }
+            }
+            goto lab3;
+        lab4:
+            z->c = z->l - m;
+            {   int ret = r_residual_suffix(z);
+                if (ret == 0) goto lab2; /* call residual_suffix, line 209 */
+                if (ret < 0) return ret;
+            }
+        }
+    lab3:
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 211 */
+        {   int ret = r_residual_form(z);
+            if (ret == 0) goto lab8; /* call residual_form, line 211 */
+            if (ret < 0) return ret;
+        }
+    lab8:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 213 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab9; /* call postlude, line 213 */
+            if (ret < 0) return ret;
+        }
+    lab9:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * portuguese_ISO_8859_1_create_env(void) { return SN_create_env(0, 3, 0); }
+
+extern void portuguese_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_portuguese.h b/libstemmer_c/src_c/stem_ISO_8859_1_portuguese.h
new file mode 100644
index 0000000..0279bc9
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_portuguese.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * portuguese_ISO_8859_1_create_env(void);
+extern void portuguese_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int portuguese_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_spanish.c b/libstemmer_c/src_c/stem_ISO_8859_1_spanish.c
new file mode 100644
index 0000000..acc4fa9
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_spanish.c
@@ -0,0 +1,1119 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int spanish_ISO_8859_1_stem(struct SN_env * z);
+static int r_residual_suffix(struct SN_env * z);
+static int r_verb_suffix(struct SN_env * z);
+static int r_y_verb_suffix(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_attached_pronoun(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_RV(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+
+extern struct SN_env * spanish_ISO_8859_1_create_env(void);
+extern void spanish_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_1[1] = { 0xE1 };
+static symbol s_0_2[1] = { 0xE9 };
+static symbol s_0_3[1] = { 0xED };
+static symbol s_0_4[1] = { 0xF3 };
+static symbol s_0_5[1] = { 0xFA };
+
+static struct among a_0[6] =
+{
+/*  0 */ { 0, 0, -1, 6, 0},
+/*  1 */ { 1, s_0_1, 0, 1, 0},
+/*  2 */ { 1, s_0_2, 0, 2, 0},
+/*  3 */ { 1, s_0_3, 0, 3, 0},
+/*  4 */ { 1, s_0_4, 0, 4, 0},
+/*  5 */ { 1, s_0_5, 0, 5, 0}
+};
+
+static symbol s_1_0[2] = { 'l', 'a' };
+static symbol s_1_1[4] = { 's', 'e', 'l', 'a' };
+static symbol s_1_2[2] = { 'l', 'e' };
+static symbol s_1_3[2] = { 'm', 'e' };
+static symbol s_1_4[2] = { 's', 'e' };
+static symbol s_1_5[2] = { 'l', 'o' };
+static symbol s_1_6[4] = { 's', 'e', 'l', 'o' };
+static symbol s_1_7[3] = { 'l', 'a', 's' };
+static symbol s_1_8[5] = { 's', 'e', 'l', 'a', 's' };
+static symbol s_1_9[3] = { 'l', 'e', 's' };
+static symbol s_1_10[3] = { 'l', 'o', 's' };
+static symbol s_1_11[5] = { 's', 'e', 'l', 'o', 's' };
+static symbol s_1_12[3] = { 'n', 'o', 's' };
+
+static struct among a_1[13] =
+{
+/*  0 */ { 2, s_1_0, -1, -1, 0},
+/*  1 */ { 4, s_1_1, 0, -1, 0},
+/*  2 */ { 2, s_1_2, -1, -1, 0},
+/*  3 */ { 2, s_1_3, -1, -1, 0},
+/*  4 */ { 2, s_1_4, -1, -1, 0},
+/*  5 */ { 2, s_1_5, -1, -1, 0},
+/*  6 */ { 4, s_1_6, 5, -1, 0},
+/*  7 */ { 3, s_1_7, -1, -1, 0},
+/*  8 */ { 5, s_1_8, 7, -1, 0},
+/*  9 */ { 3, s_1_9, -1, -1, 0},
+/* 10 */ { 3, s_1_10, -1, -1, 0},
+/* 11 */ { 5, s_1_11, 10, -1, 0},
+/* 12 */ { 3, s_1_12, -1, -1, 0}
+};
+
+static symbol s_2_0[4] = { 'a', 'n', 'd', 'o' };
+static symbol s_2_1[5] = { 'i', 'e', 'n', 'd', 'o' };
+static symbol s_2_2[5] = { 'y', 'e', 'n', 'd', 'o' };
+static symbol s_2_3[4] = { 0xE1, 'n', 'd', 'o' };
+static symbol s_2_4[5] = { 'i', 0xE9, 'n', 'd', 'o' };
+static symbol s_2_5[2] = { 'a', 'r' };
+static symbol s_2_6[2] = { 'e', 'r' };
+static symbol s_2_7[2] = { 'i', 'r' };
+static symbol s_2_8[2] = { 0xE1, 'r' };
+static symbol s_2_9[2] = { 0xE9, 'r' };
+static symbol s_2_10[2] = { 0xED, 'r' };
+
+static struct among a_2[11] =
+{
+/*  0 */ { 4, s_2_0, -1, 6, 0},
+/*  1 */ { 5, s_2_1, -1, 6, 0},
+/*  2 */ { 5, s_2_2, -1, 7, 0},
+/*  3 */ { 4, s_2_3, -1, 2, 0},
+/*  4 */ { 5, s_2_4, -1, 1, 0},
+/*  5 */ { 2, s_2_5, -1, 6, 0},
+/*  6 */ { 2, s_2_6, -1, 6, 0},
+/*  7 */ { 2, s_2_7, -1, 6, 0},
+/*  8 */ { 2, s_2_8, -1, 3, 0},
+/*  9 */ { 2, s_2_9, -1, 4, 0},
+/* 10 */ { 2, s_2_10, -1, 5, 0}
+};
+
+static symbol s_3_0[2] = { 'i', 'c' };
+static symbol s_3_1[2] = { 'a', 'd' };
+static symbol s_3_2[2] = { 'o', 's' };
+static symbol s_3_3[2] = { 'i', 'v' };
+
+static struct among a_3[4] =
+{
+/*  0 */ { 2, s_3_0, -1, -1, 0},
+/*  1 */ { 2, s_3_1, -1, -1, 0},
+/*  2 */ { 2, s_3_2, -1, -1, 0},
+/*  3 */ { 2, s_3_3, -1, 1, 0}
+};
+
+static symbol s_4_0[4] = { 'a', 'b', 'l', 'e' };
+static symbol s_4_1[4] = { 'i', 'b', 'l', 'e' };
+static symbol s_4_2[4] = { 'a', 'n', 't', 'e' };
+
+static struct among a_4[3] =
+{
+/*  0 */ { 4, s_4_0, -1, 1, 0},
+/*  1 */ { 4, s_4_1, -1, 1, 0},
+/*  2 */ { 4, s_4_2, -1, 1, 0}
+};
+
+static symbol s_5_0[2] = { 'i', 'c' };
+static symbol s_5_1[4] = { 'a', 'b', 'i', 'l' };
+static symbol s_5_2[2] = { 'i', 'v' };
+
+static struct among a_5[3] =
+{
+/*  0 */ { 2, s_5_0, -1, 1, 0},
+/*  1 */ { 4, s_5_1, -1, 1, 0},
+/*  2 */ { 2, s_5_2, -1, 1, 0}
+};
+
+static symbol s_6_0[3] = { 'i', 'c', 'a' };
+static symbol s_6_1[5] = { 'a', 'n', 'c', 'i', 'a' };
+static symbol s_6_2[5] = { 'e', 'n', 'c', 'i', 'a' };
+static symbol s_6_3[5] = { 'a', 'd', 'o', 'r', 'a' };
+static symbol s_6_4[3] = { 'o', 's', 'a' };
+static symbol s_6_5[4] = { 'i', 's', 't', 'a' };
+static symbol s_6_6[3] = { 'i', 'v', 'a' };
+static symbol s_6_7[4] = { 'a', 'n', 'z', 'a' };
+static symbol s_6_8[5] = { 'l', 'o', 'g', 0xED, 'a' };
+static symbol s_6_9[4] = { 'i', 'd', 'a', 'd' };
+static symbol s_6_10[4] = { 'a', 'b', 'l', 'e' };
+static symbol s_6_11[4] = { 'i', 'b', 'l', 'e' };
+static symbol s_6_12[4] = { 'a', 'n', 't', 'e' };
+static symbol s_6_13[5] = { 'm', 'e', 'n', 't', 'e' };
+static symbol s_6_14[6] = { 'a', 'm', 'e', 'n', 't', 'e' };
+static symbol s_6_15[5] = { 'a', 'c', 'i', 0xF3, 'n' };
+static symbol s_6_16[5] = { 'u', 'c', 'i', 0xF3, 'n' };
+static symbol s_6_17[3] = { 'i', 'c', 'o' };
+static symbol s_6_18[4] = { 'i', 's', 'm', 'o' };
+static symbol s_6_19[3] = { 'o', 's', 'o' };
+static symbol s_6_20[7] = { 'a', 'm', 'i', 'e', 'n', 't', 'o' };
+static symbol s_6_21[7] = { 'i', 'm', 'i', 'e', 'n', 't', 'o' };
+static symbol s_6_22[3] = { 'i', 'v', 'o' };
+static symbol s_6_23[4] = { 'a', 'd', 'o', 'r' };
+static symbol s_6_24[4] = { 'i', 'c', 'a', 's' };
+static symbol s_6_25[6] = { 'a', 'n', 'c', 'i', 'a', 's' };
+static symbol s_6_26[6] = { 'e', 'n', 'c', 'i', 'a', 's' };
+static symbol s_6_27[6] = { 'a', 'd', 'o', 'r', 'a', 's' };
+static symbol s_6_28[4] = { 'o', 's', 'a', 's' };
+static symbol s_6_29[5] = { 'i', 's', 't', 'a', 's' };
+static symbol s_6_30[4] = { 'i', 'v', 'a', 's' };
+static symbol s_6_31[5] = { 'a', 'n', 'z', 'a', 's' };
+static symbol s_6_32[6] = { 'l', 'o', 'g', 0xED, 'a', 's' };
+static symbol s_6_33[6] = { 'i', 'd', 'a', 'd', 'e', 's' };
+static symbol s_6_34[5] = { 'a', 'b', 'l', 'e', 's' };
+static symbol s_6_35[5] = { 'i', 'b', 'l', 'e', 's' };
+static symbol s_6_36[7] = { 'a', 'c', 'i', 'o', 'n', 'e', 's' };
+static symbol s_6_37[7] = { 'u', 'c', 'i', 'o', 'n', 'e', 's' };
+static symbol s_6_38[6] = { 'a', 'd', 'o', 'r', 'e', 's' };
+static symbol s_6_39[5] = { 'a', 'n', 't', 'e', 's' };
+static symbol s_6_40[4] = { 'i', 'c', 'o', 's' };
+static symbol s_6_41[5] = { 'i', 's', 'm', 'o', 's' };
+static symbol s_6_42[4] = { 'o', 's', 'o', 's' };
+static symbol s_6_43[8] = { 'a', 'm', 'i', 'e', 'n', 't', 'o', 's' };
+static symbol s_6_44[8] = { 'i', 'm', 'i', 'e', 'n', 't', 'o', 's' };
+static symbol s_6_45[4] = { 'i', 'v', 'o', 's' };
+
+static struct among a_6[46] =
+{
+/*  0 */ { 3, s_6_0, -1, 1, 0},
+/*  1 */ { 5, s_6_1, -1, 2, 0},
+/*  2 */ { 5, s_6_2, -1, 5, 0},
+/*  3 */ { 5, s_6_3, -1, 2, 0},
+/*  4 */ { 3, s_6_4, -1, 1, 0},
+/*  5 */ { 4, s_6_5, -1, 1, 0},
+/*  6 */ { 3, s_6_6, -1, 9, 0},
+/*  7 */ { 4, s_6_7, -1, 1, 0},
+/*  8 */ { 5, s_6_8, -1, 3, 0},
+/*  9 */ { 4, s_6_9, -1, 8, 0},
+/* 10 */ { 4, s_6_10, -1, 1, 0},
+/* 11 */ { 4, s_6_11, -1, 1, 0},
+/* 12 */ { 4, s_6_12, -1, 2, 0},
+/* 13 */ { 5, s_6_13, -1, 7, 0},
+/* 14 */ { 6, s_6_14, 13, 6, 0},
+/* 15 */ { 5, s_6_15, -1, 2, 0},
+/* 16 */ { 5, s_6_16, -1, 4, 0},
+/* 17 */ { 3, s_6_17, -1, 1, 0},
+/* 18 */ { 4, s_6_18, -1, 1, 0},
+/* 19 */ { 3, s_6_19, -1, 1, 0},
+/* 20 */ { 7, s_6_20, -1, 1, 0},
+/* 21 */ { 7, s_6_21, -1, 1, 0},
+/* 22 */ { 3, s_6_22, -1, 9, 0},
+/* 23 */ { 4, s_6_23, -1, 2, 0},
+/* 24 */ { 4, s_6_24, -1, 1, 0},
+/* 25 */ { 6, s_6_25, -1, 2, 0},
+/* 26 */ { 6, s_6_26, -1, 5, 0},
+/* 27 */ { 6, s_6_27, -1, 2, 0},
+/* 28 */ { 4, s_6_28, -1, 1, 0},
+/* 29 */ { 5, s_6_29, -1, 1, 0},
+/* 30 */ { 4, s_6_30, -1, 9, 0},
+/* 31 */ { 5, s_6_31, -1, 1, 0},
+/* 32 */ { 6, s_6_32, -1, 3, 0},
+/* 33 */ { 6, s_6_33, -1, 8, 0},
+/* 34 */ { 5, s_6_34, -1, 1, 0},
+/* 35 */ { 5, s_6_35, -1, 1, 0},
+/* 36 */ { 7, s_6_36, -1, 2, 0},
+/* 37 */ { 7, s_6_37, -1, 4, 0},
+/* 38 */ { 6, s_6_38, -1, 2, 0},
+/* 39 */ { 5, s_6_39, -1, 2, 0},
+/* 40 */ { 4, s_6_40, -1, 1, 0},
+/* 41 */ { 5, s_6_41, -1, 1, 0},
+/* 42 */ { 4, s_6_42, -1, 1, 0},
+/* 43 */ { 8, s_6_43, -1, 1, 0},
+/* 44 */ { 8, s_6_44, -1, 1, 0},
+/* 45 */ { 4, s_6_45, -1, 9, 0}
+};
+
+static symbol s_7_0[2] = { 'y', 'a' };
+static symbol s_7_1[2] = { 'y', 'e' };
+static symbol s_7_2[3] = { 'y', 'a', 'n' };
+static symbol s_7_3[3] = { 'y', 'e', 'n' };
+static symbol s_7_4[5] = { 'y', 'e', 'r', 'o', 'n' };
+static symbol s_7_5[5] = { 'y', 'e', 'n', 'd', 'o' };
+static symbol s_7_6[2] = { 'y', 'o' };
+static symbol s_7_7[3] = { 'y', 'a', 's' };
+static symbol s_7_8[3] = { 'y', 'e', 's' };
+static symbol s_7_9[4] = { 'y', 'a', 'i', 's' };
+static symbol s_7_10[5] = { 'y', 'a', 'm', 'o', 's' };
+static symbol s_7_11[2] = { 'y', 0xF3 };
+
+static struct among a_7[12] =
+{
+/*  0 */ { 2, s_7_0, -1, 1, 0},
+/*  1 */ { 2, s_7_1, -1, 1, 0},
+/*  2 */ { 3, s_7_2, -1, 1, 0},
+/*  3 */ { 3, s_7_3, -1, 1, 0},
+/*  4 */ { 5, s_7_4, -1, 1, 0},
+/*  5 */ { 5, s_7_5, -1, 1, 0},
+/*  6 */ { 2, s_7_6, -1, 1, 0},
+/*  7 */ { 3, s_7_7, -1, 1, 0},
+/*  8 */ { 3, s_7_8, -1, 1, 0},
+/*  9 */ { 4, s_7_9, -1, 1, 0},
+/* 10 */ { 5, s_7_10, -1, 1, 0},
+/* 11 */ { 2, s_7_11, -1, 1, 0}
+};
+
+static symbol s_8_0[3] = { 'a', 'b', 'a' };
+static symbol s_8_1[3] = { 'a', 'd', 'a' };
+static symbol s_8_2[3] = { 'i', 'd', 'a' };
+static symbol s_8_3[3] = { 'a', 'r', 'a' };
+static symbol s_8_4[4] = { 'i', 'e', 'r', 'a' };
+static symbol s_8_5[2] = { 0xED, 'a' };
+static symbol s_8_6[4] = { 'a', 'r', 0xED, 'a' };
+static symbol s_8_7[4] = { 'e', 'r', 0xED, 'a' };
+static symbol s_8_8[4] = { 'i', 'r', 0xED, 'a' };
+static symbol s_8_9[2] = { 'a', 'd' };
+static symbol s_8_10[2] = { 'e', 'd' };
+static symbol s_8_11[2] = { 'i', 'd' };
+static symbol s_8_12[3] = { 'a', 's', 'e' };
+static symbol s_8_13[4] = { 'i', 'e', 's', 'e' };
+static symbol s_8_14[4] = { 'a', 's', 't', 'e' };
+static symbol s_8_15[4] = { 'i', 's', 't', 'e' };
+static symbol s_8_16[2] = { 'a', 'n' };
+static symbol s_8_17[4] = { 'a', 'b', 'a', 'n' };
+static symbol s_8_18[4] = { 'a', 'r', 'a', 'n' };
+static symbol s_8_19[5] = { 'i', 'e', 'r', 'a', 'n' };
+static symbol s_8_20[3] = { 0xED, 'a', 'n' };
+static symbol s_8_21[5] = { 'a', 'r', 0xED, 'a', 'n' };
+static symbol s_8_22[5] = { 'e', 'r', 0xED, 'a', 'n' };
+static symbol s_8_23[5] = { 'i', 'r', 0xED, 'a', 'n' };
+static symbol s_8_24[2] = { 'e', 'n' };
+static symbol s_8_25[4] = { 'a', 's', 'e', 'n' };
+static symbol s_8_26[5] = { 'i', 'e', 's', 'e', 'n' };
+static symbol s_8_27[4] = { 'a', 'r', 'o', 'n' };
+static symbol s_8_28[5] = { 'i', 'e', 'r', 'o', 'n' };
+static symbol s_8_29[4] = { 'a', 'r', 0xE1, 'n' };
+static symbol s_8_30[4] = { 'e', 'r', 0xE1, 'n' };
+static symbol s_8_31[4] = { 'i', 'r', 0xE1, 'n' };
+static symbol s_8_32[3] = { 'a', 'd', 'o' };
+static symbol s_8_33[3] = { 'i', 'd', 'o' };
+static symbol s_8_34[4] = { 'a', 'n', 'd', 'o' };
+static symbol s_8_35[5] = { 'i', 'e', 'n', 'd', 'o' };
+static symbol s_8_36[2] = { 'a', 'r' };
+static symbol s_8_37[2] = { 'e', 'r' };
+static symbol s_8_38[2] = { 'i', 'r' };
+static symbol s_8_39[2] = { 'a', 's' };
+static symbol s_8_40[4] = { 'a', 'b', 'a', 's' };
+static symbol s_8_41[4] = { 'a', 'd', 'a', 's' };
+static symbol s_8_42[4] = { 'i', 'd', 'a', 's' };
+static symbol s_8_43[4] = { 'a', 'r', 'a', 's' };
+static symbol s_8_44[5] = { 'i', 'e', 'r', 'a', 's' };
+static symbol s_8_45[3] = { 0xED, 'a', 's' };
+static symbol s_8_46[5] = { 'a', 'r', 0xED, 'a', 's' };
+static symbol s_8_47[5] = { 'e', 'r', 0xED, 'a', 's' };
+static symbol s_8_48[5] = { 'i', 'r', 0xED, 'a', 's' };
+static symbol s_8_49[2] = { 'e', 's' };
+static symbol s_8_50[4] = { 'a', 's', 'e', 's' };
+static symbol s_8_51[5] = { 'i', 'e', 's', 'e', 's' };
+static symbol s_8_52[5] = { 'a', 'b', 'a', 'i', 's' };
+static symbol s_8_53[5] = { 'a', 'r', 'a', 'i', 's' };
+static symbol s_8_54[6] = { 'i', 'e', 'r', 'a', 'i', 's' };
+static symbol s_8_55[4] = { 0xED, 'a', 'i', 's' };
+static symbol s_8_56[6] = { 'a', 'r', 0xED, 'a', 'i', 's' };
+static symbol s_8_57[6] = { 'e', 'r', 0xED, 'a', 'i', 's' };
+static symbol s_8_58[6] = { 'i', 'r', 0xED, 'a', 'i', 's' };
+static symbol s_8_59[5] = { 'a', 's', 'e', 'i', 's' };
+static symbol s_8_60[6] = { 'i', 'e', 's', 'e', 'i', 's' };
+static symbol s_8_61[6] = { 'a', 's', 't', 'e', 'i', 's' };
+static symbol s_8_62[6] = { 'i', 's', 't', 'e', 'i', 's' };
+static symbol s_8_63[3] = { 0xE1, 'i', 's' };
+static symbol s_8_64[3] = { 0xE9, 'i', 's' };
+static symbol s_8_65[5] = { 'a', 'r', 0xE9, 'i', 's' };
+static symbol s_8_66[5] = { 'e', 'r', 0xE9, 'i', 's' };
+static symbol s_8_67[5] = { 'i', 'r', 0xE9, 'i', 's' };
+static symbol s_8_68[4] = { 'a', 'd', 'o', 's' };
+static symbol s_8_69[4] = { 'i', 'd', 'o', 's' };
+static symbol s_8_70[4] = { 'a', 'm', 'o', 's' };
+static symbol s_8_71[6] = { 0xE1, 'b', 'a', 'm', 'o', 's' };
+static symbol s_8_72[6] = { 0xE1, 'r', 'a', 'm', 'o', 's' };
+static symbol s_8_73[7] = { 'i', 0xE9, 'r', 'a', 'm', 'o', 's' };
+static symbol s_8_74[5] = { 0xED, 'a', 'm', 'o', 's' };
+static symbol s_8_75[7] = { 'a', 'r', 0xED, 'a', 'm', 'o', 's' };
+static symbol s_8_76[7] = { 'e', 'r', 0xED, 'a', 'm', 'o', 's' };
+static symbol s_8_77[7] = { 'i', 'r', 0xED, 'a', 'm', 'o', 's' };
+static symbol s_8_78[4] = { 'e', 'm', 'o', 's' };
+static symbol s_8_79[6] = { 'a', 'r', 'e', 'm', 'o', 's' };
+static symbol s_8_80[6] = { 'e', 'r', 'e', 'm', 'o', 's' };
+static symbol s_8_81[6] = { 'i', 'r', 'e', 'm', 'o', 's' };
+static symbol s_8_82[6] = { 0xE1, 's', 'e', 'm', 'o', 's' };
+static symbol s_8_83[7] = { 'i', 0xE9, 's', 'e', 'm', 'o', 's' };
+static symbol s_8_84[4] = { 'i', 'm', 'o', 's' };
+static symbol s_8_85[4] = { 'a', 'r', 0xE1, 's' };
+static symbol s_8_86[4] = { 'e', 'r', 0xE1, 's' };
+static symbol s_8_87[4] = { 'i', 'r', 0xE1, 's' };
+static symbol s_8_88[2] = { 0xED, 's' };
+static symbol s_8_89[3] = { 'a', 'r', 0xE1 };
+static symbol s_8_90[3] = { 'e', 'r', 0xE1 };
+static symbol s_8_91[3] = { 'i', 'r', 0xE1 };
+static symbol s_8_92[3] = { 'a', 'r', 0xE9 };
+static symbol s_8_93[3] = { 'e', 'r', 0xE9 };
+static symbol s_8_94[3] = { 'i', 'r', 0xE9 };
+static symbol s_8_95[2] = { 'i', 0xF3 };
+
+static struct among a_8[96] =
+{
+/*  0 */ { 3, s_8_0, -1, 2, 0},
+/*  1 */ { 3, s_8_1, -1, 2, 0},
+/*  2 */ { 3, s_8_2, -1, 2, 0},
+/*  3 */ { 3, s_8_3, -1, 2, 0},
+/*  4 */ { 4, s_8_4, -1, 2, 0},
+/*  5 */ { 2, s_8_5, -1, 2, 0},
+/*  6 */ { 4, s_8_6, 5, 2, 0},
+/*  7 */ { 4, s_8_7, 5, 2, 0},
+/*  8 */ { 4, s_8_8, 5, 2, 0},
+/*  9 */ { 2, s_8_9, -1, 2, 0},
+/* 10 */ { 2, s_8_10, -1, 2, 0},
+/* 11 */ { 2, s_8_11, -1, 2, 0},
+/* 12 */ { 3, s_8_12, -1, 2, 0},
+/* 13 */ { 4, s_8_13, -1, 2, 0},
+/* 14 */ { 4, s_8_14, -1, 2, 0},
+/* 15 */ { 4, s_8_15, -1, 2, 0},
+/* 16 */ { 2, s_8_16, -1, 2, 0},
+/* 17 */ { 4, s_8_17, 16, 2, 0},
+/* 18 */ { 4, s_8_18, 16, 2, 0},
+/* 19 */ { 5, s_8_19, 16, 2, 0},
+/* 20 */ { 3, s_8_20, 16, 2, 0},
+/* 21 */ { 5, s_8_21, 20, 2, 0},
+/* 22 */ { 5, s_8_22, 20, 2, 0},
+/* 23 */ { 5, s_8_23, 20, 2, 0},
+/* 24 */ { 2, s_8_24, -1, 1, 0},
+/* 25 */ { 4, s_8_25, 24, 2, 0},
+/* 26 */ { 5, s_8_26, 24, 2, 0},
+/* 27 */ { 4, s_8_27, -1, 2, 0},
+/* 28 */ { 5, s_8_28, -1, 2, 0},
+/* 29 */ { 4, s_8_29, -1, 2, 0},
+/* 30 */ { 4, s_8_30, -1, 2, 0},
+/* 31 */ { 4, s_8_31, -1, 2, 0},
+/* 32 */ { 3, s_8_32, -1, 2, 0},
+/* 33 */ { 3, s_8_33, -1, 2, 0},
+/* 34 */ { 4, s_8_34, -1, 2, 0},
+/* 35 */ { 5, s_8_35, -1, 2, 0},
+/* 36 */ { 2, s_8_36, -1, 2, 0},
+/* 37 */ { 2, s_8_37, -1, 2, 0},
+/* 38 */ { 2, s_8_38, -1, 2, 0},
+/* 39 */ { 2, s_8_39, -1, 2, 0},
+/* 40 */ { 4, s_8_40, 39, 2, 0},
+/* 41 */ { 4, s_8_41, 39, 2, 0},
+/* 42 */ { 4, s_8_42, 39, 2, 0},
+/* 43 */ { 4, s_8_43, 39, 2, 0},
+/* 44 */ { 5, s_8_44, 39, 2, 0},
+/* 45 */ { 3, s_8_45, 39, 2, 0},
+/* 46 */ { 5, s_8_46, 45, 2, 0},
+/* 47 */ { 5, s_8_47, 45, 2, 0},
+/* 48 */ { 5, s_8_48, 45, 2, 0},
+/* 49 */ { 2, s_8_49, -1, 1, 0},
+/* 50 */ { 4, s_8_50, 49, 2, 0},
+/* 51 */ { 5, s_8_51, 49, 2, 0},
+/* 52 */ { 5, s_8_52, -1, 2, 0},
+/* 53 */ { 5, s_8_53, -1, 2, 0},
+/* 54 */ { 6, s_8_54, -1, 2, 0},
+/* 55 */ { 4, s_8_55, -1, 2, 0},
+/* 56 */ { 6, s_8_56, 55, 2, 0},
+/* 57 */ { 6, s_8_57, 55, 2, 0},
+/* 58 */ { 6, s_8_58, 55, 2, 0},
+/* 59 */ { 5, s_8_59, -1, 2, 0},
+/* 60 */ { 6, s_8_60, -1, 2, 0},
+/* 61 */ { 6, s_8_61, -1, 2, 0},
+/* 62 */ { 6, s_8_62, -1, 2, 0},
+/* 63 */ { 3, s_8_63, -1, 2, 0},
+/* 64 */ { 3, s_8_64, -1, 1, 0},
+/* 65 */ { 5, s_8_65, 64, 2, 0},
+/* 66 */ { 5, s_8_66, 64, 2, 0},
+/* 67 */ { 5, s_8_67, 64, 2, 0},
+/* 68 */ { 4, s_8_68, -1, 2, 0},
+/* 69 */ { 4, s_8_69, -1, 2, 0},
+/* 70 */ { 4, s_8_70, -1, 2, 0},
+/* 71 */ { 6, s_8_71, 70, 2, 0},
+/* 72 */ { 6, s_8_72, 70, 2, 0},
+/* 73 */ { 7, s_8_73, 70, 2, 0},
+/* 74 */ { 5, s_8_74, 70, 2, 0},
+/* 75 */ { 7, s_8_75, 74, 2, 0},
+/* 76 */ { 7, s_8_76, 74, 2, 0},
+/* 77 */ { 7, s_8_77, 74, 2, 0},
+/* 78 */ { 4, s_8_78, -1, 1, 0},
+/* 79 */ { 6, s_8_79, 78, 2, 0},
+/* 80 */ { 6, s_8_80, 78, 2, 0},
+/* 81 */ { 6, s_8_81, 78, 2, 0},
+/* 82 */ { 6, s_8_82, 78, 2, 0},
+/* 83 */ { 7, s_8_83, 78, 2, 0},
+/* 84 */ { 4, s_8_84, -1, 2, 0},
+/* 85 */ { 4, s_8_85, -1, 2, 0},
+/* 86 */ { 4, s_8_86, -1, 2, 0},
+/* 87 */ { 4, s_8_87, -1, 2, 0},
+/* 88 */ { 2, s_8_88, -1, 2, 0},
+/* 89 */ { 3, s_8_89, -1, 2, 0},
+/* 90 */ { 3, s_8_90, -1, 2, 0},
+/* 91 */ { 3, s_8_91, -1, 2, 0},
+/* 92 */ { 3, s_8_92, -1, 2, 0},
+/* 93 */ { 3, s_8_93, -1, 2, 0},
+/* 94 */ { 3, s_8_94, -1, 2, 0},
+/* 95 */ { 2, s_8_95, -1, 2, 0}
+};
+
+static symbol s_9_0[1] = { 'a' };
+static symbol s_9_1[1] = { 'e' };
+static symbol s_9_2[1] = { 'o' };
+static symbol s_9_3[2] = { 'o', 's' };
+static symbol s_9_4[1] = { 0xE1 };
+static symbol s_9_5[1] = { 0xE9 };
+static symbol s_9_6[1] = { 0xED };
+static symbol s_9_7[1] = { 0xF3 };
+
+static struct among a_9[8] =
+{
+/*  0 */ { 1, s_9_0, -1, 1, 0},
+/*  1 */ { 1, s_9_1, -1, 2, 0},
+/*  2 */ { 1, s_9_2, -1, 1, 0},
+/*  3 */ { 2, s_9_3, -1, 1, 0},
+/*  4 */ { 1, s_9_4, -1, 1, 0},
+/*  5 */ { 1, s_9_5, -1, 2, 0},
+/*  6 */ { 1, s_9_6, -1, 1, 0},
+/*  7 */ { 1, s_9_7, -1, 1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 4, 10 };
+
+static symbol s_0[] = { 'a' };
+static symbol s_1[] = { 'e' };
+static symbol s_2[] = { 'i' };
+static symbol s_3[] = { 'o' };
+static symbol s_4[] = { 'u' };
+static symbol s_5[] = { 'i', 'e', 'n', 'd', 'o' };
+static symbol s_6[] = { 'a', 'n', 'd', 'o' };
+static symbol s_7[] = { 'a', 'r' };
+static symbol s_8[] = { 'e', 'r' };
+static symbol s_9[] = { 'i', 'r' };
+static symbol s_10[] = { 'u' };
+static symbol s_11[] = { 'i', 'c' };
+static symbol s_12[] = { 'l', 'o', 'g' };
+static symbol s_13[] = { 'u' };
+static symbol s_14[] = { 'e', 'n', 't', 'e' };
+static symbol s_15[] = { 'a', 't' };
+static symbol s_16[] = { 'a', 't' };
+static symbol s_17[] = { 'u' };
+static symbol s_18[] = { 'u' };
+static symbol s_19[] = { 'g' };
+static symbol s_20[] = { 'u' };
+static symbol s_21[] = { 'g' };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    z->I[2] = z->l;
+    {   int c = z->c; /* do, line 37 */
+        {   int c = z->c; /* or, line 39 */
+            if (!(in_grouping(z, g_v, 97, 252))) goto lab2;
+            {   int c = z->c; /* or, line 38 */
+                if (!(out_grouping(z, g_v, 97, 252))) goto lab4;
+                while(1) { /* gopast, line 38 */
+                    if (!(in_grouping(z, g_v, 97, 252))) goto lab5;
+                    break;
+                lab5:
+                    if (z->c >= z->l) goto lab4;
+                    z->c++; /* gopast, line 38 */
+                }
+                goto lab3;
+            lab4:
+                z->c = c;
+                if (!(in_grouping(z, g_v, 97, 252))) goto lab2;
+                while(1) { /* gopast, line 38 */
+                    if (!(out_grouping(z, g_v, 97, 252))) goto lab6;
+                    break;
+                lab6:
+                    if (z->c >= z->l) goto lab2;
+                    z->c++; /* gopast, line 38 */
+                }
+            }
+        lab3:
+            goto lab1;
+        lab2:
+            z->c = c;
+            if (!(out_grouping(z, g_v, 97, 252))) goto lab0;
+            {   int c = z->c; /* or, line 40 */
+                if (!(out_grouping(z, g_v, 97, 252))) goto lab8;
+                while(1) { /* gopast, line 40 */
+                    if (!(in_grouping(z, g_v, 97, 252))) goto lab9;
+                    break;
+                lab9:
+                    if (z->c >= z->l) goto lab8;
+                    z->c++; /* gopast, line 40 */
+                }
+                goto lab7;
+            lab8:
+                z->c = c;
+                if (!(in_grouping(z, g_v, 97, 252))) goto lab0;
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 40 */
+            }
+        lab7:
+            ;
+        }
+    lab1:
+        z->I[0] = z->c; /* setmark pV, line 41 */
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 43 */
+        while(1) { /* gopast, line 44 */
+            if (!(in_grouping(z, g_v, 97, 252))) goto lab11;
+            break;
+        lab11:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 44 */
+        }
+        while(1) { /* gopast, line 44 */
+            if (!(out_grouping(z, g_v, 97, 252))) goto lab12;
+            break;
+        lab12:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 44 */
+        }
+        z->I[1] = z->c; /* setmark p1, line 44 */
+        while(1) { /* gopast, line 45 */
+            if (!(in_grouping(z, g_v, 97, 252))) goto lab13;
+            break;
+        lab13:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 45 */
+        }
+        while(1) { /* gopast, line 45 */
+            if (!(out_grouping(z, g_v, 97, 252))) goto lab14;
+            break;
+        lab14:
+            if (z->c >= z->l) goto lab10;
+            z->c++; /* gopast, line 45 */
+        }
+        z->I[2] = z->c; /* setmark p2, line 45 */
+    lab10:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 49 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 50 */
+        among_var = find_among(z, a_0, 6); /* substring, line 50 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 50 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_0); /* <-, line 51 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_1); /* <-, line 52 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_2); /* <-, line 53 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 4:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_3); /* <-, line 54 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 5:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_4); /* <-, line 55 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 6:
+                if (z->c >= z->l) goto lab0;
+                z->c++; /* next, line 57 */
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_RV(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[2] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_attached_pronoun(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 68 */
+    if (!(find_among_b(z, a_1, 13))) return 0; /* substring, line 68 */
+    z->bra = z->c; /* ], line 68 */
+    among_var = find_among_b(z, a_2, 11); /* substring, line 72 */
+    if (!(among_var)) return 0;
+    {   int ret = r_RV(z);
+        if (ret == 0) return 0; /* call RV, line 72 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            z->bra = z->c; /* ], line 73 */
+            {   int ret;
+                ret = slice_from_s(z, 5, s_5); /* <-, line 73 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            z->bra = z->c; /* ], line 74 */
+            {   int ret;
+                ret = slice_from_s(z, 4, s_6); /* <-, line 74 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            z->bra = z->c; /* ], line 75 */
+            {   int ret;
+                ret = slice_from_s(z, 2, s_7); /* <-, line 75 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            z->bra = z->c; /* ], line 76 */
+            {   int ret;
+                ret = slice_from_s(z, 2, s_8); /* <-, line 76 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            z->bra = z->c; /* ], line 77 */
+            {   int ret;
+                ret = slice_from_s(z, 2, s_9); /* <-, line 77 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 81 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 7:
+            if (!(eq_s_b(z, 1, s_10))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 82 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 87 */
+    among_var = find_among_b(z, a_6, 46); /* substring, line 87 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 87 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 99 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 99 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 105 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 105 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 106 */
+                z->ket = z->c; /* [, line 106 */
+                if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m; goto lab0; }
+                z->bra = z->c; /* ], line 106 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 106 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 106 */
+                    if (ret < 0) return ret;
+                }
+            lab0:
+                ;
+            }
+            break;
+        case 3:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 111 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_12); /* <-, line 111 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 115 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_13); /* <-, line 115 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 119 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 4, s_14); /* <-, line 119 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 123 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 123 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 124 */
+                z->ket = z->c; /* [, line 125 */
+                among_var = find_among_b(z, a_3, 4); /* substring, line 125 */
+                if (!(among_var)) { z->c = z->l - m; goto lab1; }
+                z->bra = z->c; /* ], line 125 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 125 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 125 */
+                    if (ret < 0) return ret;
+                }
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab1; }
+                    case 1:
+                        z->ket = z->c; /* [, line 126 */
+                        if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m; goto lab1; }
+                        z->bra = z->c; /* ], line 126 */
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 126 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 126 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab1:
+                ;
+            }
+            break;
+        case 7:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 135 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 135 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 136 */
+                z->ket = z->c; /* [, line 137 */
+                among_var = find_among_b(z, a_4, 3); /* substring, line 137 */
+                if (!(among_var)) { z->c = z->l - m; goto lab2; }
+                z->bra = z->c; /* ], line 137 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab2; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 140 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 140 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab2:
+                ;
+            }
+            break;
+        case 8:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 147 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 147 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 148 */
+                z->ket = z->c; /* [, line 149 */
+                among_var = find_among_b(z, a_5, 3); /* substring, line 149 */
+                if (!(among_var)) { z->c = z->l - m; goto lab3; }
+                z->bra = z->c; /* ], line 149 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab3; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 152 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 152 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab3:
+                ;
+            }
+            break;
+        case 9:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 159 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 159 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 160 */
+                z->ket = z->c; /* [, line 161 */
+                if (!(eq_s_b(z, 2, s_16))) { z->c = z->l - m; goto lab4; }
+                z->bra = z->c; /* ], line 161 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab4; } /* call R2, line 161 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 161 */
+                    if (ret < 0) return ret;
+                }
+            lab4:
+                ;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_y_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 168 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 168 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 168 */
+        among_var = find_among_b(z, a_7, 12); /* substring, line 168 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 168 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            if (!(eq_s_b(z, 1, s_17))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 171 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 176 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 176 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 176 */
+        among_var = find_among_b(z, a_8, 96); /* substring, line 176 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 176 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* try, line 179 */
+                if (!(eq_s_b(z, 1, s_18))) { z->c = z->l - m; goto lab0; }
+                {   int m_test = z->l - z->c; /* test, line 179 */
+                    if (!(eq_s_b(z, 1, s_19))) { z->c = z->l - m; goto lab0; }
+                    z->c = z->l - m_test;
+                }
+            lab0:
+                ;
+            }
+            z->bra = z->c; /* ], line 179 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 179 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 200 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_residual_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 205 */
+    among_var = find_among_b(z, a_9, 8); /* substring, line 205 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 205 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 208 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 208 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 210 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 210 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 210 */
+                z->ket = z->c; /* [, line 210 */
+                if (!(eq_s_b(z, 1, s_20))) { z->c = z->l - m; goto lab0; }
+                z->bra = z->c; /* ], line 210 */
+                {   int m_test = z->l - z->c; /* test, line 210 */
+                    if (!(eq_s_b(z, 1, s_21))) { z->c = z->l - m; goto lab0; }
+                    z->c = z->l - m_test;
+                }
+                {   int ret = r_RV(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 210 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 210 */
+                    if (ret < 0) return ret;
+                }
+            lab0:
+                ;
+            }
+            break;
+    }
+    return 1;
+}
+
+extern int spanish_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 216 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 216 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 217 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 218 */
+        {   int ret = r_attached_pronoun(z);
+            if (ret == 0) goto lab1; /* call attached_pronoun, line 218 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 219 */
+        {   int m = z->l - z->c; (void) m; /* or, line 219 */
+            {   int ret = r_standard_suffix(z);
+                if (ret == 0) goto lab4; /* call standard_suffix, line 219 */
+                if (ret < 0) return ret;
+            }
+            goto lab3;
+        lab4:
+            z->c = z->l - m;
+            {   int ret = r_y_verb_suffix(z);
+                if (ret == 0) goto lab5; /* call y_verb_suffix, line 220 */
+                if (ret < 0) return ret;
+            }
+            goto lab3;
+        lab5:
+            z->c = z->l - m;
+            {   int ret = r_verb_suffix(z);
+                if (ret == 0) goto lab2; /* call verb_suffix, line 221 */
+                if (ret < 0) return ret;
+            }
+        }
+    lab3:
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 223 */
+        {   int ret = r_residual_suffix(z);
+            if (ret == 0) goto lab6; /* call residual_suffix, line 223 */
+            if (ret < 0) return ret;
+        }
+    lab6:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 225 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab7; /* call postlude, line 225 */
+            if (ret < 0) return ret;
+        }
+    lab7:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * spanish_ISO_8859_1_create_env(void) { return SN_create_env(0, 3, 0); }
+
+extern void spanish_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_spanish.h b/libstemmer_c/src_c/stem_ISO_8859_1_spanish.h
new file mode 100644
index 0000000..83f1498
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_spanish.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * spanish_ISO_8859_1_create_env(void);
+extern void spanish_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int spanish_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_swedish.c b/libstemmer_c/src_c/stem_ISO_8859_1_swedish.c
new file mode 100644
index 0000000..c571fd9
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_swedish.c
@@ -0,0 +1,307 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int swedish_ISO_8859_1_stem(struct SN_env * z);
+static int r_other_suffix(struct SN_env * z);
+static int r_consonant_pair(struct SN_env * z);
+static int r_main_suffix(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+
+extern struct SN_env * swedish_ISO_8859_1_create_env(void);
+extern void swedish_ISO_8859_1_close_env(struct SN_env * z);
+
+static symbol s_0_0[1] = { 'a' };
+static symbol s_0_1[4] = { 'a', 'r', 'n', 'a' };
+static symbol s_0_2[4] = { 'e', 'r', 'n', 'a' };
+static symbol s_0_3[7] = { 'h', 'e', 't', 'e', 'r', 'n', 'a' };
+static symbol s_0_4[4] = { 'o', 'r', 'n', 'a' };
+static symbol s_0_5[2] = { 'a', 'd' };
+static symbol s_0_6[1] = { 'e' };
+static symbol s_0_7[3] = { 'a', 'd', 'e' };
+static symbol s_0_8[4] = { 'a', 'n', 'd', 'e' };
+static symbol s_0_9[4] = { 'a', 'r', 'n', 'e' };
+static symbol s_0_10[3] = { 'a', 'r', 'e' };
+static symbol s_0_11[4] = { 'a', 's', 't', 'e' };
+static symbol s_0_12[2] = { 'e', 'n' };
+static symbol s_0_13[5] = { 'a', 'n', 'd', 'e', 'n' };
+static symbol s_0_14[4] = { 'a', 'r', 'e', 'n' };
+static symbol s_0_15[5] = { 'h', 'e', 't', 'e', 'n' };
+static symbol s_0_16[3] = { 'e', 'r', 'n' };
+static symbol s_0_17[2] = { 'a', 'r' };
+static symbol s_0_18[2] = { 'e', 'r' };
+static symbol s_0_19[5] = { 'h', 'e', 't', 'e', 'r' };
+static symbol s_0_20[2] = { 'o', 'r' };
+static symbol s_0_21[1] = { 's' };
+static symbol s_0_22[2] = { 'a', 's' };
+static symbol s_0_23[5] = { 'a', 'r', 'n', 'a', 's' };
+static symbol s_0_24[5] = { 'e', 'r', 'n', 'a', 's' };
+static symbol s_0_25[5] = { 'o', 'r', 'n', 'a', 's' };
+static symbol s_0_26[2] = { 'e', 's' };
+static symbol s_0_27[4] = { 'a', 'd', 'e', 's' };
+static symbol s_0_28[5] = { 'a', 'n', 'd', 'e', 's' };
+static symbol s_0_29[3] = { 'e', 'n', 's' };
+static symbol s_0_30[5] = { 'a', 'r', 'e', 'n', 's' };
+static symbol s_0_31[6] = { 'h', 'e', 't', 'e', 'n', 's' };
+static symbol s_0_32[4] = { 'e', 'r', 'n', 's' };
+static symbol s_0_33[2] = { 'a', 't' };
+static symbol s_0_34[5] = { 'a', 'n', 'd', 'e', 't' };
+static symbol s_0_35[3] = { 'h', 'e', 't' };
+static symbol s_0_36[3] = { 'a', 's', 't' };
+
+static struct among a_0[37] =
+{
+/*  0 */ { 1, s_0_0, -1, 1, 0},
+/*  1 */ { 4, s_0_1, 0, 1, 0},
+/*  2 */ { 4, s_0_2, 0, 1, 0},
+/*  3 */ { 7, s_0_3, 2, 1, 0},
+/*  4 */ { 4, s_0_4, 0, 1, 0},
+/*  5 */ { 2, s_0_5, -1, 1, 0},
+/*  6 */ { 1, s_0_6, -1, 1, 0},
+/*  7 */ { 3, s_0_7, 6, 1, 0},
+/*  8 */ { 4, s_0_8, 6, 1, 0},
+/*  9 */ { 4, s_0_9, 6, 1, 0},
+/* 10 */ { 3, s_0_10, 6, 1, 0},
+/* 11 */ { 4, s_0_11, 6, 1, 0},
+/* 12 */ { 2, s_0_12, -1, 1, 0},
+/* 13 */ { 5, s_0_13, 12, 1, 0},
+/* 14 */ { 4, s_0_14, 12, 1, 0},
+/* 15 */ { 5, s_0_15, 12, 1, 0},
+/* 16 */ { 3, s_0_16, -1, 1, 0},
+/* 17 */ { 2, s_0_17, -1, 1, 0},
+/* 18 */ { 2, s_0_18, -1, 1, 0},
+/* 19 */ { 5, s_0_19, 18, 1, 0},
+/* 20 */ { 2, s_0_20, -1, 1, 0},
+/* 21 */ { 1, s_0_21, -1, 2, 0},
+/* 22 */ { 2, s_0_22, 21, 1, 0},
+/* 23 */ { 5, s_0_23, 22, 1, 0},
+/* 24 */ { 5, s_0_24, 22, 1, 0},
+/* 25 */ { 5, s_0_25, 22, 1, 0},
+/* 26 */ { 2, s_0_26, 21, 1, 0},
+/* 27 */ { 4, s_0_27, 26, 1, 0},
+/* 28 */ { 5, s_0_28, 26, 1, 0},
+/* 29 */ { 3, s_0_29, 21, 1, 0},
+/* 30 */ { 5, s_0_30, 29, 1, 0},
+/* 31 */ { 6, s_0_31, 29, 1, 0},
+/* 32 */ { 4, s_0_32, 21, 1, 0},
+/* 33 */ { 2, s_0_33, -1, 1, 0},
+/* 34 */ { 5, s_0_34, -1, 1, 0},
+/* 35 */ { 3, s_0_35, -1, 1, 0},
+/* 36 */ { 3, s_0_36, -1, 1, 0}
+};
+
+static symbol s_1_0[2] = { 'd', 'd' };
+static symbol s_1_1[2] = { 'g', 'd' };
+static symbol s_1_2[2] = { 'n', 'n' };
+static symbol s_1_3[2] = { 'd', 't' };
+static symbol s_1_4[2] = { 'g', 't' };
+static symbol s_1_5[2] = { 'k', 't' };
+static symbol s_1_6[2] = { 't', 't' };
+
+static struct among a_1[7] =
+{
+/*  0 */ { 2, s_1_0, -1, -1, 0},
+/*  1 */ { 2, s_1_1, -1, -1, 0},
+/*  2 */ { 2, s_1_2, -1, -1, 0},
+/*  3 */ { 2, s_1_3, -1, -1, 0},
+/*  4 */ { 2, s_1_4, -1, -1, 0},
+/*  5 */ { 2, s_1_5, -1, -1, 0},
+/*  6 */ { 2, s_1_6, -1, -1, 0}
+};
+
+static symbol s_2_0[2] = { 'i', 'g' };
+static symbol s_2_1[3] = { 'l', 'i', 'g' };
+static symbol s_2_2[3] = { 'e', 'l', 's' };
+static symbol s_2_3[5] = { 'f', 'u', 'l', 'l', 't' };
+static symbol s_2_4[4] = { 'l', 0xF6, 's', 't' };
+
+static struct among a_2[5] =
+{
+/*  0 */ { 2, s_2_0, -1, 1, 0},
+/*  1 */ { 3, s_2_1, 0, 1, 0},
+/*  2 */ { 3, s_2_2, -1, 1, 0},
+/*  3 */ { 5, s_2_3, -1, 3, 0},
+/*  4 */ { 4, s_2_4, -1, 2, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 32 };
+
+static unsigned char g_s_ending[] = { 119, 127, 149 };
+
+static symbol s_0[] = { 'l', 0xF6, 's' };
+static symbol s_1[] = { 'f', 'u', 'l', 'l' };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    {   int c_test = z->c; /* test, line 29 */
+        {   int c = z->c + 3;
+            if (0 > c || c > z->l) return 0;
+            z->c = c; /* hop, line 29 */
+        }
+        z->I[1] = z->c; /* setmark x, line 29 */
+        z->c = c_test;
+    }
+    while(1) { /* goto, line 30 */
+        int c = z->c;
+        if (!(in_grouping(z, g_v, 97, 246))) goto lab0;
+        z->c = c;
+        break;
+    lab0:
+        z->c = c;
+        if (z->c >= z->l) return 0;
+        z->c++; /* goto, line 30 */
+    }
+    while(1) { /* gopast, line 30 */
+        if (!(out_grouping(z, g_v, 97, 246))) goto lab1;
+        break;
+    lab1:
+        if (z->c >= z->l) return 0;
+        z->c++; /* gopast, line 30 */
+    }
+    z->I[0] = z->c; /* setmark p1, line 30 */
+     /* try, line 31 */
+    if (!(z->I[0] < z->I[1])) goto lab2;
+    z->I[0] = z->I[1];
+lab2:
+    return 1;
+}
+
+static int r_main_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 37 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 37 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 37 */
+        among_var = find_among_b(z, a_0, 37); /* substring, line 37 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 37 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 44 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            if (!(in_grouping_b(z, g_s_ending, 98, 121))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 46 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_consonant_pair(struct SN_env * z) {
+    {   int m3; /* setlimit, line 50 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 50 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        {   int m = z->l - z->c; (void) m; /* and, line 52 */
+            if (!(find_among_b(z, a_1, 7))) { z->lb = m3; return 0; } /* among, line 51 */
+            z->c = z->l - m;
+            z->ket = z->c; /* [, line 52 */
+            if (z->c <= z->lb) { z->lb = m3; return 0; }
+            z->c--; /* next, line 52 */
+            z->bra = z->c; /* ], line 52 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 52 */
+                if (ret < 0) return ret;
+            }
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_other_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 55 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 55 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 56 */
+        among_var = find_among_b(z, a_2, 5); /* substring, line 56 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 56 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 57 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 3, s_0); /* <-, line 58 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_from_s(z, 4, s_1); /* <-, line 59 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+extern int swedish_ISO_8859_1_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 66 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 66 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 67 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 68 */
+        {   int ret = r_main_suffix(z);
+            if (ret == 0) goto lab1; /* call main_suffix, line 68 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 69 */
+        {   int ret = r_consonant_pair(z);
+            if (ret == 0) goto lab2; /* call consonant_pair, line 69 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 70 */
+        {   int ret = r_other_suffix(z);
+            if (ret == 0) goto lab3; /* call other_suffix, line 70 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * swedish_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 0); }
+
+extern void swedish_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_ISO_8859_1_swedish.h b/libstemmer_c/src_c/stem_ISO_8859_1_swedish.h
new file mode 100644
index 0000000..4184e5c
--- /dev/null
+++ b/libstemmer_c/src_c/stem_ISO_8859_1_swedish.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * swedish_ISO_8859_1_create_env(void);
+extern void swedish_ISO_8859_1_close_env(struct SN_env * z);
+
+extern int swedish_ISO_8859_1_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_KOI8_R_russian.c b/libstemmer_c/src_c/stem_KOI8_R_russian.c
new file mode 100644
index 0000000..0a68a3b
--- /dev/null
+++ b/libstemmer_c/src_c/stem_KOI8_R_russian.c
@@ -0,0 +1,701 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int russian_KOI8_R_stem(struct SN_env * z);
+static int r_tidy_up(struct SN_env * z);
+static int r_derivational(struct SN_env * z);
+static int r_noun(struct SN_env * z);
+static int r_verb(struct SN_env * z);
+static int r_reflexive(struct SN_env * z);
+static int r_adjectival(struct SN_env * z);
+static int r_adjective(struct SN_env * z);
+static int r_perfective_gerund(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+
+extern struct SN_env * russian_KOI8_R_create_env(void);
+extern void russian_KOI8_R_close_env(struct SN_env * z);
+
+static symbol s_0_0[3] = { 0xD7, 0xDB, 0xC9 };
+static symbol s_0_1[4] = { 0xC9, 0xD7, 0xDB, 0xC9 };
+static symbol s_0_2[4] = { 0xD9, 0xD7, 0xDB, 0xC9 };
+static symbol s_0_3[1] = { 0xD7 };
+static symbol s_0_4[2] = { 0xC9, 0xD7 };
+static symbol s_0_5[2] = { 0xD9, 0xD7 };
+static symbol s_0_6[5] = { 0xD7, 0xDB, 0xC9, 0xD3, 0xD8 };
+static symbol s_0_7[6] = { 0xC9, 0xD7, 0xDB, 0xC9, 0xD3, 0xD8 };
+static symbol s_0_8[6] = { 0xD9, 0xD7, 0xDB, 0xC9, 0xD3, 0xD8 };
+
+static struct among a_0[9] =
+{
+/*  0 */ { 3, s_0_0, -1, 1, 0},
+/*  1 */ { 4, s_0_1, 0, 2, 0},
+/*  2 */ { 4, s_0_2, 0, 2, 0},
+/*  3 */ { 1, s_0_3, -1, 1, 0},
+/*  4 */ { 2, s_0_4, 3, 2, 0},
+/*  5 */ { 2, s_0_5, 3, 2, 0},
+/*  6 */ { 5, s_0_6, -1, 1, 0},
+/*  7 */ { 6, s_0_7, 6, 2, 0},
+/*  8 */ { 6, s_0_8, 6, 2, 0}
+};
+
+static symbol s_1_0[2] = { 0xC0, 0xC0 };
+static symbol s_1_1[2] = { 0xC5, 0xC0 };
+static symbol s_1_2[2] = { 0xCF, 0xC0 };
+static symbol s_1_3[2] = { 0xD5, 0xC0 };
+static symbol s_1_4[2] = { 0xC5, 0xC5 };
+static symbol s_1_5[2] = { 0xC9, 0xC5 };
+static symbol s_1_6[2] = { 0xCF, 0xC5 };
+static symbol s_1_7[2] = { 0xD9, 0xC5 };
+static symbol s_1_8[2] = { 0xC9, 0xC8 };
+static symbol s_1_9[2] = { 0xD9, 0xC8 };
+static symbol s_1_10[3] = { 0xC9, 0xCD, 0xC9 };
+static symbol s_1_11[3] = { 0xD9, 0xCD, 0xC9 };
+static symbol s_1_12[2] = { 0xC5, 0xCA };
+static symbol s_1_13[2] = { 0xC9, 0xCA };
+static symbol s_1_14[2] = { 0xCF, 0xCA };
+static symbol s_1_15[2] = { 0xD9, 0xCA };
+static symbol s_1_16[2] = { 0xC5, 0xCD };
+static symbol s_1_17[2] = { 0xC9, 0xCD };
+static symbol s_1_18[2] = { 0xCF, 0xCD };
+static symbol s_1_19[2] = { 0xD9, 0xCD };
+static symbol s_1_20[3] = { 0xC5, 0xC7, 0xCF };
+static symbol s_1_21[3] = { 0xCF, 0xC7, 0xCF };
+static symbol s_1_22[2] = { 0xC1, 0xD1 };
+static symbol s_1_23[2] = { 0xD1, 0xD1 };
+static symbol s_1_24[3] = { 0xC5, 0xCD, 0xD5 };
+static symbol s_1_25[3] = { 0xCF, 0xCD, 0xD5 };
+
+static struct among a_1[26] =
+{
+/*  0 */ { 2, s_1_0, -1, 1, 0},
+/*  1 */ { 2, s_1_1, -1, 1, 0},
+/*  2 */ { 2, s_1_2, -1, 1, 0},
+/*  3 */ { 2, s_1_3, -1, 1, 0},
+/*  4 */ { 2, s_1_4, -1, 1, 0},
+/*  5 */ { 2, s_1_5, -1, 1, 0},
+/*  6 */ { 2, s_1_6, -1, 1, 0},
+/*  7 */ { 2, s_1_7, -1, 1, 0},
+/*  8 */ { 2, s_1_8, -1, 1, 0},
+/*  9 */ { 2, s_1_9, -1, 1, 0},
+/* 10 */ { 3, s_1_10, -1, 1, 0},
+/* 11 */ { 3, s_1_11, -1, 1, 0},
+/* 12 */ { 2, s_1_12, -1, 1, 0},
+/* 13 */ { 2, s_1_13, -1, 1, 0},
+/* 14 */ { 2, s_1_14, -1, 1, 0},
+/* 15 */ { 2, s_1_15, -1, 1, 0},
+/* 16 */ { 2, s_1_16, -1, 1, 0},
+/* 17 */ { 2, s_1_17, -1, 1, 0},
+/* 18 */ { 2, s_1_18, -1, 1, 0},
+/* 19 */ { 2, s_1_19, -1, 1, 0},
+/* 20 */ { 3, s_1_20, -1, 1, 0},
+/* 21 */ { 3, s_1_21, -1, 1, 0},
+/* 22 */ { 2, s_1_22, -1, 1, 0},
+/* 23 */ { 2, s_1_23, -1, 1, 0},
+/* 24 */ { 3, s_1_24, -1, 1, 0},
+/* 25 */ { 3, s_1_25, -1, 1, 0}
+};
+
+static symbol s_2_0[2] = { 0xC5, 0xCD };
+static symbol s_2_1[2] = { 0xCE, 0xCE };
+static symbol s_2_2[2] = { 0xD7, 0xDB };
+static symbol s_2_3[3] = { 0xC9, 0xD7, 0xDB };
+static symbol s_2_4[3] = { 0xD9, 0xD7, 0xDB };
+static symbol s_2_5[1] = { 0xDD };
+static symbol s_2_6[2] = { 0xC0, 0xDD };
+static symbol s_2_7[3] = { 0xD5, 0xC0, 0xDD };
+
+static struct among a_2[8] =
+{
+/*  0 */ { 2, s_2_0, -1, 1, 0},
+/*  1 */ { 2, s_2_1, -1, 1, 0},
+/*  2 */ { 2, s_2_2, -1, 1, 0},
+/*  3 */ { 3, s_2_3, 2, 2, 0},
+/*  4 */ { 3, s_2_4, 2, 2, 0},
+/*  5 */ { 1, s_2_5, -1, 1, 0},
+/*  6 */ { 2, s_2_6, 5, 1, 0},
+/*  7 */ { 3, s_2_7, 6, 2, 0}
+};
+
+static symbol s_3_0[2] = { 0xD3, 0xD1 };
+static symbol s_3_1[2] = { 0xD3, 0xD8 };
+
+static struct among a_3[2] =
+{
+/*  0 */ { 2, s_3_0, -1, 1, 0},
+/*  1 */ { 2, s_3_1, -1, 1, 0}
+};
+
+static symbol s_4_0[1] = { 0xC0 };
+static symbol s_4_1[2] = { 0xD5, 0xC0 };
+static symbol s_4_2[2] = { 0xCC, 0xC1 };
+static symbol s_4_3[3] = { 0xC9, 0xCC, 0xC1 };
+static symbol s_4_4[3] = { 0xD9, 0xCC, 0xC1 };
+static symbol s_4_5[2] = { 0xCE, 0xC1 };
+static symbol s_4_6[3] = { 0xC5, 0xCE, 0xC1 };
+static symbol s_4_7[3] = { 0xC5, 0xD4, 0xC5 };
+static symbol s_4_8[3] = { 0xC9, 0xD4, 0xC5 };
+static symbol s_4_9[3] = { 0xCA, 0xD4, 0xC5 };
+static symbol s_4_10[4] = { 0xC5, 0xCA, 0xD4, 0xC5 };
+static symbol s_4_11[4] = { 0xD5, 0xCA, 0xD4, 0xC5 };
+static symbol s_4_12[2] = { 0xCC, 0xC9 };
+static symbol s_4_13[3] = { 0xC9, 0xCC, 0xC9 };
+static symbol s_4_14[3] = { 0xD9, 0xCC, 0xC9 };
+static symbol s_4_15[1] = { 0xCA };
+static symbol s_4_16[2] = { 0xC5, 0xCA };
+static symbol s_4_17[2] = { 0xD5, 0xCA };
+static symbol s_4_18[1] = { 0xCC };
+static symbol s_4_19[2] = { 0xC9, 0xCC };
+static symbol s_4_20[2] = { 0xD9, 0xCC };
+static symbol s_4_21[2] = { 0xC5, 0xCD };
+static symbol s_4_22[2] = { 0xC9, 0xCD };
+static symbol s_4_23[2] = { 0xD9, 0xCD };
+static symbol s_4_24[1] = { 0xCE };
+static symbol s_4_25[2] = { 0xC5, 0xCE };
+static symbol s_4_26[2] = { 0xCC, 0xCF };
+static symbol s_4_27[3] = { 0xC9, 0xCC, 0xCF };
+static symbol s_4_28[3] = { 0xD9, 0xCC, 0xCF };
+static symbol s_4_29[2] = { 0xCE, 0xCF };
+static symbol s_4_30[3] = { 0xC5, 0xCE, 0xCF };
+static symbol s_4_31[3] = { 0xCE, 0xCE, 0xCF };
+static symbol s_4_32[2] = { 0xC0, 0xD4 };
+static symbol s_4_33[3] = { 0xD5, 0xC0, 0xD4 };
+static symbol s_4_34[2] = { 0xC5, 0xD4 };
+static symbol s_4_35[3] = { 0xD5, 0xC5, 0xD4 };
+static symbol s_4_36[2] = { 0xC9, 0xD4 };
+static symbol s_4_37[2] = { 0xD1, 0xD4 };
+static symbol s_4_38[2] = { 0xD9, 0xD4 };
+static symbol s_4_39[2] = { 0xD4, 0xD8 };
+static symbol s_4_40[3] = { 0xC9, 0xD4, 0xD8 };
+static symbol s_4_41[3] = { 0xD9, 0xD4, 0xD8 };
+static symbol s_4_42[3] = { 0xC5, 0xDB, 0xD8 };
+static symbol s_4_43[3] = { 0xC9, 0xDB, 0xD8 };
+static symbol s_4_44[2] = { 0xCE, 0xD9 };
+static symbol s_4_45[3] = { 0xC5, 0xCE, 0xD9 };
+
+static struct among a_4[46] =
+{
+/*  0 */ { 1, s_4_0, -1, 2, 0},
+/*  1 */ { 2, s_4_1, 0, 2, 0},
+/*  2 */ { 2, s_4_2, -1, 1, 0},
+/*  3 */ { 3, s_4_3, 2, 2, 0},
+/*  4 */ { 3, s_4_4, 2, 2, 0},
+/*  5 */ { 2, s_4_5, -1, 1, 0},
+/*  6 */ { 3, s_4_6, 5, 2, 0},
+/*  7 */ { 3, s_4_7, -1, 1, 0},
+/*  8 */ { 3, s_4_8, -1, 2, 0},
+/*  9 */ { 3, s_4_9, -1, 1, 0},
+/* 10 */ { 4, s_4_10, 9, 2, 0},
+/* 11 */ { 4, s_4_11, 9, 2, 0},
+/* 12 */ { 2, s_4_12, -1, 1, 0},
+/* 13 */ { 3, s_4_13, 12, 2, 0},
+/* 14 */ { 3, s_4_14, 12, 2, 0},
+/* 15 */ { 1, s_4_15, -1, 1, 0},
+/* 16 */ { 2, s_4_16, 15, 2, 0},
+/* 17 */ { 2, s_4_17, 15, 2, 0},
+/* 18 */ { 1, s_4_18, -1, 1, 0},
+/* 19 */ { 2, s_4_19, 18, 2, 0},
+/* 20 */ { 2, s_4_20, 18, 2, 0},
+/* 21 */ { 2, s_4_21, -1, 1, 0},
+/* 22 */ { 2, s_4_22, -1, 2, 0},
+/* 23 */ { 2, s_4_23, -1, 2, 0},
+/* 24 */ { 1, s_4_24, -1, 1, 0},
+/* 25 */ { 2, s_4_25, 24, 2, 0},
+/* 26 */ { 2, s_4_26, -1, 1, 0},
+/* 27 */ { 3, s_4_27, 26, 2, 0},
+/* 28 */ { 3, s_4_28, 26, 2, 0},
+/* 29 */ { 2, s_4_29, -1, 1, 0},
+/* 30 */ { 3, s_4_30, 29, 2, 0},
+/* 31 */ { 3, s_4_31, 29, 1, 0},
+/* 32 */ { 2, s_4_32, -1, 1, 0},
+/* 33 */ { 3, s_4_33, 32, 2, 0},
+/* 34 */ { 2, s_4_34, -1, 1, 0},
+/* 35 */ { 3, s_4_35, 34, 2, 0},
+/* 36 */ { 2, s_4_36, -1, 2, 0},
+/* 37 */ { 2, s_4_37, -1, 2, 0},
+/* 38 */ { 2, s_4_38, -1, 2, 0},
+/* 39 */ { 2, s_4_39, -1, 1, 0},
+/* 40 */ { 3, s_4_40, 39, 2, 0},
+/* 41 */ { 3, s_4_41, 39, 2, 0},
+/* 42 */ { 3, s_4_42, -1, 1, 0},
+/* 43 */ { 3, s_4_43, -1, 2, 0},
+/* 44 */ { 2, s_4_44, -1, 1, 0},
+/* 45 */ { 3, s_4_45, 44, 2, 0}
+};
+
+static symbol s_5_0[1] = { 0xC0 };
+static symbol s_5_1[2] = { 0xC9, 0xC0 };
+static symbol s_5_2[2] = { 0xD8, 0xC0 };
+static symbol s_5_3[1] = { 0xC1 };
+static symbol s_5_4[1] = { 0xC5 };
+static symbol s_5_5[2] = { 0xC9, 0xC5 };
+static symbol s_5_6[2] = { 0xD8, 0xC5 };
+static symbol s_5_7[2] = { 0xC1, 0xC8 };
+static symbol s_5_8[2] = { 0xD1, 0xC8 };
+static symbol s_5_9[3] = { 0xC9, 0xD1, 0xC8 };
+static symbol s_5_10[1] = { 0xC9 };
+static symbol s_5_11[2] = { 0xC5, 0xC9 };
+static symbol s_5_12[2] = { 0xC9, 0xC9 };
+static symbol s_5_13[3] = { 0xC1, 0xCD, 0xC9 };
+static symbol s_5_14[3] = { 0xD1, 0xCD, 0xC9 };
+static symbol s_5_15[4] = { 0xC9, 0xD1, 0xCD, 0xC9 };
+static symbol s_5_16[1] = { 0xCA };
+static symbol s_5_17[2] = { 0xC5, 0xCA };
+static symbol s_5_18[3] = { 0xC9, 0xC5, 0xCA };
+static symbol s_5_19[2] = { 0xC9, 0xCA };
+static symbol s_5_20[2] = { 0xCF, 0xCA };
+static symbol s_5_21[2] = { 0xC1, 0xCD };
+static symbol s_5_22[2] = { 0xC5, 0xCD };
+static symbol s_5_23[3] = { 0xC9, 0xC5, 0xCD };
+static symbol s_5_24[2] = { 0xCF, 0xCD };
+static symbol s_5_25[2] = { 0xD1, 0xCD };
+static symbol s_5_26[3] = { 0xC9, 0xD1, 0xCD };
+static symbol s_5_27[1] = { 0xCF };
+static symbol s_5_28[1] = { 0xD1 };
+static symbol s_5_29[2] = { 0xC9, 0xD1 };
+static symbol s_5_30[2] = { 0xD8, 0xD1 };
+static symbol s_5_31[1] = { 0xD5 };
+static symbol s_5_32[2] = { 0xC5, 0xD7 };
+static symbol s_5_33[2] = { 0xCF, 0xD7 };
+static symbol s_5_34[1] = { 0xD8 };
+static symbol s_5_35[1] = { 0xD9 };
+
+static struct among a_5[36] =
+{
+/*  0 */ { 1, s_5_0, -1, 1, 0},
+/*  1 */ { 2, s_5_1, 0, 1, 0},
+/*  2 */ { 2, s_5_2, 0, 1, 0},
+/*  3 */ { 1, s_5_3, -1, 1, 0},
+/*  4 */ { 1, s_5_4, -1, 1, 0},
+/*  5 */ { 2, s_5_5, 4, 1, 0},
+/*  6 */ { 2, s_5_6, 4, 1, 0},
+/*  7 */ { 2, s_5_7, -1, 1, 0},
+/*  8 */ { 2, s_5_8, -1, 1, 0},
+/*  9 */ { 3, s_5_9, 8, 1, 0},
+/* 10 */ { 1, s_5_10, -1, 1, 0},
+/* 11 */ { 2, s_5_11, 10, 1, 0},
+/* 12 */ { 2, s_5_12, 10, 1, 0},
+/* 13 */ { 3, s_5_13, 10, 1, 0},
+/* 14 */ { 3, s_5_14, 10, 1, 0},
+/* 15 */ { 4, s_5_15, 14, 1, 0},
+/* 16 */ { 1, s_5_16, -1, 1, 0},
+/* 17 */ { 2, s_5_17, 16, 1, 0},
+/* 18 */ { 3, s_5_18, 17, 1, 0},
+/* 19 */ { 2, s_5_19, 16, 1, 0},
+/* 20 */ { 2, s_5_20, 16, 1, 0},
+/* 21 */ { 2, s_5_21, -1, 1, 0},
+/* 22 */ { 2, s_5_22, -1, 1, 0},
+/* 23 */ { 3, s_5_23, 22, 1, 0},
+/* 24 */ { 2, s_5_24, -1, 1, 0},
+/* 25 */ { 2, s_5_25, -1, 1, 0},
+/* 26 */ { 3, s_5_26, 25, 1, 0},
+/* 27 */ { 1, s_5_27, -1, 1, 0},
+/* 28 */ { 1, s_5_28, -1, 1, 0},
+/* 29 */ { 2, s_5_29, 28, 1, 0},
+/* 30 */ { 2, s_5_30, 28, 1, 0},
+/* 31 */ { 1, s_5_31, -1, 1, 0},
+/* 32 */ { 2, s_5_32, -1, 1, 0},
+/* 33 */ { 2, s_5_33, -1, 1, 0},
+/* 34 */ { 1, s_5_34, -1, 1, 0},
+/* 35 */ { 1, s_5_35, -1, 1, 0}
+};
+
+static symbol s_6_0[3] = { 0xCF, 0xD3, 0xD4 };
+static symbol s_6_1[4] = { 0xCF, 0xD3, 0xD4, 0xD8 };
+
+static struct among a_6[2] =
+{
+/*  0 */ { 3, s_6_0, -1, 1, 0},
+/*  1 */ { 4, s_6_1, -1, 1, 0}
+};
+
+static symbol s_7_0[4] = { 0xC5, 0xCA, 0xDB, 0xC5 };
+static symbol s_7_1[1] = { 0xCE };
+static symbol s_7_2[1] = { 0xD8 };
+static symbol s_7_3[3] = { 0xC5, 0xCA, 0xDB };
+
+static struct among a_7[4] =
+{
+/*  0 */ { 4, s_7_0, -1, 1, 0},
+/*  1 */ { 1, s_7_1, -1, 2, 0},
+/*  2 */ { 1, s_7_2, -1, 3, 0},
+/*  3 */ { 3, s_7_3, -1, 1, 0}
+};
+
+static unsigned char g_v[] = { 35, 130, 34, 18 };
+
+static symbol s_0[] = { 0xC1 };
+static symbol s_1[] = { 0xD1 };
+static symbol s_2[] = { 0xC1 };
+static symbol s_3[] = { 0xD1 };
+static symbol s_4[] = { 0xC1 };
+static symbol s_5[] = { 0xD1 };
+static symbol s_6[] = { 0xCE };
+static symbol s_7[] = { 0xCE };
+static symbol s_8[] = { 0xCE };
+static symbol s_9[] = { 0xC9 };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    {   int c = z->c; /* do, line 63 */
+        while(1) { /* gopast, line 64 */
+            if (!(in_grouping(z, g_v, 192, 220))) goto lab1;
+            break;
+        lab1:
+            if (z->c >= z->l) goto lab0;
+            z->c++; /* gopast, line 64 */
+        }
+        z->I[0] = z->c; /* setmark pV, line 64 */
+        while(1) { /* gopast, line 64 */
+            if (!(out_grouping(z, g_v, 192, 220))) goto lab2;
+            break;
+        lab2:
+            if (z->c >= z->l) goto lab0;
+            z->c++; /* gopast, line 64 */
+        }
+        while(1) { /* gopast, line 65 */
+            if (!(in_grouping(z, g_v, 192, 220))) goto lab3;
+            break;
+        lab3:
+            if (z->c >= z->l) goto lab0;
+            z->c++; /* gopast, line 65 */
+        }
+        while(1) { /* gopast, line 65 */
+            if (!(out_grouping(z, g_v, 192, 220))) goto lab4;
+            break;
+        lab4:
+            if (z->c >= z->l) goto lab0;
+            z->c++; /* gopast, line 65 */
+        }
+        z->I[1] = z->c; /* setmark p2, line 65 */
+    lab0:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_perfective_gerund(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 74 */
+    among_var = find_among_b(z, a_0, 9); /* substring, line 74 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 74 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* or, line 78 */
+                if (!(eq_s_b(z, 1, s_0))) goto lab1;
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_1))) return 0;
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 78 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 85 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_adjective(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 90 */
+    among_var = find_among_b(z, a_1, 26); /* substring, line 90 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 90 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 99 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_adjectival(struct SN_env * z) {
+    int among_var;
+    {   int ret = r_adjective(z);
+        if (ret == 0) return 0; /* call adjective, line 104 */
+        if (ret < 0) return ret;
+    }
+    {   int m = z->l - z->c; (void) m; /* try, line 111 */
+        z->ket = z->c; /* [, line 112 */
+        among_var = find_among_b(z, a_2, 8); /* substring, line 112 */
+        if (!(among_var)) { z->c = z->l - m; goto lab0; }
+        z->bra = z->c; /* ], line 112 */
+        switch(among_var) {
+            case 0: { z->c = z->l - m; goto lab0; }
+            case 1:
+                {   int m = z->l - z->c; (void) m; /* or, line 117 */
+                    if (!(eq_s_b(z, 1, s_2))) goto lab2;
+                    goto lab1;
+                lab2:
+                    z->c = z->l - m;
+                    if (!(eq_s_b(z, 1, s_3))) { z->c = z->l - m; goto lab0; }
+                }
+            lab1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 117 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 124 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab0:
+        ;
+    }
+    return 1;
+}
+
+static int r_reflexive(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 131 */
+    among_var = find_among_b(z, a_3, 2); /* substring, line 131 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 131 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 134 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_verb(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 139 */
+    among_var = find_among_b(z, a_4, 46); /* substring, line 139 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 139 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* or, line 145 */
+                if (!(eq_s_b(z, 1, s_4))) goto lab1;
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_5))) return 0;
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 145 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 153 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_noun(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 162 */
+    among_var = find_among_b(z, a_5, 36); /* substring, line 162 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 162 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 169 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_derivational(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 178 */
+    among_var = find_among_b(z, a_6, 2); /* substring, line 178 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 178 */
+    {   int ret = r_R2(z);
+        if (ret == 0) return 0; /* call R2, line 178 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 181 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_tidy_up(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 186 */
+    among_var = find_among_b(z, a_7, 4); /* substring, line 186 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 186 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 190 */
+                if (ret < 0) return ret;
+            }
+            z->ket = z->c; /* [, line 191 */
+            if (!(eq_s_b(z, 1, s_6))) return 0;
+            z->bra = z->c; /* ], line 191 */
+            if (!(eq_s_b(z, 1, s_7))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 191 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            if (!(eq_s_b(z, 1, s_8))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 194 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 196 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+extern int russian_KOI8_R_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 203 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 203 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 204 */
+
+    {   int m3; /* setlimit, line 204 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 204 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        {   int m = z->l - z->c; (void) m; /* do, line 205 */
+            {   int m = z->l - z->c; (void) m; /* or, line 206 */
+                {   int ret = r_perfective_gerund(z);
+                    if (ret == 0) goto lab3; /* call perfective_gerund, line 206 */
+                    if (ret < 0) return ret;
+                }
+                goto lab2;
+            lab3:
+                z->c = z->l - m;
+                {   int m = z->l - z->c; (void) m; /* try, line 207 */
+                    {   int ret = r_reflexive(z);
+                        if (ret == 0) { z->c = z->l - m; goto lab4; } /* call reflexive, line 207 */
+                        if (ret < 0) return ret;
+                    }
+                lab4:
+                    ;
+                }
+                {   int m = z->l - z->c; (void) m; /* or, line 208 */
+                    {   int ret = r_adjectival(z);
+                        if (ret == 0) goto lab6; /* call adjectival, line 208 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab6:
+                    z->c = z->l - m;
+                    {   int ret = r_verb(z);
+                        if (ret == 0) goto lab7; /* call verb, line 208 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab7:
+                    z->c = z->l - m;
+                    {   int ret = r_noun(z);
+                        if (ret == 0) goto lab1; /* call noun, line 208 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab5:
+                ;
+            }
+        lab2:
+        lab1:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* try, line 211 */
+            z->ket = z->c; /* [, line 211 */
+            if (!(eq_s_b(z, 1, s_9))) { z->c = z->l - m; goto lab8; }
+            z->bra = z->c; /* ], line 211 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 211 */
+                if (ret < 0) return ret;
+            }
+        lab8:
+            ;
+        }
+        {   int m = z->l - z->c; (void) m; /* do, line 214 */
+            {   int ret = r_derivational(z);
+                if (ret == 0) goto lab9; /* call derivational, line 214 */
+                if (ret < 0) return ret;
+            }
+        lab9:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* do, line 215 */
+            {   int ret = r_tidy_up(z);
+                if (ret == 0) goto lab10; /* call tidy_up, line 215 */
+                if (ret < 0) return ret;
+            }
+        lab10:
+            z->c = z->l - m;
+        }
+        z->lb = m3;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * russian_KOI8_R_create_env(void) { return SN_create_env(0, 2, 0); }
+
+extern void russian_KOI8_R_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_KOI8_R_russian.h b/libstemmer_c/src_c/stem_KOI8_R_russian.h
new file mode 100644
index 0000000..de2179d
--- /dev/null
+++ b/libstemmer_c/src_c/stem_KOI8_R_russian.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * russian_KOI8_R_create_env(void);
+extern void russian_KOI8_R_close_env(struct SN_env * z);
+
+extern int russian_KOI8_R_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_danish.c b/libstemmer_c/src_c/stem_UTF_8_danish.c
new file mode 100644
index 0000000..bb98298
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_danish.c
@@ -0,0 +1,344 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int danish_UTF_8_stem(struct SN_env * z);
+static int r_undouble(struct SN_env * z);
+static int r_other_suffix(struct SN_env * z);
+static int r_consonant_pair(struct SN_env * z);
+static int r_main_suffix(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+
+extern struct SN_env * danish_UTF_8_create_env(void);
+extern void danish_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_0[3] = { 'h', 'e', 'd' };
+static symbol s_0_1[5] = { 'e', 't', 'h', 'e', 'd' };
+static symbol s_0_2[4] = { 'e', 'r', 'e', 'd' };
+static symbol s_0_3[1] = { 'e' };
+static symbol s_0_4[5] = { 'e', 'r', 'e', 'd', 'e' };
+static symbol s_0_5[4] = { 'e', 'n', 'd', 'e' };
+static symbol s_0_6[6] = { 'e', 'r', 'e', 'n', 'd', 'e' };
+static symbol s_0_7[3] = { 'e', 'n', 'e' };
+static symbol s_0_8[4] = { 'e', 'r', 'n', 'e' };
+static symbol s_0_9[3] = { 'e', 'r', 'e' };
+static symbol s_0_10[2] = { 'e', 'n' };
+static symbol s_0_11[5] = { 'h', 'e', 'd', 'e', 'n' };
+static symbol s_0_12[4] = { 'e', 'r', 'e', 'n' };
+static symbol s_0_13[2] = { 'e', 'r' };
+static symbol s_0_14[5] = { 'h', 'e', 'd', 'e', 'r' };
+static symbol s_0_15[4] = { 'e', 'r', 'e', 'r' };
+static symbol s_0_16[1] = { 's' };
+static symbol s_0_17[4] = { 'h', 'e', 'd', 's' };
+static symbol s_0_18[2] = { 'e', 's' };
+static symbol s_0_19[5] = { 'e', 'n', 'd', 'e', 's' };
+static symbol s_0_20[7] = { 'e', 'r', 'e', 'n', 'd', 'e', 's' };
+static symbol s_0_21[4] = { 'e', 'n', 'e', 's' };
+static symbol s_0_22[5] = { 'e', 'r', 'n', 'e', 's' };
+static symbol s_0_23[4] = { 'e', 'r', 'e', 's' };
+static symbol s_0_24[3] = { 'e', 'n', 's' };
+static symbol s_0_25[6] = { 'h', 'e', 'd', 'e', 'n', 's' };
+static symbol s_0_26[5] = { 'e', 'r', 'e', 'n', 's' };
+static symbol s_0_27[3] = { 'e', 'r', 's' };
+static symbol s_0_28[3] = { 'e', 't', 's' };
+static symbol s_0_29[5] = { 'e', 'r', 'e', 't', 's' };
+static symbol s_0_30[2] = { 'e', 't' };
+static symbol s_0_31[4] = { 'e', 'r', 'e', 't' };
+
+static struct among a_0[32] =
+{
+/*  0 */ { 3, s_0_0, -1, 1, 0},
+/*  1 */ { 5, s_0_1, 0, 1, 0},
+/*  2 */ { 4, s_0_2, -1, 1, 0},
+/*  3 */ { 1, s_0_3, -1, 1, 0},
+/*  4 */ { 5, s_0_4, 3, 1, 0},
+/*  5 */ { 4, s_0_5, 3, 1, 0},
+/*  6 */ { 6, s_0_6, 5, 1, 0},
+/*  7 */ { 3, s_0_7, 3, 1, 0},
+/*  8 */ { 4, s_0_8, 3, 1, 0},
+/*  9 */ { 3, s_0_9, 3, 1, 0},
+/* 10 */ { 2, s_0_10, -1, 1, 0},
+/* 11 */ { 5, s_0_11, 10, 1, 0},
+/* 12 */ { 4, s_0_12, 10, 1, 0},
+/* 13 */ { 2, s_0_13, -1, 1, 0},
+/* 14 */ { 5, s_0_14, 13, 1, 0},
+/* 15 */ { 4, s_0_15, 13, 1, 0},
+/* 16 */ { 1, s_0_16, -1, 2, 0},
+/* 17 */ { 4, s_0_17, 16, 1, 0},
+/* 18 */ { 2, s_0_18, 16, 1, 0},
+/* 19 */ { 5, s_0_19, 18, 1, 0},
+/* 20 */ { 7, s_0_20, 19, 1, 0},
+/* 21 */ { 4, s_0_21, 18, 1, 0},
+/* 22 */ { 5, s_0_22, 18, 1, 0},
+/* 23 */ { 4, s_0_23, 18, 1, 0},
+/* 24 */ { 3, s_0_24, 16, 1, 0},
+/* 25 */ { 6, s_0_25, 24, 1, 0},
+/* 26 */ { 5, s_0_26, 24, 1, 0},
+/* 27 */ { 3, s_0_27, 16, 1, 0},
+/* 28 */ { 3, s_0_28, 16, 1, 0},
+/* 29 */ { 5, s_0_29, 28, 1, 0},
+/* 30 */ { 2, s_0_30, -1, 1, 0},
+/* 31 */ { 4, s_0_31, 30, 1, 0}
+};
+
+static symbol s_1_0[2] = { 'g', 'd' };
+static symbol s_1_1[2] = { 'd', 't' };
+static symbol s_1_2[2] = { 'g', 't' };
+static symbol s_1_3[2] = { 'k', 't' };
+
+static struct among a_1[4] =
+{
+/*  0 */ { 2, s_1_0, -1, -1, 0},
+/*  1 */ { 2, s_1_1, -1, -1, 0},
+/*  2 */ { 2, s_1_2, -1, -1, 0},
+/*  3 */ { 2, s_1_3, -1, -1, 0}
+};
+
+static symbol s_2_0[2] = { 'i', 'g' };
+static symbol s_2_1[3] = { 'l', 'i', 'g' };
+static symbol s_2_2[4] = { 'e', 'l', 'i', 'g' };
+static symbol s_2_3[3] = { 'e', 'l', 's' };
+static symbol s_2_4[5] = { 'l', 0xC3, 0xB8, 's', 't' };
+
+static struct among a_2[5] =
+{
+/*  0 */ { 2, s_2_0, -1, 1, 0},
+/*  1 */ { 3, s_2_1, 0, 1, 0},
+/*  2 */ { 4, s_2_2, 1, 1, 0},
+/*  3 */ { 3, s_2_3, -1, 1, 0},
+/*  4 */ { 5, s_2_4, -1, 2, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128 };
+
+static unsigned char g_s_ending[] = { 239, 254, 42, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 };
+
+static symbol s_0[] = { 's', 't' };
+static symbol s_1[] = { 'i', 'g' };
+static symbol s_2[] = { 'l', 0xC3, 0xB8, 's' };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    {   int c_test = z->c; /* test, line 33 */
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, + 3);
+            if (c < 0) return 0;
+            z->c = c; /* hop, line 33 */
+        }
+        z->I[1] = z->c; /* setmark x, line 33 */
+        z->c = c_test;
+    }
+    while(1) { /* goto, line 34 */
+        int c = z->c;
+        if (!(in_grouping_U(z, g_v, 97, 248))) goto lab0;
+        z->c = c;
+        break;
+    lab0:
+        z->c = c;
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* goto, line 34 */
+        }
+    }
+    while(1) { /* gopast, line 34 */
+        if (!(out_grouping_U(z, g_v, 97, 248))) goto lab1;
+        break;
+    lab1:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 34 */
+        }
+    }
+    z->I[0] = z->c; /* setmark p1, line 34 */
+     /* try, line 35 */
+    if (!(z->I[0] < z->I[1])) goto lab2;
+    z->I[0] = z->I[1];
+lab2:
+    return 1;
+}
+
+static int r_main_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 41 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 41 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 41 */
+        among_var = find_among_b(z, a_0, 32); /* substring, line 41 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 41 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 48 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            if (!(in_grouping_b_U(z, g_s_ending, 97, 229))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 50 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_consonant_pair(struct SN_env * z) {
+    {   int m_test = z->l - z->c; /* test, line 55 */
+        {   int m3; /* setlimit, line 56 */
+            int m = z->l - z->c; (void) m;
+            if (z->c < z->I[0]) return 0;
+            z->c = z->I[0]; /* tomark, line 56 */
+            m3 = z->lb; z->lb = z->c;
+            z->c = z->l - m;
+            z->ket = z->c; /* [, line 56 */
+            if (!(find_among_b(z, a_1, 4))) { z->lb = m3; return 0; } /* substring, line 56 */
+            z->bra = z->c; /* ], line 56 */
+            z->lb = m3;
+        }
+        z->c = z->l - m_test;
+    }
+    {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+        if (c < 0) return 0;
+        z->c = c; /* next, line 62 */
+    }
+    z->bra = z->c; /* ], line 62 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 62 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_other_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m = z->l - z->c; (void) m; /* do, line 66 */
+        z->ket = z->c; /* [, line 66 */
+        if (!(eq_s_b(z, 2, s_0))) goto lab0;
+        z->bra = z->c; /* ], line 66 */
+        if (!(eq_s_b(z, 2, s_1))) goto lab0;
+        {   int ret;
+            ret = slice_del(z); /* delete, line 66 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = z->l - m;
+    }
+    {   int m3; /* setlimit, line 67 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 67 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 67 */
+        among_var = find_among_b(z, a_2, 5); /* substring, line 67 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 67 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 70 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 70 */
+                {   int ret = r_consonant_pair(z);
+                    if (ret == 0) goto lab1; /* call consonant_pair, line 70 */
+                    if (ret < 0) return ret;
+                }
+            lab1:
+                z->c = z->l - m;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_2); /* <-, line 72 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_undouble(struct SN_env * z) {
+    {   int m3; /* setlimit, line 76 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 76 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 76 */
+        if (!(out_grouping_b_U(z, g_v, 97, 248))) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 76 */
+        z->S[0] = slice_to(z, z->S[0]); /* -> ch, line 76 */
+        if (z->S[0] == 0) return -1; /* -> ch, line 76 */
+        z->lb = m3;
+    }
+    if (!(eq_v_b(z, z->S[0]))) return 0; /* name ch, line 77 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 78 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+extern int danish_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 84 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 84 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 85 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 86 */
+        {   int ret = r_main_suffix(z);
+            if (ret == 0) goto lab1; /* call main_suffix, line 86 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 87 */
+        {   int ret = r_consonant_pair(z);
+            if (ret == 0) goto lab2; /* call consonant_pair, line 87 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 88 */
+        {   int ret = r_other_suffix(z);
+            if (ret == 0) goto lab3; /* call other_suffix, line 88 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 89 */
+        {   int ret = r_undouble(z);
+            if (ret == 0) goto lab4; /* call undouble, line 89 */
+            if (ret < 0) return ret;
+        }
+    lab4:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * danish_UTF_8_create_env(void) { return SN_create_env(1, 2, 0); }
+
+extern void danish_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_danish.h b/libstemmer_c/src_c/stem_UTF_8_danish.h
new file mode 100644
index 0000000..ed744d4
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_danish.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * danish_UTF_8_create_env(void);
+extern void danish_UTF_8_close_env(struct SN_env * z);
+
+extern int danish_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_dutch.c b/libstemmer_c/src_c/stem_UTF_8_dutch.c
new file mode 100644
index 0000000..3de469b
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_dutch.c
@@ -0,0 +1,653 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int dutch_UTF_8_stem(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_undouble(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_en_ending(struct SN_env * z);
+static int r_e_ending(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * dutch_UTF_8_create_env(void);
+extern void dutch_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_1[2] = { 0xC3, 0xA1 };
+static symbol s_0_2[2] = { 0xC3, 0xA4 };
+static symbol s_0_3[2] = { 0xC3, 0xA9 };
+static symbol s_0_4[2] = { 0xC3, 0xAB };
+static symbol s_0_5[2] = { 0xC3, 0xAD };
+static symbol s_0_6[2] = { 0xC3, 0xAF };
+static symbol s_0_7[2] = { 0xC3, 0xB3 };
+static symbol s_0_8[2] = { 0xC3, 0xB6 };
+static symbol s_0_9[2] = { 0xC3, 0xBA };
+static symbol s_0_10[2] = { 0xC3, 0xBC };
+
+static struct among a_0[11] =
+{
+/*  0 */ { 0, 0, -1, 6, 0},
+/*  1 */ { 2, s_0_1, 0, 1, 0},
+/*  2 */ { 2, s_0_2, 0, 1, 0},
+/*  3 */ { 2, s_0_3, 0, 2, 0},
+/*  4 */ { 2, s_0_4, 0, 2, 0},
+/*  5 */ { 2, s_0_5, 0, 3, 0},
+/*  6 */ { 2, s_0_6, 0, 3, 0},
+/*  7 */ { 2, s_0_7, 0, 4, 0},
+/*  8 */ { 2, s_0_8, 0, 4, 0},
+/*  9 */ { 2, s_0_9, 0, 5, 0},
+/* 10 */ { 2, s_0_10, 0, 5, 0}
+};
+
+static symbol s_1_1[1] = { 'I' };
+static symbol s_1_2[1] = { 'Y' };
+
+static struct among a_1[3] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 1, s_1_1, 0, 2, 0},
+/*  2 */ { 1, s_1_2, 0, 1, 0}
+};
+
+static symbol s_2_0[2] = { 'd', 'd' };
+static symbol s_2_1[2] = { 'k', 'k' };
+static symbol s_2_2[2] = { 't', 't' };
+
+static struct among a_2[3] =
+{
+/*  0 */ { 2, s_2_0, -1, -1, 0},
+/*  1 */ { 2, s_2_1, -1, -1, 0},
+/*  2 */ { 2, s_2_2, -1, -1, 0}
+};
+
+static symbol s_3_0[3] = { 'e', 'n', 'e' };
+static symbol s_3_1[2] = { 's', 'e' };
+static symbol s_3_2[2] = { 'e', 'n' };
+static symbol s_3_3[5] = { 'h', 'e', 'd', 'e', 'n' };
+static symbol s_3_4[1] = { 's' };
+
+static struct among a_3[5] =
+{
+/*  0 */ { 3, s_3_0, -1, 2, 0},
+/*  1 */ { 2, s_3_1, -1, 3, 0},
+/*  2 */ { 2, s_3_2, -1, 2, 0},
+/*  3 */ { 5, s_3_3, 2, 1, 0},
+/*  4 */ { 1, s_3_4, -1, 3, 0}
+};
+
+static symbol s_4_0[3] = { 'e', 'n', 'd' };
+static symbol s_4_1[2] = { 'i', 'g' };
+static symbol s_4_2[3] = { 'i', 'n', 'g' };
+static symbol s_4_3[4] = { 'l', 'i', 'j', 'k' };
+static symbol s_4_4[4] = { 'b', 'a', 'a', 'r' };
+static symbol s_4_5[3] = { 'b', 'a', 'r' };
+
+static struct among a_4[6] =
+{
+/*  0 */ { 3, s_4_0, -1, 1, 0},
+/*  1 */ { 2, s_4_1, -1, 2, 0},
+/*  2 */ { 3, s_4_2, -1, 1, 0},
+/*  3 */ { 4, s_4_3, -1, 3, 0},
+/*  4 */ { 4, s_4_4, -1, 4, 0},
+/*  5 */ { 3, s_4_5, -1, 5, 0}
+};
+
+static symbol s_5_0[2] = { 'a', 'a' };
+static symbol s_5_1[2] = { 'e', 'e' };
+static symbol s_5_2[2] = { 'o', 'o' };
+static symbol s_5_3[2] = { 'u', 'u' };
+
+static struct among a_5[4] =
+{
+/*  0 */ { 2, s_5_0, -1, -1, 0},
+/*  1 */ { 2, s_5_1, -1, -1, 0},
+/*  2 */ { 2, s_5_2, -1, -1, 0},
+/*  3 */ { 2, s_5_3, -1, -1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
+
+static unsigned char g_v_I[] = { 1, 0, 0, 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
+
+static unsigned char g_v_j[] = { 17, 67, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
+
+static symbol s_0[] = { 'a' };
+static symbol s_1[] = { 'e' };
+static symbol s_2[] = { 'i' };
+static symbol s_3[] = { 'o' };
+static symbol s_4[] = { 'u' };
+static symbol s_5[] = { 'y' };
+static symbol s_6[] = { 'Y' };
+static symbol s_7[] = { 'i' };
+static symbol s_8[] = { 'I' };
+static symbol s_9[] = { 'y' };
+static symbol s_10[] = { 'Y' };
+static symbol s_11[] = { 'y' };
+static symbol s_12[] = { 'i' };
+static symbol s_13[] = { 'e' };
+static symbol s_14[] = { 'g', 'e', 'm' };
+static symbol s_15[] = { 'h', 'e', 'i', 'd' };
+static symbol s_16[] = { 'h', 'e', 'i', 'd' };
+static symbol s_17[] = { 'c' };
+static symbol s_18[] = { 'e', 'n' };
+static symbol s_19[] = { 'i', 'g' };
+static symbol s_20[] = { 'e' };
+static symbol s_21[] = { 'e' };
+
+static int r_prelude(struct SN_env * z) {
+    int among_var;
+    {   int c_test = z->c; /* test, line 42 */
+        while(1) { /* repeat, line 42 */
+            int c = z->c;
+            z->bra = z->c; /* [, line 43 */
+            among_var = find_among(z, a_0, 11); /* substring, line 43 */
+            if (!(among_var)) goto lab0;
+            z->ket = z->c; /* ], line 43 */
+            switch(among_var) {
+                case 0: goto lab0;
+                case 1:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_0); /* <-, line 45 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 2:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_1); /* <-, line 47 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 3:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_2); /* <-, line 49 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 4:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_3); /* <-, line 51 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 5:
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_4); /* <-, line 53 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 6:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab0;
+                        z->c = c; /* next, line 54 */
+                    }
+                    break;
+            }
+            continue;
+        lab0:
+            z->c = c;
+            break;
+        }
+        z->c = c_test;
+    }
+    {   int c = z->c; /* try, line 57 */
+        z->bra = z->c; /* [, line 57 */
+        if (!(eq_s(z, 1, s_5))) { z->c = c; goto lab1; }
+        z->ket = z->c; /* ], line 57 */
+        {   int ret;
+            ret = slice_from_s(z, 1, s_6); /* <-, line 57 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        ;
+    }
+    while(1) { /* repeat, line 58 */
+        int c = z->c;
+        while(1) { /* goto, line 58 */
+            int c = z->c;
+            if (!(in_grouping_U(z, g_v, 97, 232))) goto lab3;
+            z->bra = z->c; /* [, line 59 */
+            {   int c = z->c; /* or, line 59 */
+                if (!(eq_s(z, 1, s_7))) goto lab5;
+                z->ket = z->c; /* ], line 59 */
+                if (!(in_grouping_U(z, g_v, 97, 232))) goto lab5;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_8); /* <-, line 59 */
+                    if (ret < 0) return ret;
+                }
+                goto lab4;
+            lab5:
+                z->c = c;
+                if (!(eq_s(z, 1, s_9))) goto lab3;
+                z->ket = z->c; /* ], line 60 */
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_10); /* <-, line 60 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab4:
+            z->c = c;
+            break;
+        lab3:
+            z->c = c;
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab2;
+                z->c = c; /* goto, line 58 */
+            }
+        }
+        continue;
+    lab2:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    while(1) { /* gopast, line 69 */
+        if (!(in_grouping_U(z, g_v, 97, 232))) goto lab0;
+        break;
+    lab0:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 69 */
+        }
+    }
+    while(1) { /* gopast, line 69 */
+        if (!(out_grouping_U(z, g_v, 97, 232))) goto lab1;
+        break;
+    lab1:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 69 */
+        }
+    }
+    z->I[0] = z->c; /* setmark p1, line 69 */
+     /* try, line 70 */
+    if (!(z->I[0] < 3)) goto lab2;
+    z->I[0] = 3;
+lab2:
+    while(1) { /* gopast, line 71 */
+        if (!(in_grouping_U(z, g_v, 97, 232))) goto lab3;
+        break;
+    lab3:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 71 */
+        }
+    }
+    while(1) { /* gopast, line 71 */
+        if (!(out_grouping_U(z, g_v, 97, 232))) goto lab4;
+        break;
+    lab4:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 71 */
+        }
+    }
+    z->I[1] = z->c; /* setmark p2, line 71 */
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 75 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 77 */
+        among_var = find_among(z, a_1, 3); /* substring, line 77 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 77 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_11); /* <-, line 78 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_12); /* <-, line 79 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 80 */
+                }
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_undouble(struct SN_env * z) {
+    {   int m_test = z->l - z->c; /* test, line 91 */
+        if (!(find_among_b(z, a_2, 3))) return 0; /* among, line 91 */
+        z->c = z->l - m_test;
+    }
+    z->ket = z->c; /* [, line 91 */
+    {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+        if (c < 0) return 0;
+        z->c = c; /* next, line 91 */
+    }
+    z->bra = z->c; /* ], line 91 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 91 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_e_ending(struct SN_env * z) {
+    z->B[0] = 0; /* unset e_found, line 95 */
+    z->ket = z->c; /* [, line 96 */
+    if (!(eq_s_b(z, 1, s_13))) return 0;
+    z->bra = z->c; /* ], line 96 */
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 96 */
+        if (ret < 0) return ret;
+    }
+    {   int m_test = z->l - z->c; /* test, line 96 */
+        if (!(out_grouping_b_U(z, g_v, 97, 232))) return 0;
+        z->c = z->l - m_test;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 96 */
+        if (ret < 0) return ret;
+    }
+    z->B[0] = 1; /* set e_found, line 97 */
+    {   int ret = r_undouble(z);
+        if (ret == 0) return 0; /* call undouble, line 98 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_en_ending(struct SN_env * z) {
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 102 */
+        if (ret < 0) return ret;
+    }
+    {   int m = z->l - z->c; (void) m; /* and, line 102 */
+        if (!(out_grouping_b_U(z, g_v, 97, 232))) return 0;
+        z->c = z->l - m;
+        {   int m = z->l - z->c; (void) m; /* not, line 102 */
+            if (!(eq_s_b(z, 3, s_14))) goto lab0;
+            return 0;
+        lab0:
+            z->c = z->l - m;
+        }
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 102 */
+        if (ret < 0) return ret;
+    }
+    {   int ret = r_undouble(z);
+        if (ret == 0) return 0; /* call undouble, line 103 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m = z->l - z->c; (void) m; /* do, line 107 */
+        z->ket = z->c; /* [, line 108 */
+        among_var = find_among_b(z, a_3, 5); /* substring, line 108 */
+        if (!(among_var)) goto lab0;
+        z->bra = z->c; /* ], line 108 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret = r_R1(z);
+                    if (ret == 0) goto lab0; /* call R1, line 110 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_from_s(z, 4, s_15); /* <-, line 110 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret = r_en_ending(z);
+                    if (ret == 0) goto lab0; /* call en_ending, line 113 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret = r_R1(z);
+                    if (ret == 0) goto lab0; /* call R1, line 116 */
+                    if (ret < 0) return ret;
+                }
+                if (!(out_grouping_b_U(z, g_v_j, 97, 232))) goto lab0;
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 116 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab0:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 120 */
+        {   int ret = r_e_ending(z);
+            if (ret == 0) goto lab1; /* call e_ending, line 120 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 122 */
+        z->ket = z->c; /* [, line 122 */
+        if (!(eq_s_b(z, 4, s_16))) goto lab2;
+        z->bra = z->c; /* ], line 122 */
+        {   int ret = r_R2(z);
+            if (ret == 0) goto lab2; /* call R2, line 122 */
+            if (ret < 0) return ret;
+        }
+        {   int m = z->l - z->c; (void) m; /* not, line 122 */
+            if (!(eq_s_b(z, 1, s_17))) goto lab3;
+            goto lab2;
+        lab3:
+            z->c = z->l - m;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 122 */
+            if (ret < 0) return ret;
+        }
+        z->ket = z->c; /* [, line 123 */
+        if (!(eq_s_b(z, 2, s_18))) goto lab2;
+        z->bra = z->c; /* ], line 123 */
+        {   int ret = r_en_ending(z);
+            if (ret == 0) goto lab2; /* call en_ending, line 123 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 126 */
+        z->ket = z->c; /* [, line 127 */
+        among_var = find_among_b(z, a_4, 6); /* substring, line 127 */
+        if (!(among_var)) goto lab4;
+        z->bra = z->c; /* ], line 127 */
+        switch(among_var) {
+            case 0: goto lab4;
+            case 1:
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab4; /* call R2, line 129 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 129 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* or, line 130 */
+                    z->ket = z->c; /* [, line 130 */
+                    if (!(eq_s_b(z, 2, s_19))) goto lab6;
+                    z->bra = z->c; /* ], line 130 */
+                    {   int ret = r_R2(z);
+                        if (ret == 0) goto lab6; /* call R2, line 130 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int m = z->l - z->c; (void) m; /* not, line 130 */
+                        if (!(eq_s_b(z, 1, s_20))) goto lab7;
+                        goto lab6;
+                    lab7:
+                        z->c = z->l - m;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 130 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab6:
+                    z->c = z->l - m;
+                    {   int ret = r_undouble(z);
+                        if (ret == 0) goto lab4; /* call undouble, line 130 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab5:
+                break;
+            case 2:
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab4; /* call R2, line 133 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* not, line 133 */
+                    if (!(eq_s_b(z, 1, s_21))) goto lab8;
+                    goto lab4;
+                lab8:
+                    z->c = z->l - m;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 133 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab4; /* call R2, line 136 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 136 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret = r_e_ending(z);
+                    if (ret == 0) goto lab4; /* call e_ending, line 136 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 4:
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab4; /* call R2, line 139 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 139 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 5:
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab4; /* call R2, line 142 */
+                    if (ret < 0) return ret;
+                }
+                if (!(z->B[0])) goto lab4; /* Boolean test e_found, line 142 */
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 142 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab4:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 146 */
+        if (!(out_grouping_b_U(z, g_v_I, 73, 232))) goto lab9;
+        {   int m_test = z->l - z->c; /* test, line 148 */
+            if (!(find_among_b(z, a_5, 4))) goto lab9; /* among, line 149 */
+            if (!(out_grouping_b_U(z, g_v, 97, 232))) goto lab9;
+            z->c = z->l - m_test;
+        }
+        z->ket = z->c; /* [, line 152 */
+        {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+            if (c < 0) goto lab9;
+            z->c = c; /* next, line 152 */
+        }
+        z->bra = z->c; /* ], line 152 */
+        {   int ret;
+            ret = slice_del(z); /* delete, line 152 */
+            if (ret < 0) return ret;
+        }
+    lab9:
+        z->c = z->l - m;
+    }
+    return 1;
+}
+
+extern int dutch_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 159 */
+        {   int ret = r_prelude(z);
+            if (ret == 0) goto lab0; /* call prelude, line 159 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 160 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab1; /* call mark_regions, line 160 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 161 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 162 */
+        {   int ret = r_standard_suffix(z);
+            if (ret == 0) goto lab2; /* call standard_suffix, line 162 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 163 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab3; /* call postlude, line 163 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * dutch_UTF_8_create_env(void) { return SN_create_env(0, 2, 1); }
+
+extern void dutch_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_dutch.h b/libstemmer_c/src_c/stem_UTF_8_dutch.h
new file mode 100644
index 0000000..a996464
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_dutch.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * dutch_UTF_8_create_env(void);
+extern void dutch_UTF_8_close_env(struct SN_env * z);
+
+extern int dutch_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_english.c b/libstemmer_c/src_c/stem_UTF_8_english.c
new file mode 100644
index 0000000..1452eea
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_english.c
@@ -0,0 +1,1176 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int english_UTF_8_stem(struct SN_env * z);
+static int r_exception2(struct SN_env * z);
+static int r_exception1(struct SN_env * z);
+static int r_Step_5(struct SN_env * z);
+static int r_Step_4(struct SN_env * z);
+static int r_Step_3(struct SN_env * z);
+static int r_Step_2(struct SN_env * z);
+static int r_Step_1c(struct SN_env * z);
+static int r_Step_1b(struct SN_env * z);
+static int r_Step_1a(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_shortv(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * english_UTF_8_create_env(void);
+extern void english_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_0[6] = { 'c', 'o', 'm', 'm', 'u', 'n' };
+static symbol s_0_1[5] = { 'g', 'e', 'n', 'e', 'r' };
+
+static struct among a_0[2] =
+{
+/*  0 */ { 6, s_0_0, -1, -1, 0},
+/*  1 */ { 5, s_0_1, -1, -1, 0}
+};
+
+static symbol s_1_0[1] = { '\'' };
+static symbol s_1_1[3] = { '\'', 's', '\'' };
+static symbol s_1_2[2] = { '\'', 's' };
+
+static struct among a_1[3] =
+{
+/*  0 */ { 1, s_1_0, -1, 1, 0},
+/*  1 */ { 3, s_1_1, 0, 1, 0},
+/*  2 */ { 2, s_1_2, -1, 1, 0}
+};
+
+static symbol s_2_0[3] = { 'i', 'e', 'd' };
+static symbol s_2_1[1] = { 's' };
+static symbol s_2_2[3] = { 'i', 'e', 's' };
+static symbol s_2_3[4] = { 's', 's', 'e', 's' };
+static symbol s_2_4[2] = { 's', 's' };
+static symbol s_2_5[2] = { 'u', 's' };
+
+static struct among a_2[6] =
+{
+/*  0 */ { 3, s_2_0, -1, 2, 0},
+/*  1 */ { 1, s_2_1, -1, 3, 0},
+/*  2 */ { 3, s_2_2, 1, 2, 0},
+/*  3 */ { 4, s_2_3, 1, 1, 0},
+/*  4 */ { 2, s_2_4, 1, -1, 0},
+/*  5 */ { 2, s_2_5, 1, -1, 0}
+};
+
+static symbol s_3_1[2] = { 'b', 'b' };
+static symbol s_3_2[2] = { 'd', 'd' };
+static symbol s_3_3[2] = { 'f', 'f' };
+static symbol s_3_4[2] = { 'g', 'g' };
+static symbol s_3_5[2] = { 'b', 'l' };
+static symbol s_3_6[2] = { 'm', 'm' };
+static symbol s_3_7[2] = { 'n', 'n' };
+static symbol s_3_8[2] = { 'p', 'p' };
+static symbol s_3_9[2] = { 'r', 'r' };
+static symbol s_3_10[2] = { 'a', 't' };
+static symbol s_3_11[2] = { 't', 't' };
+static symbol s_3_12[2] = { 'i', 'z' };
+
+static struct among a_3[13] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 2, s_3_1, 0, 2, 0},
+/*  2 */ { 2, s_3_2, 0, 2, 0},
+/*  3 */ { 2, s_3_3, 0, 2, 0},
+/*  4 */ { 2, s_3_4, 0, 2, 0},
+/*  5 */ { 2, s_3_5, 0, 1, 0},
+/*  6 */ { 2, s_3_6, 0, 2, 0},
+/*  7 */ { 2, s_3_7, 0, 2, 0},
+/*  8 */ { 2, s_3_8, 0, 2, 0},
+/*  9 */ { 2, s_3_9, 0, 2, 0},
+/* 10 */ { 2, s_3_10, 0, 1, 0},
+/* 11 */ { 2, s_3_11, 0, 2, 0},
+/* 12 */ { 2, s_3_12, 0, 1, 0}
+};
+
+static symbol s_4_0[2] = { 'e', 'd' };
+static symbol s_4_1[3] = { 'e', 'e', 'd' };
+static symbol s_4_2[3] = { 'i', 'n', 'g' };
+static symbol s_4_3[4] = { 'e', 'd', 'l', 'y' };
+static symbol s_4_4[5] = { 'e', 'e', 'd', 'l', 'y' };
+static symbol s_4_5[5] = { 'i', 'n', 'g', 'l', 'y' };
+
+static struct among a_4[6] =
+{
+/*  0 */ { 2, s_4_0, -1, 2, 0},
+/*  1 */ { 3, s_4_1, 0, 1, 0},
+/*  2 */ { 3, s_4_2, -1, 2, 0},
+/*  3 */ { 4, s_4_3, -1, 2, 0},
+/*  4 */ { 5, s_4_4, 3, 1, 0},
+/*  5 */ { 5, s_4_5, -1, 2, 0}
+};
+
+static symbol s_5_0[4] = { 'a', 'n', 'c', 'i' };
+static symbol s_5_1[4] = { 'e', 'n', 'c', 'i' };
+static symbol s_5_2[3] = { 'o', 'g', 'i' };
+static symbol s_5_3[2] = { 'l', 'i' };
+static symbol s_5_4[3] = { 'b', 'l', 'i' };
+static symbol s_5_5[4] = { 'a', 'b', 'l', 'i' };
+static symbol s_5_6[4] = { 'a', 'l', 'l', 'i' };
+static symbol s_5_7[5] = { 'f', 'u', 'l', 'l', 'i' };
+static symbol s_5_8[6] = { 'l', 'e', 's', 's', 'l', 'i' };
+static symbol s_5_9[5] = { 'o', 'u', 's', 'l', 'i' };
+static symbol s_5_10[5] = { 'e', 'n', 't', 'l', 'i' };
+static symbol s_5_11[5] = { 'a', 'l', 'i', 't', 'i' };
+static symbol s_5_12[6] = { 'b', 'i', 'l', 'i', 't', 'i' };
+static symbol s_5_13[5] = { 'i', 'v', 'i', 't', 'i' };
+static symbol s_5_14[6] = { 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_5_15[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_5_16[5] = { 'a', 'l', 'i', 's', 'm' };
+static symbol s_5_17[5] = { 'a', 't', 'i', 'o', 'n' };
+static symbol s_5_18[7] = { 'i', 'z', 'a', 't', 'i', 'o', 'n' };
+static symbol s_5_19[4] = { 'i', 'z', 'e', 'r' };
+static symbol s_5_20[4] = { 'a', 't', 'o', 'r' };
+static symbol s_5_21[7] = { 'i', 'v', 'e', 'n', 'e', 's', 's' };
+static symbol s_5_22[7] = { 'f', 'u', 'l', 'n', 'e', 's', 's' };
+static symbol s_5_23[7] = { 'o', 'u', 's', 'n', 'e', 's', 's' };
+
+static struct among a_5[24] =
+{
+/*  0 */ { 4, s_5_0, -1, 3, 0},
+/*  1 */ { 4, s_5_1, -1, 2, 0},
+/*  2 */ { 3, s_5_2, -1, 13, 0},
+/*  3 */ { 2, s_5_3, -1, 16, 0},
+/*  4 */ { 3, s_5_4, 3, 12, 0},
+/*  5 */ { 4, s_5_5, 4, 4, 0},
+/*  6 */ { 4, s_5_6, 3, 8, 0},
+/*  7 */ { 5, s_5_7, 3, 14, 0},
+/*  8 */ { 6, s_5_8, 3, 15, 0},
+/*  9 */ { 5, s_5_9, 3, 10, 0},
+/* 10 */ { 5, s_5_10, 3, 5, 0},
+/* 11 */ { 5, s_5_11, -1, 8, 0},
+/* 12 */ { 6, s_5_12, -1, 12, 0},
+/* 13 */ { 5, s_5_13, -1, 11, 0},
+/* 14 */ { 6, s_5_14, -1, 1, 0},
+/* 15 */ { 7, s_5_15, 14, 7, 0},
+/* 16 */ { 5, s_5_16, -1, 8, 0},
+/* 17 */ { 5, s_5_17, -1, 7, 0},
+/* 18 */ { 7, s_5_18, 17, 6, 0},
+/* 19 */ { 4, s_5_19, -1, 6, 0},
+/* 20 */ { 4, s_5_20, -1, 7, 0},
+/* 21 */ { 7, s_5_21, -1, 11, 0},
+/* 22 */ { 7, s_5_22, -1, 9, 0},
+/* 23 */ { 7, s_5_23, -1, 10, 0}
+};
+
+static symbol s_6_0[5] = { 'i', 'c', 'a', 't', 'e' };
+static symbol s_6_1[5] = { 'a', 't', 'i', 'v', 'e' };
+static symbol s_6_2[5] = { 'a', 'l', 'i', 'z', 'e' };
+static symbol s_6_3[5] = { 'i', 'c', 'i', 't', 'i' };
+static symbol s_6_4[4] = { 'i', 'c', 'a', 'l' };
+static symbol s_6_5[6] = { 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_6_6[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_6_7[3] = { 'f', 'u', 'l' };
+static symbol s_6_8[4] = { 'n', 'e', 's', 's' };
+
+static struct among a_6[9] =
+{
+/*  0 */ { 5, s_6_0, -1, 4, 0},
+/*  1 */ { 5, s_6_1, -1, 6, 0},
+/*  2 */ { 5, s_6_2, -1, 3, 0},
+/*  3 */ { 5, s_6_3, -1, 4, 0},
+/*  4 */ { 4, s_6_4, -1, 4, 0},
+/*  5 */ { 6, s_6_5, -1, 1, 0},
+/*  6 */ { 7, s_6_6, 5, 2, 0},
+/*  7 */ { 3, s_6_7, -1, 5, 0},
+/*  8 */ { 4, s_6_8, -1, 5, 0}
+};
+
+static symbol s_7_0[2] = { 'i', 'c' };
+static symbol s_7_1[4] = { 'a', 'n', 'c', 'e' };
+static symbol s_7_2[4] = { 'e', 'n', 'c', 'e' };
+static symbol s_7_3[4] = { 'a', 'b', 'l', 'e' };
+static symbol s_7_4[4] = { 'i', 'b', 'l', 'e' };
+static symbol s_7_5[3] = { 'a', 't', 'e' };
+static symbol s_7_6[3] = { 'i', 'v', 'e' };
+static symbol s_7_7[3] = { 'i', 'z', 'e' };
+static symbol s_7_8[3] = { 'i', 't', 'i' };
+static symbol s_7_9[2] = { 'a', 'l' };
+static symbol s_7_10[3] = { 'i', 's', 'm' };
+static symbol s_7_11[3] = { 'i', 'o', 'n' };
+static symbol s_7_12[2] = { 'e', 'r' };
+static symbol s_7_13[3] = { 'o', 'u', 's' };
+static symbol s_7_14[3] = { 'a', 'n', 't' };
+static symbol s_7_15[3] = { 'e', 'n', 't' };
+static symbol s_7_16[4] = { 'm', 'e', 'n', 't' };
+static symbol s_7_17[5] = { 'e', 'm', 'e', 'n', 't' };
+
+static struct among a_7[18] =
+{
+/*  0 */ { 2, s_7_0, -1, 1, 0},
+/*  1 */ { 4, s_7_1, -1, 1, 0},
+/*  2 */ { 4, s_7_2, -1, 1, 0},
+/*  3 */ { 4, s_7_3, -1, 1, 0},
+/*  4 */ { 4, s_7_4, -1, 1, 0},
+/*  5 */ { 3, s_7_5, -1, 1, 0},
+/*  6 */ { 3, s_7_6, -1, 1, 0},
+/*  7 */ { 3, s_7_7, -1, 1, 0},
+/*  8 */ { 3, s_7_8, -1, 1, 0},
+/*  9 */ { 2, s_7_9, -1, 1, 0},
+/* 10 */ { 3, s_7_10, -1, 1, 0},
+/* 11 */ { 3, s_7_11, -1, 2, 0},
+/* 12 */ { 2, s_7_12, -1, 1, 0},
+/* 13 */ { 3, s_7_13, -1, 1, 0},
+/* 14 */ { 3, s_7_14, -1, 1, 0},
+/* 15 */ { 3, s_7_15, -1, 1, 0},
+/* 16 */ { 4, s_7_16, 15, 1, 0},
+/* 17 */ { 5, s_7_17, 16, 1, 0}
+};
+
+static symbol s_8_0[1] = { 'e' };
+static symbol s_8_1[1] = { 'l' };
+
+static struct among a_8[2] =
+{
+/*  0 */ { 1, s_8_0, -1, 1, 0},
+/*  1 */ { 1, s_8_1, -1, 2, 0}
+};
+
+static symbol s_9_0[7] = { 's', 'u', 'c', 'c', 'e', 'e', 'd' };
+static symbol s_9_1[7] = { 'p', 'r', 'o', 'c', 'e', 'e', 'd' };
+static symbol s_9_2[6] = { 'e', 'x', 'c', 'e', 'e', 'd' };
+static symbol s_9_3[7] = { 'c', 'a', 'n', 'n', 'i', 'n', 'g' };
+static symbol s_9_4[6] = { 'i', 'n', 'n', 'i', 'n', 'g' };
+static symbol s_9_5[7] = { 'e', 'a', 'r', 'r', 'i', 'n', 'g' };
+static symbol s_9_6[7] = { 'h', 'e', 'r', 'r', 'i', 'n', 'g' };
+static symbol s_9_7[6] = { 'o', 'u', 't', 'i', 'n', 'g' };
+
+static struct among a_9[8] =
+{
+/*  0 */ { 7, s_9_0, -1, -1, 0},
+/*  1 */ { 7, s_9_1, -1, -1, 0},
+/*  2 */ { 6, s_9_2, -1, -1, 0},
+/*  3 */ { 7, s_9_3, -1, -1, 0},
+/*  4 */ { 6, s_9_4, -1, -1, 0},
+/*  5 */ { 7, s_9_5, -1, -1, 0},
+/*  6 */ { 7, s_9_6, -1, -1, 0},
+/*  7 */ { 6, s_9_7, -1, -1, 0}
+};
+
+static symbol s_10_0[5] = { 'a', 'n', 'd', 'e', 's' };
+static symbol s_10_1[5] = { 'a', 't', 'l', 'a', 's' };
+static symbol s_10_2[4] = { 'b', 'i', 'a', 's' };
+static symbol s_10_3[6] = { 'c', 'o', 's', 'm', 'o', 's' };
+static symbol s_10_4[5] = { 'd', 'y', 'i', 'n', 'g' };
+static symbol s_10_5[5] = { 'e', 'a', 'r', 'l', 'y' };
+static symbol s_10_6[6] = { 'g', 'e', 'n', 't', 'l', 'y' };
+static symbol s_10_7[4] = { 'h', 'o', 'w', 'e' };
+static symbol s_10_8[4] = { 'i', 'd', 'l', 'y' };
+static symbol s_10_9[5] = { 'l', 'y', 'i', 'n', 'g' };
+static symbol s_10_10[4] = { 'n', 'e', 'w', 's' };
+static symbol s_10_11[4] = { 'o', 'n', 'l', 'y' };
+static symbol s_10_12[6] = { 's', 'i', 'n', 'g', 'l', 'y' };
+static symbol s_10_13[5] = { 's', 'k', 'i', 'e', 's' };
+static symbol s_10_14[4] = { 's', 'k', 'i', 's' };
+static symbol s_10_15[3] = { 's', 'k', 'y' };
+static symbol s_10_16[5] = { 't', 'y', 'i', 'n', 'g' };
+static symbol s_10_17[4] = { 'u', 'g', 'l', 'y' };
+
+static struct among a_10[18] =
+{
+/*  0 */ { 5, s_10_0, -1, -1, 0},
+/*  1 */ { 5, s_10_1, -1, -1, 0},
+/*  2 */ { 4, s_10_2, -1, -1, 0},
+/*  3 */ { 6, s_10_3, -1, -1, 0},
+/*  4 */ { 5, s_10_4, -1, 3, 0},
+/*  5 */ { 5, s_10_5, -1, 9, 0},
+/*  6 */ { 6, s_10_6, -1, 7, 0},
+/*  7 */ { 4, s_10_7, -1, -1, 0},
+/*  8 */ { 4, s_10_8, -1, 6, 0},
+/*  9 */ { 5, s_10_9, -1, 4, 0},
+/* 10 */ { 4, s_10_10, -1, -1, 0},
+/* 11 */ { 4, s_10_11, -1, 10, 0},
+/* 12 */ { 6, s_10_12, -1, 11, 0},
+/* 13 */ { 5, s_10_13, -1, 2, 0},
+/* 14 */ { 4, s_10_14, -1, 1, 0},
+/* 15 */ { 3, s_10_15, -1, -1, 0},
+/* 16 */ { 5, s_10_16, -1, 5, 0},
+/* 17 */ { 4, s_10_17, -1, 8, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1 };
+
+static unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 };
+
+static unsigned char g_valid_LI[] = { 55, 141, 2 };
+
+static symbol s_0[] = { '\'' };
+static symbol s_1[] = { 'y' };
+static symbol s_2[] = { 'Y' };
+static symbol s_3[] = { 'y' };
+static symbol s_4[] = { 'Y' };
+static symbol s_5[] = { 's', 's' };
+static symbol s_6[] = { 'i' };
+static symbol s_7[] = { 'i', 'e' };
+static symbol s_8[] = { 'e', 'e' };
+static symbol s_9[] = { 'e' };
+static symbol s_10[] = { 'e' };
+static symbol s_11[] = { 'y' };
+static symbol s_12[] = { 'Y' };
+static symbol s_13[] = { 'i' };
+static symbol s_14[] = { 't', 'i', 'o', 'n' };
+static symbol s_15[] = { 'e', 'n', 'c', 'e' };
+static symbol s_16[] = { 'a', 'n', 'c', 'e' };
+static symbol s_17[] = { 'a', 'b', 'l', 'e' };
+static symbol s_18[] = { 'e', 'n', 't' };
+static symbol s_19[] = { 'i', 'z', 'e' };
+static symbol s_20[] = { 'a', 't', 'e' };
+static symbol s_21[] = { 'a', 'l' };
+static symbol s_22[] = { 'f', 'u', 'l' };
+static symbol s_23[] = { 'o', 'u', 's' };
+static symbol s_24[] = { 'i', 'v', 'e' };
+static symbol s_25[] = { 'b', 'l', 'e' };
+static symbol s_26[] = { 'l' };
+static symbol s_27[] = { 'o', 'g' };
+static symbol s_28[] = { 'f', 'u', 'l' };
+static symbol s_29[] = { 'l', 'e', 's', 's' };
+static symbol s_30[] = { 't', 'i', 'o', 'n' };
+static symbol s_31[] = { 'a', 't', 'e' };
+static symbol s_32[] = { 'a', 'l' };
+static symbol s_33[] = { 'i', 'c' };
+static symbol s_34[] = { 's' };
+static symbol s_35[] = { 't' };
+static symbol s_36[] = { 'l' };
+static symbol s_37[] = { 's', 'k', 'i' };
+static symbol s_38[] = { 's', 'k', 'y' };
+static symbol s_39[] = { 'd', 'i', 'e' };
+static symbol s_40[] = { 'l', 'i', 'e' };
+static symbol s_41[] = { 't', 'i', 'e' };
+static symbol s_42[] = { 'i', 'd', 'l' };
+static symbol s_43[] = { 'g', 'e', 'n', 't', 'l' };
+static symbol s_44[] = { 'u', 'g', 'l', 'i' };
+static symbol s_45[] = { 'e', 'a', 'r', 'l', 'i' };
+static symbol s_46[] = { 'o', 'n', 'l', 'i' };
+static symbol s_47[] = { 's', 'i', 'n', 'g', 'l' };
+static symbol s_48[] = { 'Y' };
+static symbol s_49[] = { 'y' };
+
+static int r_prelude(struct SN_env * z) {
+    z->B[0] = 0; /* unset Y_found, line 26 */
+    {   int c = z->c; /* do, line 27 */
+        z->bra = z->c; /* [, line 27 */
+        if (!(eq_s(z, 1, s_0))) goto lab0;
+        z->ket = z->c; /* ], line 27 */
+        {   int ret;
+            ret = slice_del(z); /* delete, line 27 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 28 */
+        z->bra = z->c; /* [, line 28 */
+        if (!(eq_s(z, 1, s_1))) goto lab1;
+        z->ket = z->c; /* ], line 28 */
+        {   int ret;
+            ret = slice_from_s(z, 1, s_2); /* <-, line 28 */
+            if (ret < 0) return ret;
+        }
+        z->B[0] = 1; /* set Y_found, line 28 */
+    lab1:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 29 */
+        while(1) { /* repeat, line 29 */
+            int c = z->c;
+            while(1) { /* goto, line 29 */
+                int c = z->c;
+                if (!(in_grouping_U(z, g_v, 97, 121))) goto lab4;
+                z->bra = z->c; /* [, line 29 */
+                if (!(eq_s(z, 1, s_3))) goto lab4;
+                z->ket = z->c; /* ], line 29 */
+                z->c = c;
+                break;
+            lab4:
+                z->c = c;
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab3;
+                    z->c = c; /* goto, line 29 */
+                }
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_4); /* <-, line 29 */
+                if (ret < 0) return ret;
+            }
+            z->B[0] = 1; /* set Y_found, line 29 */
+            continue;
+        lab3:
+            z->c = c;
+            break;
+        }
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    {   int c = z->c; /* do, line 35 */
+        {   int c = z->c; /* or, line 40 */
+            if (!(find_among(z, a_0, 2))) goto lab2; /* among, line 36 */
+            goto lab1;
+        lab2:
+            z->c = c;
+            while(1) { /* gopast, line 40 */
+                if (!(in_grouping_U(z, g_v, 97, 121))) goto lab3;
+                break;
+            lab3:
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* gopast, line 40 */
+                }
+            }
+            while(1) { /* gopast, line 40 */
+                if (!(out_grouping_U(z, g_v, 97, 121))) goto lab4;
+                break;
+            lab4:
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* gopast, line 40 */
+                }
+            }
+        }
+    lab1:
+        z->I[0] = z->c; /* setmark p1, line 41 */
+        while(1) { /* gopast, line 42 */
+            if (!(in_grouping_U(z, g_v, 97, 121))) goto lab5;
+            break;
+        lab5:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab0;
+                z->c = c; /* gopast, line 42 */
+            }
+        }
+        while(1) { /* gopast, line 42 */
+            if (!(out_grouping_U(z, g_v, 97, 121))) goto lab6;
+            break;
+        lab6:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab0;
+                z->c = c; /* gopast, line 42 */
+            }
+        }
+        z->I[1] = z->c; /* setmark p2, line 42 */
+    lab0:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_shortv(struct SN_env * z) {
+    {   int m = z->l - z->c; (void) m; /* or, line 50 */
+        if (!(out_grouping_b_U(z, g_v_WXY, 89, 121))) goto lab1;
+        if (!(in_grouping_b_U(z, g_v, 97, 121))) goto lab1;
+        if (!(out_grouping_b_U(z, g_v, 97, 121))) goto lab1;
+        goto lab0;
+    lab1:
+        z->c = z->l - m;
+        if (!(out_grouping_b_U(z, g_v, 97, 121))) return 0;
+        if (!(in_grouping_b_U(z, g_v, 97, 121))) return 0;
+        if (z->c > z->lb) return 0; /* atlimit, line 51 */
+    }
+lab0:
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_Step_1a(struct SN_env * z) {
+    int among_var;
+    {   int m = z->l - z->c; (void) m; /* try, line 58 */
+        z->ket = z->c; /* [, line 59 */
+        among_var = find_among_b(z, a_1, 3); /* substring, line 59 */
+        if (!(among_var)) { z->c = z->l - m; goto lab0; }
+        z->bra = z->c; /* ], line 59 */
+        switch(among_var) {
+            case 0: { z->c = z->l - m; goto lab0; }
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 61 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab0:
+        ;
+    }
+    z->ket = z->c; /* [, line 64 */
+    among_var = find_among_b(z, a_2, 6); /* substring, line 64 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 64 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_5); /* <-, line 65 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m = z->l - z->c; (void) m; /* or, line 67 */
+                {   int c = skip_utf8(z->p, z->c, z->lb, z->l, - 2);
+                    if (c < 0) goto lab2;
+                    z->c = c; /* hop, line 67 */
+                }
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_6); /* <-, line 67 */
+                    if (ret < 0) return ret;
+                }
+                goto lab1;
+            lab2:
+                z->c = z->l - m;
+                {   int ret;
+                    ret = slice_from_s(z, 2, s_7); /* <-, line 67 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab1:
+            break;
+        case 3:
+            {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+                if (c < 0) return 0;
+                z->c = c; /* next, line 68 */
+            }
+            while(1) { /* gopast, line 68 */
+                if (!(in_grouping_b_U(z, g_v, 97, 121))) goto lab3;
+                break;
+            lab3:
+                {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+                    if (c < 0) return 0;
+                    z->c = c; /* gopast, line 68 */
+                }
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 68 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_1b(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 74 */
+    among_var = find_among_b(z, a_4, 6); /* substring, line 74 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 74 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 76 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 2, s_8); /* <-, line 76 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m_test = z->l - z->c; /* test, line 79 */
+                while(1) { /* gopast, line 79 */
+                    if (!(in_grouping_b_U(z, g_v, 97, 121))) goto lab0;
+                    break;
+                lab0:
+                    {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+                        if (c < 0) return 0;
+                        z->c = c; /* gopast, line 79 */
+                    }
+                }
+                z->c = z->l - m_test;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 79 */
+                if (ret < 0) return ret;
+            }
+            {   int m_test = z->l - z->c; /* test, line 80 */
+                among_var = find_among_b(z, a_3, 13); /* substring, line 80 */
+                if (!(among_var)) return 0;
+                z->c = z->l - m_test;
+            }
+            switch(among_var) {
+                case 0: return 0;
+                case 1:
+                    {   int ret;
+                        {   int c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_9); /* <+, line 82 */
+                            z->c = c;
+                        }
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 2:
+                    z->ket = z->c; /* [, line 85 */
+                    {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+                        if (c < 0) return 0;
+                        z->c = c; /* next, line 85 */
+                    }
+                    z->bra = z->c; /* ], line 85 */
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 85 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 3:
+                    if (z->c != z->I[0]) return 0; /* atmark, line 86 */
+                    {   int m_test = z->l - z->c; /* test, line 86 */
+                        {   int ret = r_shortv(z);
+                            if (ret == 0) return 0; /* call shortv, line 86 */
+                            if (ret < 0) return ret;
+                        }
+                        z->c = z->l - m_test;
+                    }
+                    {   int ret;
+                        {   int c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_10); /* <+, line 86 */
+                            z->c = c;
+                        }
+                        if (ret < 0) return ret;
+                    }
+                    break;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_1c(struct SN_env * z) {
+    z->ket = z->c; /* [, line 93 */
+    {   int m = z->l - z->c; (void) m; /* or, line 93 */
+        if (!(eq_s_b(z, 1, s_11))) goto lab1;
+        goto lab0;
+    lab1:
+        z->c = z->l - m;
+        if (!(eq_s_b(z, 1, s_12))) return 0;
+    }
+lab0:
+    z->bra = z->c; /* ], line 93 */
+    if (!(out_grouping_b_U(z, g_v, 97, 121))) return 0;
+    {   int m = z->l - z->c; (void) m; /* not, line 94 */
+        if (z->c > z->lb) goto lab2; /* atlimit, line 94 */
+        return 0;
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int ret;
+        ret = slice_from_s(z, 1, s_13); /* <-, line 95 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_Step_2(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 99 */
+    among_var = find_among_b(z, a_5, 24); /* substring, line 99 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 99 */
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 99 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_14); /* <-, line 100 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_15); /* <-, line 101 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_16); /* <-, line 102 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_17); /* <-, line 103 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_18); /* <-, line 104 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_19); /* <-, line 106 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 7:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_20); /* <-, line 108 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 8:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_21); /* <-, line 110 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 9:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_22); /* <-, line 111 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 10:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_23); /* <-, line 113 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 11:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_24); /* <-, line 115 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 12:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_25); /* <-, line 117 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 13:
+            if (!(eq_s_b(z, 1, s_26))) return 0;
+            {   int ret;
+                ret = slice_from_s(z, 2, s_27); /* <-, line 118 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 14:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_28); /* <-, line 119 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 15:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_29); /* <-, line 120 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 16:
+            if (!(in_grouping_b_U(z, g_valid_LI, 99, 116))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 121 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_3(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 126 */
+    among_var = find_among_b(z, a_6, 9); /* substring, line 126 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 126 */
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 126 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_30); /* <-, line 127 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_31); /* <-, line 128 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_32); /* <-, line 129 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_33); /* <-, line 131 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 133 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 135 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 135 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_4(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 140 */
+    among_var = find_among_b(z, a_7, 18); /* substring, line 140 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 140 */
+    {   int ret = r_R2(z);
+        if (ret == 0) return 0; /* call R2, line 140 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 143 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m = z->l - z->c; (void) m; /* or, line 144 */
+                if (!(eq_s_b(z, 1, s_34))) goto lab1;
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_35))) return 0;
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 144 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_5(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 149 */
+    among_var = find_among_b(z, a_8, 2); /* substring, line 149 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 149 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* or, line 150 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab1; /* call R2, line 150 */
+                    if (ret < 0) return ret;
+                }
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                {   int ret = r_R1(z);
+                    if (ret == 0) return 0; /* call R1, line 150 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* not, line 150 */
+                    {   int ret = r_shortv(z);
+                        if (ret == 0) goto lab2; /* call shortv, line 150 */
+                        if (ret < 0) return ret;
+                    }
+                    return 0;
+                lab2:
+                    z->c = z->l - m;
+                }
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 150 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 151 */
+                if (ret < 0) return ret;
+            }
+            if (!(eq_s_b(z, 1, s_36))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 151 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_exception2(struct SN_env * z) {
+    z->ket = z->c; /* [, line 157 */
+    if (!(find_among_b(z, a_9, 8))) return 0; /* substring, line 157 */
+    z->bra = z->c; /* ], line 157 */
+    if (z->c > z->lb) return 0; /* atlimit, line 157 */
+    return 1;
+}
+
+static int r_exception1(struct SN_env * z) {
+    int among_var;
+    z->bra = z->c; /* [, line 169 */
+    among_var = find_among(z, a_10, 18); /* substring, line 169 */
+    if (!(among_var)) return 0;
+    z->ket = z->c; /* ], line 169 */
+    if (z->c < z->l) return 0; /* atlimit, line 169 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_37); /* <-, line 173 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_38); /* <-, line 174 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_39); /* <-, line 175 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_40); /* <-, line 176 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_41); /* <-, line 177 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_42); /* <-, line 181 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 7:
+            {   int ret;
+                ret = slice_from_s(z, 5, s_43); /* <-, line 182 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 8:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_44); /* <-, line 183 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 9:
+            {   int ret;
+                ret = slice_from_s(z, 5, s_45); /* <-, line 184 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 10:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_46); /* <-, line 185 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 11:
+            {   int ret;
+                ret = slice_from_s(z, 5, s_47); /* <-, line 186 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    if (!(z->B[0])) return 0; /* Boolean test Y_found, line 202 */
+    while(1) { /* repeat, line 202 */
+        int c = z->c;
+        while(1) { /* goto, line 202 */
+            int c = z->c;
+            z->bra = z->c; /* [, line 202 */
+            if (!(eq_s(z, 1, s_48))) goto lab1;
+            z->ket = z->c; /* ], line 202 */
+            z->c = c;
+            break;
+        lab1:
+            z->c = c;
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab0;
+                z->c = c; /* goto, line 202 */
+            }
+        }
+        {   int ret;
+            ret = slice_from_s(z, 1, s_49); /* <-, line 202 */
+            if (ret < 0) return ret;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+extern int english_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* or, line 206 */
+        {   int ret = r_exception1(z);
+            if (ret == 0) goto lab1; /* call exception1, line 206 */
+            if (ret < 0) return ret;
+        }
+        goto lab0;
+    lab1:
+        z->c = c;
+        {   int c = z->c; /* not, line 207 */
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, + 3);
+                if (c < 0) goto lab3;
+                z->c = c; /* hop, line 207 */
+            }
+            goto lab2;
+        lab3:
+            z->c = c;
+        }
+        goto lab0;
+    lab2:
+        z->c = c;
+        {   int c = z->c; /* do, line 208 */
+            {   int ret = r_prelude(z);
+                if (ret == 0) goto lab4; /* call prelude, line 208 */
+                if (ret < 0) return ret;
+            }
+        lab4:
+            z->c = c;
+        }
+        {   int c = z->c; /* do, line 209 */
+            {   int ret = r_mark_regions(z);
+                if (ret == 0) goto lab5; /* call mark_regions, line 209 */
+                if (ret < 0) return ret;
+            }
+        lab5:
+            z->c = c;
+        }
+        z->lb = z->c; z->c = z->l; /* backwards, line 210 */
+
+        {   int m = z->l - z->c; (void) m; /* do, line 212 */
+            {   int ret = r_Step_1a(z);
+                if (ret == 0) goto lab6; /* call Step_1a, line 212 */
+                if (ret < 0) return ret;
+            }
+        lab6:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* or, line 214 */
+            {   int ret = r_exception2(z);
+                if (ret == 0) goto lab8; /* call exception2, line 214 */
+                if (ret < 0) return ret;
+            }
+            goto lab7;
+        lab8:
+            z->c = z->l - m;
+            {   int m = z->l - z->c; (void) m; /* do, line 216 */
+                {   int ret = r_Step_1b(z);
+                    if (ret == 0) goto lab9; /* call Step_1b, line 216 */
+                    if (ret < 0) return ret;
+                }
+            lab9:
+                z->c = z->l - m;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 217 */
+                {   int ret = r_Step_1c(z);
+                    if (ret == 0) goto lab10; /* call Step_1c, line 217 */
+                    if (ret < 0) return ret;
+                }
+            lab10:
+                z->c = z->l - m;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 219 */
+                {   int ret = r_Step_2(z);
+                    if (ret == 0) goto lab11; /* call Step_2, line 219 */
+                    if (ret < 0) return ret;
+                }
+            lab11:
+                z->c = z->l - m;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 220 */
+                {   int ret = r_Step_3(z);
+                    if (ret == 0) goto lab12; /* call Step_3, line 220 */
+                    if (ret < 0) return ret;
+                }
+            lab12:
+                z->c = z->l - m;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 221 */
+                {   int ret = r_Step_4(z);
+                    if (ret == 0) goto lab13; /* call Step_4, line 221 */
+                    if (ret < 0) return ret;
+                }
+            lab13:
+                z->c = z->l - m;
+            }
+            {   int m = z->l - z->c; (void) m; /* do, line 223 */
+                {   int ret = r_Step_5(z);
+                    if (ret == 0) goto lab14; /* call Step_5, line 223 */
+                    if (ret < 0) return ret;
+                }
+            lab14:
+                z->c = z->l - m;
+            }
+        }
+    lab7:
+        z->c = z->lb;
+        {   int c = z->c; /* do, line 226 */
+            {   int ret = r_postlude(z);
+                if (ret == 0) goto lab15; /* call postlude, line 226 */
+                if (ret < 0) return ret;
+            }
+        lab15:
+            z->c = c;
+        }
+    }
+lab0:
+    return 1;
+}
+
+extern struct SN_env * english_UTF_8_create_env(void) { return SN_create_env(0, 2, 1); }
+
+extern void english_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_english.h b/libstemmer_c/src_c/stem_UTF_8_english.h
new file mode 100644
index 0000000..619a8bc
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_english.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * english_UTF_8_create_env(void);
+extern void english_UTF_8_close_env(struct SN_env * z);
+
+extern int english_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_finnish.c b/libstemmer_c/src_c/stem_UTF_8_finnish.c
new file mode 100644
index 0000000..a221be6
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_finnish.c
@@ -0,0 +1,808 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int finnish_UTF_8_stem(struct SN_env * z);
+static int r_tidy(struct SN_env * z);
+static int r_other_endings(struct SN_env * z);
+static int r_t_plural(struct SN_env * z);
+static int r_i_plural(struct SN_env * z);
+static int r_case_ending(struct SN_env * z);
+static int r_VI(struct SN_env * z);
+static int r_LONG(struct SN_env * z);
+static int r_possessive(struct SN_env * z);
+static int r_particle_etc(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+
+extern struct SN_env * finnish_UTF_8_create_env(void);
+extern void finnish_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_0[2] = { 'p', 'a' };
+static symbol s_0_1[3] = { 's', 't', 'i' };
+static symbol s_0_2[4] = { 'k', 'a', 'a', 'n' };
+static symbol s_0_3[3] = { 'h', 'a', 'n' };
+static symbol s_0_4[3] = { 'k', 'i', 'n' };
+static symbol s_0_5[4] = { 'h', 0xC3, 0xA4, 'n' };
+static symbol s_0_6[6] = { 'k', 0xC3, 0xA4, 0xC3, 0xA4, 'n' };
+static symbol s_0_7[2] = { 'k', 'o' };
+static symbol s_0_8[3] = { 'p', 0xC3, 0xA4 };
+static symbol s_0_9[3] = { 'k', 0xC3, 0xB6 };
+
+static struct among a_0[10] =
+{
+/*  0 */ { 2, s_0_0, -1, 1, 0},
+/*  1 */ { 3, s_0_1, -1, 2, 0},
+/*  2 */ { 4, s_0_2, -1, 1, 0},
+/*  3 */ { 3, s_0_3, -1, 1, 0},
+/*  4 */ { 3, s_0_4, -1, 1, 0},
+/*  5 */ { 4, s_0_5, -1, 1, 0},
+/*  6 */ { 6, s_0_6, -1, 1, 0},
+/*  7 */ { 2, s_0_7, -1, 1, 0},
+/*  8 */ { 3, s_0_8, -1, 1, 0},
+/*  9 */ { 3, s_0_9, -1, 1, 0}
+};
+
+static symbol s_1_0[3] = { 'l', 'l', 'a' };
+static symbol s_1_1[2] = { 'n', 'a' };
+static symbol s_1_2[3] = { 's', 's', 'a' };
+static symbol s_1_3[2] = { 't', 'a' };
+static symbol s_1_4[3] = { 'l', 't', 'a' };
+static symbol s_1_5[3] = { 's', 't', 'a' };
+
+static struct among a_1[6] =
+{
+/*  0 */ { 3, s_1_0, -1, -1, 0},
+/*  1 */ { 2, s_1_1, -1, -1, 0},
+/*  2 */ { 3, s_1_2, -1, -1, 0},
+/*  3 */ { 2, s_1_3, -1, -1, 0},
+/*  4 */ { 3, s_1_4, 3, -1, 0},
+/*  5 */ { 3, s_1_5, 3, -1, 0}
+};
+
+static symbol s_2_0[4] = { 'l', 'l', 0xC3, 0xA4 };
+static symbol s_2_1[3] = { 'n', 0xC3, 0xA4 };
+static symbol s_2_2[4] = { 's', 's', 0xC3, 0xA4 };
+static symbol s_2_3[3] = { 't', 0xC3, 0xA4 };
+static symbol s_2_4[4] = { 'l', 't', 0xC3, 0xA4 };
+static symbol s_2_5[4] = { 's', 't', 0xC3, 0xA4 };
+
+static struct among a_2[6] =
+{
+/*  0 */ { 4, s_2_0, -1, -1, 0},
+/*  1 */ { 3, s_2_1, -1, -1, 0},
+/*  2 */ { 4, s_2_2, -1, -1, 0},
+/*  3 */ { 3, s_2_3, -1, -1, 0},
+/*  4 */ { 4, s_2_4, 3, -1, 0},
+/*  5 */ { 4, s_2_5, 3, -1, 0}
+};
+
+static symbol s_3_0[3] = { 'l', 'l', 'e' };
+static symbol s_3_1[3] = { 'i', 'n', 'e' };
+
+static struct among a_3[2] =
+{
+/*  0 */ { 3, s_3_0, -1, -1, 0},
+/*  1 */ { 3, s_3_1, -1, -1, 0}
+};
+
+static symbol s_4_0[3] = { 'n', 's', 'a' };
+static symbol s_4_1[3] = { 'm', 'm', 'e' };
+static symbol s_4_2[3] = { 'n', 'n', 'e' };
+static symbol s_4_3[2] = { 'n', 'i' };
+static symbol s_4_4[2] = { 's', 'i' };
+static symbol s_4_5[2] = { 'a', 'n' };
+static symbol s_4_6[2] = { 'e', 'n' };
+static symbol s_4_7[3] = { 0xC3, 0xA4, 'n' };
+static symbol s_4_8[4] = { 'n', 's', 0xC3, 0xA4 };
+
+static struct among a_4[9] =
+{
+/*  0 */ { 3, s_4_0, -1, 3, 0},
+/*  1 */ { 3, s_4_1, -1, 3, 0},
+/*  2 */ { 3, s_4_2, -1, 3, 0},
+/*  3 */ { 2, s_4_3, -1, 2, 0},
+/*  4 */ { 2, s_4_4, -1, 1, 0},
+/*  5 */ { 2, s_4_5, -1, 4, 0},
+/*  6 */ { 2, s_4_6, -1, 6, 0},
+/*  7 */ { 3, s_4_7, -1, 5, 0},
+/*  8 */ { 4, s_4_8, -1, 3, 0}
+};
+
+static symbol s_5_0[2] = { 'a', 'a' };
+static symbol s_5_1[2] = { 'e', 'e' };
+static symbol s_5_2[2] = { 'i', 'i' };
+static symbol s_5_3[2] = { 'o', 'o' };
+static symbol s_5_4[2] = { 'u', 'u' };
+static symbol s_5_5[4] = { 0xC3, 0xA4, 0xC3, 0xA4 };
+static symbol s_5_6[4] = { 0xC3, 0xB6, 0xC3, 0xB6 };
+
+static struct among a_5[7] =
+{
+/*  0 */ { 2, s_5_0, -1, -1, 0},
+/*  1 */ { 2, s_5_1, -1, -1, 0},
+/*  2 */ { 2, s_5_2, -1, -1, 0},
+/*  3 */ { 2, s_5_3, -1, -1, 0},
+/*  4 */ { 2, s_5_4, -1, -1, 0},
+/*  5 */ { 4, s_5_5, -1, -1, 0},
+/*  6 */ { 4, s_5_6, -1, -1, 0}
+};
+
+static symbol s_6_0[1] = { 'a' };
+static symbol s_6_1[3] = { 'l', 'l', 'a' };
+static symbol s_6_2[2] = { 'n', 'a' };
+static symbol s_6_3[3] = { 's', 's', 'a' };
+static symbol s_6_4[2] = { 't', 'a' };
+static symbol s_6_5[3] = { 'l', 't', 'a' };
+static symbol s_6_6[3] = { 's', 't', 'a' };
+static symbol s_6_7[3] = { 't', 't', 'a' };
+static symbol s_6_8[3] = { 'l', 'l', 'e' };
+static symbol s_6_9[3] = { 'i', 'n', 'e' };
+static symbol s_6_10[3] = { 'k', 's', 'i' };
+static symbol s_6_11[1] = { 'n' };
+static symbol s_6_12[3] = { 'h', 'a', 'n' };
+static symbol s_6_13[3] = { 'd', 'e', 'n' };
+static symbol s_6_14[4] = { 's', 'e', 'e', 'n' };
+static symbol s_6_15[3] = { 'h', 'e', 'n' };
+static symbol s_6_16[4] = { 't', 't', 'e', 'n' };
+static symbol s_6_17[3] = { 'h', 'i', 'n' };
+static symbol s_6_18[4] = { 's', 'i', 'i', 'n' };
+static symbol s_6_19[3] = { 'h', 'o', 'n' };
+static symbol s_6_20[4] = { 'h', 0xC3, 0xA4, 'n' };
+static symbol s_6_21[4] = { 'h', 0xC3, 0xB6, 'n' };
+static symbol s_6_22[2] = { 0xC3, 0xA4 };
+static symbol s_6_23[4] = { 'l', 'l', 0xC3, 0xA4 };
+static symbol s_6_24[3] = { 'n', 0xC3, 0xA4 };
+static symbol s_6_25[4] = { 's', 's', 0xC3, 0xA4 };
+static symbol s_6_26[3] = { 't', 0xC3, 0xA4 };
+static symbol s_6_27[4] = { 'l', 't', 0xC3, 0xA4 };
+static symbol s_6_28[4] = { 's', 't', 0xC3, 0xA4 };
+static symbol s_6_29[4] = { 't', 't', 0xC3, 0xA4 };
+
+static struct among a_6[30] =
+{
+/*  0 */ { 1, s_6_0, -1, 8, 0},
+/*  1 */ { 3, s_6_1, 0, -1, 0},
+/*  2 */ { 2, s_6_2, 0, -1, 0},
+/*  3 */ { 3, s_6_3, 0, -1, 0},
+/*  4 */ { 2, s_6_4, 0, -1, 0},
+/*  5 */ { 3, s_6_5, 4, -1, 0},
+/*  6 */ { 3, s_6_6, 4, -1, 0},
+/*  7 */ { 3, s_6_7, 4, 9, 0},
+/*  8 */ { 3, s_6_8, -1, -1, 0},
+/*  9 */ { 3, s_6_9, -1, -1, 0},
+/* 10 */ { 3, s_6_10, -1, -1, 0},
+/* 11 */ { 1, s_6_11, -1, 7, 0},
+/* 12 */ { 3, s_6_12, 11, 1, 0},
+/* 13 */ { 3, s_6_13, 11, -1, r_VI},
+/* 14 */ { 4, s_6_14, 11, -1, r_LONG},
+/* 15 */ { 3, s_6_15, 11, 2, 0},
+/* 16 */ { 4, s_6_16, 11, -1, r_VI},
+/* 17 */ { 3, s_6_17, 11, 3, 0},
+/* 18 */ { 4, s_6_18, 11, -1, r_VI},
+/* 19 */ { 3, s_6_19, 11, 4, 0},
+/* 20 */ { 4, s_6_20, 11, 5, 0},
+/* 21 */ { 4, s_6_21, 11, 6, 0},
+/* 22 */ { 2, s_6_22, -1, 8, 0},
+/* 23 */ { 4, s_6_23, 22, -1, 0},
+/* 24 */ { 3, s_6_24, 22, -1, 0},
+/* 25 */ { 4, s_6_25, 22, -1, 0},
+/* 26 */ { 3, s_6_26, 22, -1, 0},
+/* 27 */ { 4, s_6_27, 26, -1, 0},
+/* 28 */ { 4, s_6_28, 26, -1, 0},
+/* 29 */ { 4, s_6_29, 26, 9, 0}
+};
+
+static symbol s_7_0[3] = { 'e', 'j', 'a' };
+static symbol s_7_1[3] = { 'm', 'm', 'a' };
+static symbol s_7_2[4] = { 'i', 'm', 'm', 'a' };
+static symbol s_7_3[3] = { 'm', 'p', 'a' };
+static symbol s_7_4[4] = { 'i', 'm', 'p', 'a' };
+static symbol s_7_5[3] = { 'm', 'm', 'i' };
+static symbol s_7_6[4] = { 'i', 'm', 'm', 'i' };
+static symbol s_7_7[3] = { 'm', 'p', 'i' };
+static symbol s_7_8[4] = { 'i', 'm', 'p', 'i' };
+static symbol s_7_9[4] = { 'e', 'j', 0xC3, 0xA4 };
+static symbol s_7_10[4] = { 'm', 'm', 0xC3, 0xA4 };
+static symbol s_7_11[5] = { 'i', 'm', 'm', 0xC3, 0xA4 };
+static symbol s_7_12[4] = { 'm', 'p', 0xC3, 0xA4 };
+static symbol s_7_13[5] = { 'i', 'm', 'p', 0xC3, 0xA4 };
+
+static struct among a_7[14] =
+{
+/*  0 */ { 3, s_7_0, -1, -1, 0},
+/*  1 */ { 3, s_7_1, -1, 1, 0},
+/*  2 */ { 4, s_7_2, 1, -1, 0},
+/*  3 */ { 3, s_7_3, -1, 1, 0},
+/*  4 */ { 4, s_7_4, 3, -1, 0},
+/*  5 */ { 3, s_7_5, -1, 1, 0},
+/*  6 */ { 4, s_7_6, 5, -1, 0},
+/*  7 */ { 3, s_7_7, -1, 1, 0},
+/*  8 */ { 4, s_7_8, 7, -1, 0},
+/*  9 */ { 4, s_7_9, -1, -1, 0},
+/* 10 */ { 4, s_7_10, -1, 1, 0},
+/* 11 */ { 5, s_7_11, 10, -1, 0},
+/* 12 */ { 4, s_7_12, -1, 1, 0},
+/* 13 */ { 5, s_7_13, 12, -1, 0}
+};
+
+static symbol s_8_0[1] = { 'i' };
+static symbol s_8_1[1] = { 'j' };
+
+static struct among a_8[2] =
+{
+/*  0 */ { 1, s_8_0, -1, -1, 0},
+/*  1 */ { 1, s_8_1, -1, -1, 0}
+};
+
+static symbol s_9_0[3] = { 'm', 'm', 'a' };
+static symbol s_9_1[4] = { 'i', 'm', 'm', 'a' };
+
+static struct among a_9[2] =
+{
+/*  0 */ { 3, s_9_0, -1, 1, 0},
+/*  1 */ { 4, s_9_1, 0, -1, 0}
+};
+
+static unsigned char g_AEI[] = { 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 };
+
+static unsigned char g_V1[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 };
+
+static unsigned char g_V2[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 };
+
+static unsigned char g_particle_end[] = { 17, 97, 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 };
+
+static symbol s_0[] = { 'k' };
+static symbol s_1[] = { 'k', 's', 'e' };
+static symbol s_2[] = { 'k', 's', 'i' };
+static symbol s_3[] = { 'i' };
+static symbol s_4[] = { 'a' };
+static symbol s_5[] = { 'e' };
+static symbol s_6[] = { 'i' };
+static symbol s_7[] = { 'o' };
+static symbol s_8[] = { 0xC3, 0xA4 };
+static symbol s_9[] = { 0xC3, 0xB6 };
+static symbol s_10[] = { 'i', 'e' };
+static symbol s_11[] = { 'e' };
+static symbol s_12[] = { 'p', 'o' };
+static symbol s_13[] = { 't' };
+static symbol s_14[] = { 'p', 'o' };
+static symbol s_15[] = { 'j' };
+static symbol s_16[] = { 'o' };
+static symbol s_17[] = { 'u' };
+static symbol s_18[] = { 'o' };
+static symbol s_19[] = { 'j' };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    while(1) { /* goto, line 46 */
+        int c = z->c;
+        if (!(in_grouping_U(z, g_V1, 97, 246))) goto lab0;
+        z->c = c;
+        break;
+    lab0:
+        z->c = c;
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* goto, line 46 */
+        }
+    }
+    while(1) { /* gopast, line 46 */
+        if (!(out_grouping_U(z, g_V1, 97, 246))) goto lab1;
+        break;
+    lab1:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 46 */
+        }
+    }
+    z->I[0] = z->c; /* setmark p1, line 46 */
+    while(1) { /* goto, line 47 */
+        int c = z->c;
+        if (!(in_grouping_U(z, g_V1, 97, 246))) goto lab2;
+        z->c = c;
+        break;
+    lab2:
+        z->c = c;
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* goto, line 47 */
+        }
+    }
+    while(1) { /* gopast, line 47 */
+        if (!(out_grouping_U(z, g_V1, 97, 246))) goto lab3;
+        break;
+    lab3:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 47 */
+        }
+    }
+    z->I[1] = z->c; /* setmark p2, line 47 */
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_particle_etc(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 55 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 55 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 55 */
+        among_var = find_among_b(z, a_0, 10); /* substring, line 55 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 55 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            if (!(in_grouping_b_U(z, g_particle_end, 97, 246))) return 0;
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 64 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 66 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_possessive(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 69 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 69 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 69 */
+        among_var = find_among_b(z, a_4, 9); /* substring, line 69 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 69 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* not, line 72 */
+                if (!(eq_s_b(z, 1, s_0))) goto lab0;
+                return 0;
+            lab0:
+                z->c = z->l - m;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 72 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 74 */
+                if (ret < 0) return ret;
+            }
+            z->ket = z->c; /* [, line 74 */
+            if (!(eq_s_b(z, 3, s_1))) return 0;
+            z->bra = z->c; /* ], line 74 */
+            {   int ret;
+                ret = slice_from_s(z, 3, s_2); /* <-, line 74 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 78 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            if (!(find_among_b(z, a_1, 6))) return 0; /* among, line 81 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 81 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            if (!(find_among_b(z, a_2, 6))) return 0; /* among, line 83 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 84 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            if (!(find_among_b(z, a_3, 2))) return 0; /* among, line 86 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 86 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_LONG(struct SN_env * z) {
+    if (!(find_among_b(z, a_5, 7))) return 0; /* among, line 91 */
+    return 1;
+}
+
+static int r_VI(struct SN_env * z) {
+    if (!(eq_s_b(z, 1, s_3))) return 0;
+    if (!(in_grouping_b_U(z, g_V2, 97, 246))) return 0;
+    return 1;
+}
+
+static int r_case_ending(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 96 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 96 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 96 */
+        among_var = find_among_b(z, a_6, 30); /* substring, line 96 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 96 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            if (!(eq_s_b(z, 1, s_4))) return 0;
+            break;
+        case 2:
+            if (!(eq_s_b(z, 1, s_5))) return 0;
+            break;
+        case 3:
+            if (!(eq_s_b(z, 1, s_6))) return 0;
+            break;
+        case 4:
+            if (!(eq_s_b(z, 1, s_7))) return 0;
+            break;
+        case 5:
+            if (!(eq_s_b(z, 2, s_8))) return 0;
+            break;
+        case 6:
+            if (!(eq_s_b(z, 2, s_9))) return 0;
+            break;
+        case 7:
+            {   int m = z->l - z->c; (void) m; /* try, line 111 */
+                {   int m = z->l - z->c; (void) m; /* and, line 113 */
+                    {   int m = z->l - z->c; (void) m; /* or, line 112 */
+                        {   int ret = r_LONG(z);
+                            if (ret == 0) goto lab2; /* call LONG, line 111 */
+                            if (ret < 0) return ret;
+                        }
+                        goto lab1;
+                    lab2:
+                        z->c = z->l - m;
+                        if (!(eq_s_b(z, 2, s_10))) { z->c = z->l - m; goto lab0; }
+                    }
+                lab1:
+                    z->c = z->l - m;
+                    {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+                        if (c < 0) { z->c = z->l - m; goto lab0; }
+                        z->c = c; /* next, line 113 */
+                    }
+                }
+                z->bra = z->c; /* ], line 113 */
+            lab0:
+                ;
+            }
+            break;
+        case 8:
+            if (!(in_grouping_b_U(z, g_V1, 97, 246))) return 0;
+            if (!(out_grouping_b_U(z, g_V1, 97, 246))) return 0;
+            break;
+        case 9:
+            if (!(eq_s_b(z, 1, s_11))) return 0;
+            break;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 138 */
+        if (ret < 0) return ret;
+    }
+    z->B[0] = 1; /* set ending_removed, line 139 */
+    return 1;
+}
+
+static int r_other_endings(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 142 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[1]) return 0;
+        z->c = z->I[1]; /* tomark, line 142 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 142 */
+        among_var = find_among_b(z, a_7, 14); /* substring, line 142 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 142 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* not, line 146 */
+                if (!(eq_s_b(z, 2, s_12))) goto lab0;
+                return 0;
+            lab0:
+                z->c = z->l - m;
+            }
+            break;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 151 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_i_plural(struct SN_env * z) {
+    {   int m3; /* setlimit, line 154 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 154 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 154 */
+        if (!(find_among_b(z, a_8, 2))) { z->lb = m3; return 0; } /* substring, line 154 */
+        z->bra = z->c; /* ], line 154 */
+        z->lb = m3;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 158 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_t_plural(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 161 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 161 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 162 */
+        if (!(eq_s_b(z, 1, s_13))) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 162 */
+        {   int m_test = z->l - z->c; /* test, line 162 */
+            if (!(in_grouping_b_U(z, g_V1, 97, 246))) { z->lb = m3; return 0; }
+            z->c = z->l - m_test;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 163 */
+            if (ret < 0) return ret;
+        }
+        z->lb = m3;
+    }
+    {   int m3; /* setlimit, line 165 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[1]) return 0;
+        z->c = z->I[1]; /* tomark, line 165 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 165 */
+        among_var = find_among_b(z, a_9, 2); /* substring, line 165 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 165 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* not, line 167 */
+                if (!(eq_s_b(z, 2, s_14))) goto lab0;
+                return 0;
+            lab0:
+                z->c = z->l - m;
+            }
+            break;
+    }
+    {   int ret;
+        ret = slice_del(z); /* delete, line 170 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_tidy(struct SN_env * z) {
+    {   int m3; /* setlimit, line 173 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 173 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        {   int m = z->l - z->c; (void) m; /* do, line 174 */
+            {   int m = z->l - z->c; (void) m; /* and, line 174 */
+                {   int ret = r_LONG(z);
+                    if (ret == 0) goto lab0; /* call LONG, line 174 */
+                    if (ret < 0) return ret;
+                }
+                z->c = z->l - m;
+                z->ket = z->c; /* [, line 174 */
+                {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 174 */
+                }
+                z->bra = z->c; /* ], line 174 */
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 174 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab0:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* do, line 175 */
+            z->ket = z->c; /* [, line 175 */
+            if (!(in_grouping_b_U(z, g_AEI, 97, 228))) goto lab1;
+            z->bra = z->c; /* ], line 175 */
+            if (!(out_grouping_b_U(z, g_V1, 97, 246))) goto lab1;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 175 */
+                if (ret < 0) return ret;
+            }
+        lab1:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* do, line 176 */
+            z->ket = z->c; /* [, line 176 */
+            if (!(eq_s_b(z, 1, s_15))) goto lab2;
+            z->bra = z->c; /* ], line 176 */
+            {   int m = z->l - z->c; (void) m; /* or, line 176 */
+                if (!(eq_s_b(z, 1, s_16))) goto lab4;
+                goto lab3;
+            lab4:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_17))) goto lab2;
+            }
+        lab3:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 176 */
+                if (ret < 0) return ret;
+            }
+        lab2:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* do, line 177 */
+            z->ket = z->c; /* [, line 177 */
+            if (!(eq_s_b(z, 1, s_18))) goto lab5;
+            z->bra = z->c; /* ], line 177 */
+            if (!(eq_s_b(z, 1, s_19))) goto lab5;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 177 */
+                if (ret < 0) return ret;
+            }
+        lab5:
+            z->c = z->l - m;
+        }
+        z->lb = m3;
+    }
+    while(1) { /* goto, line 179 */
+        int m = z->l - z->c; (void) m;
+        if (!(out_grouping_b_U(z, g_V1, 97, 246))) goto lab6;
+        z->c = z->l - m;
+        break;
+    lab6:
+        z->c = z->l - m;
+        {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+            if (c < 0) return 0;
+            z->c = c; /* goto, line 179 */
+        }
+    }
+    z->ket = z->c; /* [, line 179 */
+    {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+        if (c < 0) return 0;
+        z->c = c; /* next, line 179 */
+    }
+    z->bra = z->c; /* ], line 179 */
+    z->S[0] = slice_to(z, z->S[0]); /* -> x, line 179 */
+    if (z->S[0] == 0) return -1; /* -> x, line 179 */
+    if (!(eq_v_b(z, z->S[0]))) return 0; /* name x, line 179 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 179 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+extern int finnish_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 185 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 185 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->B[0] = 0; /* unset ending_removed, line 186 */
+    z->lb = z->c; z->c = z->l; /* backwards, line 187 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 188 */
+        {   int ret = r_particle_etc(z);
+            if (ret == 0) goto lab1; /* call particle_etc, line 188 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 189 */
+        {   int ret = r_possessive(z);
+            if (ret == 0) goto lab2; /* call possessive, line 189 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 190 */
+        {   int ret = r_case_ending(z);
+            if (ret == 0) goto lab3; /* call case_ending, line 190 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 191 */
+        {   int ret = r_other_endings(z);
+            if (ret == 0) goto lab4; /* call other_endings, line 191 */
+            if (ret < 0) return ret;
+        }
+    lab4:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* or, line 192 */
+        if (!(z->B[0])) goto lab6; /* Boolean test ending_removed, line 192 */
+        {   int m = z->l - z->c; (void) m; /* do, line 192 */
+            {   int ret = r_i_plural(z);
+                if (ret == 0) goto lab7; /* call i_plural, line 192 */
+                if (ret < 0) return ret;
+            }
+        lab7:
+            z->c = z->l - m;
+        }
+        goto lab5;
+    lab6:
+        z->c = z->l - m;
+        {   int m = z->l - z->c; (void) m; /* do, line 192 */
+            {   int ret = r_t_plural(z);
+                if (ret == 0) goto lab8; /* call t_plural, line 192 */
+                if (ret < 0) return ret;
+            }
+        lab8:
+            z->c = z->l - m;
+        }
+    }
+lab5:
+    {   int m = z->l - z->c; (void) m; /* do, line 193 */
+        {   int ret = r_tidy(z);
+            if (ret == 0) goto lab9; /* call tidy, line 193 */
+            if (ret < 0) return ret;
+        }
+    lab9:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * finnish_UTF_8_create_env(void) { return SN_create_env(1, 2, 1); }
+
+extern void finnish_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_finnish.h b/libstemmer_c/src_c/stem_UTF_8_finnish.h
new file mode 100644
index 0000000..d2f2fd9
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_finnish.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * finnish_UTF_8_create_env(void);
+extern void finnish_UTF_8_close_env(struct SN_env * z);
+
+extern int finnish_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_french.c b/libstemmer_c/src_c/stem_UTF_8_french.c
new file mode 100644
index 0000000..1f95c7c
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_french.c
@@ -0,0 +1,1296 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int french_UTF_8_stem(struct SN_env * z);
+static int r_un_accent(struct SN_env * z);
+static int r_un_double(struct SN_env * z);
+static int r_residual_suffix(struct SN_env * z);
+static int r_verb_suffix(struct SN_env * z);
+static int r_i_verb_suffix(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_RV(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * french_UTF_8_create_env(void);
+extern void french_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_1[1] = { 'I' };
+static symbol s_0_2[1] = { 'U' };
+static symbol s_0_3[1] = { 'Y' };
+
+static struct among a_0[4] =
+{
+/*  0 */ { 0, 0, -1, 4, 0},
+/*  1 */ { 1, s_0_1, 0, 1, 0},
+/*  2 */ { 1, s_0_2, 0, 2, 0},
+/*  3 */ { 1, s_0_3, 0, 3, 0}
+};
+
+static symbol s_1_0[3] = { 'i', 'q', 'U' };
+static symbol s_1_1[3] = { 'a', 'b', 'l' };
+static symbol s_1_2[4] = { 'I', 0xC3, 0xA8, 'r' };
+static symbol s_1_3[4] = { 'i', 0xC3, 0xA8, 'r' };
+static symbol s_1_4[3] = { 'e', 'u', 's' };
+static symbol s_1_5[2] = { 'i', 'v' };
+
+static struct among a_1[6] =
+{
+/*  0 */ { 3, s_1_0, -1, 3, 0},
+/*  1 */ { 3, s_1_1, -1, 3, 0},
+/*  2 */ { 4, s_1_2, -1, 4, 0},
+/*  3 */ { 4, s_1_3, -1, 4, 0},
+/*  4 */ { 3, s_1_4, -1, 2, 0},
+/*  5 */ { 2, s_1_5, -1, 1, 0}
+};
+
+static symbol s_2_0[2] = { 'i', 'c' };
+static symbol s_2_1[4] = { 'a', 'b', 'i', 'l' };
+static symbol s_2_2[2] = { 'i', 'v' };
+
+static struct among a_2[3] =
+{
+/*  0 */ { 2, s_2_0, -1, 2, 0},
+/*  1 */ { 4, s_2_1, -1, 1, 0},
+/*  2 */ { 2, s_2_2, -1, 3, 0}
+};
+
+static symbol s_3_0[4] = { 'i', 'q', 'U', 'e' };
+static symbol s_3_1[6] = { 'a', 't', 'r', 'i', 'c', 'e' };
+static symbol s_3_2[4] = { 'a', 'n', 'c', 'e' };
+static symbol s_3_3[4] = { 'e', 'n', 'c', 'e' };
+static symbol s_3_4[5] = { 'l', 'o', 'g', 'i', 'e' };
+static symbol s_3_5[4] = { 'a', 'b', 'l', 'e' };
+static symbol s_3_6[4] = { 'i', 's', 'm', 'e' };
+static symbol s_3_7[4] = { 'e', 'u', 's', 'e' };
+static symbol s_3_8[4] = { 'i', 's', 't', 'e' };
+static symbol s_3_9[3] = { 'i', 'v', 'e' };
+static symbol s_3_10[2] = { 'i', 'f' };
+static symbol s_3_11[5] = { 'u', 's', 'i', 'o', 'n' };
+static symbol s_3_12[5] = { 'a', 't', 'i', 'o', 'n' };
+static symbol s_3_13[5] = { 'u', 't', 'i', 'o', 'n' };
+static symbol s_3_14[5] = { 'a', 't', 'e', 'u', 'r' };
+static symbol s_3_15[5] = { 'i', 'q', 'U', 'e', 's' };
+static symbol s_3_16[7] = { 'a', 't', 'r', 'i', 'c', 'e', 's' };
+static symbol s_3_17[5] = { 'a', 'n', 'c', 'e', 's' };
+static symbol s_3_18[5] = { 'e', 'n', 'c', 'e', 's' };
+static symbol s_3_19[6] = { 'l', 'o', 'g', 'i', 'e', 's' };
+static symbol s_3_20[5] = { 'a', 'b', 'l', 'e', 's' };
+static symbol s_3_21[5] = { 'i', 's', 'm', 'e', 's' };
+static symbol s_3_22[5] = { 'e', 'u', 's', 'e', 's' };
+static symbol s_3_23[5] = { 'i', 's', 't', 'e', 's' };
+static symbol s_3_24[4] = { 'i', 'v', 'e', 's' };
+static symbol s_3_25[3] = { 'i', 'f', 's' };
+static symbol s_3_26[6] = { 'u', 's', 'i', 'o', 'n', 's' };
+static symbol s_3_27[6] = { 'a', 't', 'i', 'o', 'n', 's' };
+static symbol s_3_28[6] = { 'u', 't', 'i', 'o', 'n', 's' };
+static symbol s_3_29[6] = { 'a', 't', 'e', 'u', 'r', 's' };
+static symbol s_3_30[5] = { 'm', 'e', 'n', 't', 's' };
+static symbol s_3_31[6] = { 'e', 'm', 'e', 'n', 't', 's' };
+static symbol s_3_32[9] = { 'i', 's', 's', 'e', 'm', 'e', 'n', 't', 's' };
+static symbol s_3_33[5] = { 'i', 't', 0xC3, 0xA9, 's' };
+static symbol s_3_34[4] = { 'm', 'e', 'n', 't' };
+static symbol s_3_35[5] = { 'e', 'm', 'e', 'n', 't' };
+static symbol s_3_36[8] = { 'i', 's', 's', 'e', 'm', 'e', 'n', 't' };
+static symbol s_3_37[6] = { 'a', 'm', 'm', 'e', 'n', 't' };
+static symbol s_3_38[6] = { 'e', 'm', 'm', 'e', 'n', 't' };
+static symbol s_3_39[3] = { 'a', 'u', 'x' };
+static symbol s_3_40[4] = { 'e', 'a', 'u', 'x' };
+static symbol s_3_41[3] = { 'e', 'u', 'x' };
+static symbol s_3_42[4] = { 'i', 't', 0xC3, 0xA9 };
+
+static struct among a_3[43] =
+{
+/*  0 */ { 4, s_3_0, -1, 1, 0},
+/*  1 */ { 6, s_3_1, -1, 2, 0},
+/*  2 */ { 4, s_3_2, -1, 1, 0},
+/*  3 */ { 4, s_3_3, -1, 5, 0},
+/*  4 */ { 5, s_3_4, -1, 3, 0},
+/*  5 */ { 4, s_3_5, -1, 1, 0},
+/*  6 */ { 4, s_3_6, -1, 1, 0},
+/*  7 */ { 4, s_3_7, -1, 11, 0},
+/*  8 */ { 4, s_3_8, -1, 1, 0},
+/*  9 */ { 3, s_3_9, -1, 8, 0},
+/* 10 */ { 2, s_3_10, -1, 8, 0},
+/* 11 */ { 5, s_3_11, -1, 4, 0},
+/* 12 */ { 5, s_3_12, -1, 2, 0},
+/* 13 */ { 5, s_3_13, -1, 4, 0},
+/* 14 */ { 5, s_3_14, -1, 2, 0},
+/* 15 */ { 5, s_3_15, -1, 1, 0},
+/* 16 */ { 7, s_3_16, -1, 2, 0},
+/* 17 */ { 5, s_3_17, -1, 1, 0},
+/* 18 */ { 5, s_3_18, -1, 5, 0},
+/* 19 */ { 6, s_3_19, -1, 3, 0},
+/* 20 */ { 5, s_3_20, -1, 1, 0},
+/* 21 */ { 5, s_3_21, -1, 1, 0},
+/* 22 */ { 5, s_3_22, -1, 11, 0},
+/* 23 */ { 5, s_3_23, -1, 1, 0},
+/* 24 */ { 4, s_3_24, -1, 8, 0},
+/* 25 */ { 3, s_3_25, -1, 8, 0},
+/* 26 */ { 6, s_3_26, -1, 4, 0},
+/* 27 */ { 6, s_3_27, -1, 2, 0},
+/* 28 */ { 6, s_3_28, -1, 4, 0},
+/* 29 */ { 6, s_3_29, -1, 2, 0},
+/* 30 */ { 5, s_3_30, -1, 15, 0},
+/* 31 */ { 6, s_3_31, 30, 6, 0},
+/* 32 */ { 9, s_3_32, 31, 12, 0},
+/* 33 */ { 5, s_3_33, -1, 7, 0},
+/* 34 */ { 4, s_3_34, -1, 15, 0},
+/* 35 */ { 5, s_3_35, 34, 6, 0},
+/* 36 */ { 8, s_3_36, 35, 12, 0},
+/* 37 */ { 6, s_3_37, 34, 13, 0},
+/* 38 */ { 6, s_3_38, 34, 14, 0},
+/* 39 */ { 3, s_3_39, -1, 10, 0},
+/* 40 */ { 4, s_3_40, 39, 9, 0},
+/* 41 */ { 3, s_3_41, -1, 1, 0},
+/* 42 */ { 4, s_3_42, -1, 7, 0}
+};
+
+static symbol s_4_0[3] = { 'i', 'r', 'a' };
+static symbol s_4_1[2] = { 'i', 'e' };
+static symbol s_4_2[4] = { 'i', 's', 's', 'e' };
+static symbol s_4_3[7] = { 'i', 's', 's', 'a', 'n', 't', 'e' };
+static symbol s_4_4[1] = { 'i' };
+static symbol s_4_5[4] = { 'i', 'r', 'a', 'i' };
+static symbol s_4_6[2] = { 'i', 'r' };
+static symbol s_4_7[4] = { 'i', 'r', 'a', 's' };
+static symbol s_4_8[3] = { 'i', 'e', 's' };
+static symbol s_4_9[5] = { 0xC3, 0xAE, 'm', 'e', 's' };
+static symbol s_4_10[5] = { 'i', 's', 's', 'e', 's' };
+static symbol s_4_11[8] = { 'i', 's', 's', 'a', 'n', 't', 'e', 's' };
+static symbol s_4_12[5] = { 0xC3, 0xAE, 't', 'e', 's' };
+static symbol s_4_13[2] = { 'i', 's' };
+static symbol s_4_14[5] = { 'i', 'r', 'a', 'i', 's' };
+static symbol s_4_15[6] = { 'i', 's', 's', 'a', 'i', 's' };
+static symbol s_4_16[6] = { 'i', 'r', 'i', 'o', 'n', 's' };
+static symbol s_4_17[7] = { 'i', 's', 's', 'i', 'o', 'n', 's' };
+static symbol s_4_18[5] = { 'i', 'r', 'o', 'n', 's' };
+static symbol s_4_19[6] = { 'i', 's', 's', 'o', 'n', 's' };
+static symbol s_4_20[7] = { 'i', 's', 's', 'a', 'n', 't', 's' };
+static symbol s_4_21[2] = { 'i', 't' };
+static symbol s_4_22[5] = { 'i', 'r', 'a', 'i', 't' };
+static symbol s_4_23[6] = { 'i', 's', 's', 'a', 'i', 't' };
+static symbol s_4_24[6] = { 'i', 's', 's', 'a', 'n', 't' };
+static symbol s_4_25[7] = { 'i', 'r', 'a', 'I', 'e', 'n', 't' };
+static symbol s_4_26[8] = { 'i', 's', 's', 'a', 'I', 'e', 'n', 't' };
+static symbol s_4_27[5] = { 'i', 'r', 'e', 'n', 't' };
+static symbol s_4_28[6] = { 'i', 's', 's', 'e', 'n', 't' };
+static symbol s_4_29[5] = { 'i', 'r', 'o', 'n', 't' };
+static symbol s_4_30[3] = { 0xC3, 0xAE, 't' };
+static symbol s_4_31[5] = { 'i', 'r', 'i', 'e', 'z' };
+static symbol s_4_32[6] = { 'i', 's', 's', 'i', 'e', 'z' };
+static symbol s_4_33[4] = { 'i', 'r', 'e', 'z' };
+static symbol s_4_34[5] = { 'i', 's', 's', 'e', 'z' };
+
+static struct among a_4[35] =
+{
+/*  0 */ { 3, s_4_0, -1, 1, 0},
+/*  1 */ { 2, s_4_1, -1, 1, 0},
+/*  2 */ { 4, s_4_2, -1, 1, 0},
+/*  3 */ { 7, s_4_3, -1, 1, 0},
+/*  4 */ { 1, s_4_4, -1, 1, 0},
+/*  5 */ { 4, s_4_5, 4, 1, 0},
+/*  6 */ { 2, s_4_6, -1, 1, 0},
+/*  7 */ { 4, s_4_7, -1, 1, 0},
+/*  8 */ { 3, s_4_8, -1, 1, 0},
+/*  9 */ { 5, s_4_9, -1, 1, 0},
+/* 10 */ { 5, s_4_10, -1, 1, 0},
+/* 11 */ { 8, s_4_11, -1, 1, 0},
+/* 12 */ { 5, s_4_12, -1, 1, 0},
+/* 13 */ { 2, s_4_13, -1, 1, 0},
+/* 14 */ { 5, s_4_14, 13, 1, 0},
+/* 15 */ { 6, s_4_15, 13, 1, 0},
+/* 16 */ { 6, s_4_16, -1, 1, 0},
+/* 17 */ { 7, s_4_17, -1, 1, 0},
+/* 18 */ { 5, s_4_18, -1, 1, 0},
+/* 19 */ { 6, s_4_19, -1, 1, 0},
+/* 20 */ { 7, s_4_20, -1, 1, 0},
+/* 21 */ { 2, s_4_21, -1, 1, 0},
+/* 22 */ { 5, s_4_22, 21, 1, 0},
+/* 23 */ { 6, s_4_23, 21, 1, 0},
+/* 24 */ { 6, s_4_24, -1, 1, 0},
+/* 25 */ { 7, s_4_25, -1, 1, 0},
+/* 26 */ { 8, s_4_26, -1, 1, 0},
+/* 27 */ { 5, s_4_27, -1, 1, 0},
+/* 28 */ { 6, s_4_28, -1, 1, 0},
+/* 29 */ { 5, s_4_29, -1, 1, 0},
+/* 30 */ { 3, s_4_30, -1, 1, 0},
+/* 31 */ { 5, s_4_31, -1, 1, 0},
+/* 32 */ { 6, s_4_32, -1, 1, 0},
+/* 33 */ { 4, s_4_33, -1, 1, 0},
+/* 34 */ { 5, s_4_34, -1, 1, 0}
+};
+
+static symbol s_5_0[1] = { 'a' };
+static symbol s_5_1[3] = { 'e', 'r', 'a' };
+static symbol s_5_2[4] = { 'a', 's', 's', 'e' };
+static symbol s_5_3[4] = { 'a', 'n', 't', 'e' };
+static symbol s_5_4[3] = { 0xC3, 0xA9, 'e' };
+static symbol s_5_5[2] = { 'a', 'i' };
+static symbol s_5_6[4] = { 'e', 'r', 'a', 'i' };
+static symbol s_5_7[2] = { 'e', 'r' };
+static symbol s_5_8[2] = { 'a', 's' };
+static symbol s_5_9[4] = { 'e', 'r', 'a', 's' };
+static symbol s_5_10[5] = { 0xC3, 0xA2, 'm', 'e', 's' };
+static symbol s_5_11[5] = { 'a', 's', 's', 'e', 's' };
+static symbol s_5_12[5] = { 'a', 'n', 't', 'e', 's' };
+static symbol s_5_13[5] = { 0xC3, 0xA2, 't', 'e', 's' };
+static symbol s_5_14[4] = { 0xC3, 0xA9, 'e', 's' };
+static symbol s_5_15[3] = { 'a', 'i', 's' };
+static symbol s_5_16[5] = { 'e', 'r', 'a', 'i', 's' };
+static symbol s_5_17[4] = { 'i', 'o', 'n', 's' };
+static symbol s_5_18[6] = { 'e', 'r', 'i', 'o', 'n', 's' };
+static symbol s_5_19[7] = { 'a', 's', 's', 'i', 'o', 'n', 's' };
+static symbol s_5_20[5] = { 'e', 'r', 'o', 'n', 's' };
+static symbol s_5_21[4] = { 'a', 'n', 't', 's' };
+static symbol s_5_22[3] = { 0xC3, 0xA9, 's' };
+static symbol s_5_23[3] = { 'a', 'i', 't' };
+static symbol s_5_24[5] = { 'e', 'r', 'a', 'i', 't' };
+static symbol s_5_25[3] = { 'a', 'n', 't' };
+static symbol s_5_26[5] = { 'a', 'I', 'e', 'n', 't' };
+static symbol s_5_27[7] = { 'e', 'r', 'a', 'I', 'e', 'n', 't' };
+static symbol s_5_28[6] = { 0xC3, 0xA8, 'r', 'e', 'n', 't' };
+static symbol s_5_29[6] = { 'a', 's', 's', 'e', 'n', 't' };
+static symbol s_5_30[5] = { 'e', 'r', 'o', 'n', 't' };
+static symbol s_5_31[3] = { 0xC3, 0xA2, 't' };
+static symbol s_5_32[2] = { 'e', 'z' };
+static symbol s_5_33[3] = { 'i', 'e', 'z' };
+static symbol s_5_34[5] = { 'e', 'r', 'i', 'e', 'z' };
+static symbol s_5_35[6] = { 'a', 's', 's', 'i', 'e', 'z' };
+static symbol s_5_36[4] = { 'e', 'r', 'e', 'z' };
+static symbol s_5_37[2] = { 0xC3, 0xA9 };
+
+static struct among a_5[38] =
+{
+/*  0 */ { 1, s_5_0, -1, 3, 0},
+/*  1 */ { 3, s_5_1, 0, 2, 0},
+/*  2 */ { 4, s_5_2, -1, 3, 0},
+/*  3 */ { 4, s_5_3, -1, 3, 0},
+/*  4 */ { 3, s_5_4, -1, 2, 0},
+/*  5 */ { 2, s_5_5, -1, 3, 0},
+/*  6 */ { 4, s_5_6, 5, 2, 0},
+/*  7 */ { 2, s_5_7, -1, 2, 0},
+/*  8 */ { 2, s_5_8, -1, 3, 0},
+/*  9 */ { 4, s_5_9, 8, 2, 0},
+/* 10 */ { 5, s_5_10, -1, 3, 0},
+/* 11 */ { 5, s_5_11, -1, 3, 0},
+/* 12 */ { 5, s_5_12, -1, 3, 0},
+/* 13 */ { 5, s_5_13, -1, 3, 0},
+/* 14 */ { 4, s_5_14, -1, 2, 0},
+/* 15 */ { 3, s_5_15, -1, 3, 0},
+/* 16 */ { 5, s_5_16, 15, 2, 0},
+/* 17 */ { 4, s_5_17, -1, 1, 0},
+/* 18 */ { 6, s_5_18, 17, 2, 0},
+/* 19 */ { 7, s_5_19, 17, 3, 0},
+/* 20 */ { 5, s_5_20, -1, 2, 0},
+/* 21 */ { 4, s_5_21, -1, 3, 0},
+/* 22 */ { 3, s_5_22, -1, 2, 0},
+/* 23 */ { 3, s_5_23, -1, 3, 0},
+/* 24 */ { 5, s_5_24, 23, 2, 0},
+/* 25 */ { 3, s_5_25, -1, 3, 0},
+/* 26 */ { 5, s_5_26, -1, 3, 0},
+/* 27 */ { 7, s_5_27, 26, 2, 0},
+/* 28 */ { 6, s_5_28, -1, 2, 0},
+/* 29 */ { 6, s_5_29, -1, 3, 0},
+/* 30 */ { 5, s_5_30, -1, 2, 0},
+/* 31 */ { 3, s_5_31, -1, 3, 0},
+/* 32 */ { 2, s_5_32, -1, 2, 0},
+/* 33 */ { 3, s_5_33, 32, 2, 0},
+/* 34 */ { 5, s_5_34, 33, 2, 0},
+/* 35 */ { 6, s_5_35, 33, 3, 0},
+/* 36 */ { 4, s_5_36, 32, 2, 0},
+/* 37 */ { 2, s_5_37, -1, 2, 0}
+};
+
+static symbol s_6_0[1] = { 'e' };
+static symbol s_6_1[5] = { 'I', 0xC3, 0xA8, 'r', 'e' };
+static symbol s_6_2[5] = { 'i', 0xC3, 0xA8, 'r', 'e' };
+static symbol s_6_3[3] = { 'i', 'o', 'n' };
+static symbol s_6_4[3] = { 'I', 'e', 'r' };
+static symbol s_6_5[3] = { 'i', 'e', 'r' };
+static symbol s_6_6[2] = { 0xC3, 0xAB };
+
+static struct among a_6[7] =
+{
+/*  0 */ { 1, s_6_0, -1, 3, 0},
+/*  1 */ { 5, s_6_1, 0, 2, 0},
+/*  2 */ { 5, s_6_2, 0, 2, 0},
+/*  3 */ { 3, s_6_3, -1, 1, 0},
+/*  4 */ { 3, s_6_4, -1, 2, 0},
+/*  5 */ { 3, s_6_5, -1, 2, 0},
+/*  6 */ { 2, s_6_6, -1, 4, 0}
+};
+
+static symbol s_7_0[3] = { 'e', 'l', 'l' };
+static symbol s_7_1[4] = { 'e', 'i', 'l', 'l' };
+static symbol s_7_2[3] = { 'e', 'n', 'n' };
+static symbol s_7_3[3] = { 'o', 'n', 'n' };
+static symbol s_7_4[3] = { 'e', 't', 't' };
+
+static struct among a_7[5] =
+{
+/*  0 */ { 3, s_7_0, -1, -1, 0},
+/*  1 */ { 4, s_7_1, -1, -1, 0},
+/*  2 */ { 3, s_7_2, -1, -1, 0},
+/*  3 */ { 3, s_7_3, -1, -1, 0},
+/*  4 */ { 3, s_7_4, -1, -1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 130, 103, 8, 5 };
+
+static unsigned char g_keep_with_s[] = { 1, 65, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
+
+static symbol s_0[] = { 'u' };
+static symbol s_1[] = { 'U' };
+static symbol s_2[] = { 'i' };
+static symbol s_3[] = { 'I' };
+static symbol s_4[] = { 'y' };
+static symbol s_5[] = { 'Y' };
+static symbol s_6[] = { 'y' };
+static symbol s_7[] = { 'Y' };
+static symbol s_8[] = { 'q' };
+static symbol s_9[] = { 'u' };
+static symbol s_10[] = { 'U' };
+static symbol s_11[] = { 'i' };
+static symbol s_12[] = { 'u' };
+static symbol s_13[] = { 'y' };
+static symbol s_14[] = { 'i', 'c' };
+static symbol s_15[] = { 'i', 'q', 'U' };
+static symbol s_16[] = { 'l', 'o', 'g' };
+static symbol s_17[] = { 'u' };
+static symbol s_18[] = { 'e', 'n', 't' };
+static symbol s_19[] = { 'a', 't' };
+static symbol s_20[] = { 'e', 'u', 'x' };
+static symbol s_21[] = { 'i' };
+static symbol s_22[] = { 'a', 'b', 'l' };
+static symbol s_23[] = { 'i', 'q', 'U' };
+static symbol s_24[] = { 'a', 't' };
+static symbol s_25[] = { 'i', 'c' };
+static symbol s_26[] = { 'i', 'q', 'U' };
+static symbol s_27[] = { 'e', 'a', 'u' };
+static symbol s_28[] = { 'a', 'l' };
+static symbol s_29[] = { 'e', 'u', 'x' };
+static symbol s_30[] = { 'a', 'n', 't' };
+static symbol s_31[] = { 'e', 'n', 't' };
+static symbol s_32[] = { 'e' };
+static symbol s_33[] = { 's' };
+static symbol s_34[] = { 's' };
+static symbol s_35[] = { 't' };
+static symbol s_36[] = { 'i' };
+static symbol s_37[] = { 'g', 'u' };
+static symbol s_38[] = { 0xC3, 0xA9 };
+static symbol s_39[] = { 0xC3, 0xA8 };
+static symbol s_40[] = { 'e' };
+static symbol s_41[] = { 'Y' };
+static symbol s_42[] = { 'i' };
+static symbol s_43[] = { 0xC3, 0xA7 };
+static symbol s_44[] = { 'c' };
+
+static int r_prelude(struct SN_env * z) {
+    while(1) { /* repeat, line 38 */
+        int c = z->c;
+        while(1) { /* goto, line 38 */
+            int c = z->c;
+            {   int c = z->c; /* or, line 44 */
+                if (!(in_grouping_U(z, g_v, 97, 251))) goto lab3;
+                z->bra = z->c; /* [, line 40 */
+                {   int c = z->c; /* or, line 40 */
+                    if (!(eq_s(z, 1, s_0))) goto lab5;
+                    z->ket = z->c; /* ], line 40 */
+                    if (!(in_grouping_U(z, g_v, 97, 251))) goto lab5;
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_1); /* <-, line 40 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab4;
+                lab5:
+                    z->c = c;
+                    if (!(eq_s(z, 1, s_2))) goto lab6;
+                    z->ket = z->c; /* ], line 41 */
+                    if (!(in_grouping_U(z, g_v, 97, 251))) goto lab6;
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_3); /* <-, line 41 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab4;
+                lab6:
+                    z->c = c;
+                    if (!(eq_s(z, 1, s_4))) goto lab3;
+                    z->ket = z->c; /* ], line 42 */
+                    {   int ret;
+                        ret = slice_from_s(z, 1, s_5); /* <-, line 42 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab4:
+                goto lab2;
+            lab3:
+                z->c = c;
+                z->bra = z->c; /* [, line 45 */
+                if (!(eq_s(z, 1, s_6))) goto lab7;
+                z->ket = z->c; /* ], line 45 */
+                if (!(in_grouping_U(z, g_v, 97, 251))) goto lab7;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_7); /* <-, line 45 */
+                    if (ret < 0) return ret;
+                }
+                goto lab2;
+            lab7:
+                z->c = c;
+                if (!(eq_s(z, 1, s_8))) goto lab1;
+                z->bra = z->c; /* [, line 47 */
+                if (!(eq_s(z, 1, s_9))) goto lab1;
+                z->ket = z->c; /* ], line 47 */
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_10); /* <-, line 47 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab2:
+            z->c = c;
+            break;
+        lab1:
+            z->c = c;
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab0;
+                z->c = c; /* goto, line 38 */
+            }
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    z->I[2] = z->l;
+    {   int c = z->c; /* do, line 56 */
+        {   int c = z->c; /* or, line 57 */
+            if (!(in_grouping_U(z, g_v, 97, 251))) goto lab2;
+            if (!(in_grouping_U(z, g_v, 97, 251))) goto lab2;
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab2;
+                z->c = c; /* next, line 57 */
+            }
+            goto lab1;
+        lab2:
+            z->c = c;
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab0;
+                z->c = c; /* next, line 57 */
+            }
+            while(1) { /* gopast, line 57 */
+                if (!(in_grouping_U(z, g_v, 97, 251))) goto lab3;
+                break;
+            lab3:
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* gopast, line 57 */
+                }
+            }
+        }
+    lab1:
+        z->I[0] = z->c; /* setmark pV, line 58 */
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 60 */
+        while(1) { /* gopast, line 61 */
+            if (!(in_grouping_U(z, g_v, 97, 251))) goto lab5;
+            break;
+        lab5:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab4;
+                z->c = c; /* gopast, line 61 */
+            }
+        }
+        while(1) { /* gopast, line 61 */
+            if (!(out_grouping_U(z, g_v, 97, 251))) goto lab6;
+            break;
+        lab6:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab4;
+                z->c = c; /* gopast, line 61 */
+            }
+        }
+        z->I[1] = z->c; /* setmark p1, line 61 */
+        while(1) { /* gopast, line 62 */
+            if (!(in_grouping_U(z, g_v, 97, 251))) goto lab7;
+            break;
+        lab7:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab4;
+                z->c = c; /* gopast, line 62 */
+            }
+        }
+        while(1) { /* gopast, line 62 */
+            if (!(out_grouping_U(z, g_v, 97, 251))) goto lab8;
+            break;
+        lab8:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab4;
+                z->c = c; /* gopast, line 62 */
+            }
+        }
+        z->I[2] = z->c; /* setmark p2, line 62 */
+    lab4:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 66 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 68 */
+        among_var = find_among(z, a_0, 4); /* substring, line 68 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 68 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_11); /* <-, line 69 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_12); /* <-, line 70 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_13); /* <-, line 71 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 4:
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 72 */
+                }
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_RV(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[2] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 83 */
+    among_var = find_among_b(z, a_3, 43); /* substring, line 83 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 83 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 87 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 87 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 90 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 90 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 91 */
+                z->ket = z->c; /* [, line 91 */
+                if (!(eq_s_b(z, 2, s_14))) { z->c = z->l - m; goto lab0; }
+                z->bra = z->c; /* ], line 91 */
+                {   int m = z->l - z->c; (void) m; /* or, line 91 */
+                    {   int ret = r_R2(z);
+                        if (ret == 0) goto lab2; /* call R2, line 91 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 91 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab1;
+                lab2:
+                    z->c = z->l - m;
+                    {   int ret;
+                        ret = slice_from_s(z, 3, s_15); /* <-, line 91 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab1:
+            lab0:
+                ;
+            }
+            break;
+        case 3:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 95 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_16); /* <-, line 95 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 98 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_17); /* <-, line 98 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 101 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_18); /* <-, line 101 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 105 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 105 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 106 */
+                z->ket = z->c; /* [, line 107 */
+                among_var = find_among_b(z, a_1, 6); /* substring, line 107 */
+                if (!(among_var)) { z->c = z->l - m; goto lab3; }
+                z->bra = z->c; /* ], line 107 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab3; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 108 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 108 */
+                            if (ret < 0) return ret;
+                        }
+                        z->ket = z->c; /* [, line 108 */
+                        if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m; goto lab3; }
+                        z->bra = z->c; /* ], line 108 */
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 108 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 108 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                    case 2:
+                        {   int m = z->l - z->c; (void) m; /* or, line 109 */
+                            {   int ret = r_R2(z);
+                                if (ret == 0) goto lab5; /* call R2, line 109 */
+                                if (ret < 0) return ret;
+                            }
+                            {   int ret;
+                                ret = slice_del(z); /* delete, line 109 */
+                                if (ret < 0) return ret;
+                            }
+                            goto lab4;
+                        lab5:
+                            z->c = z->l - m;
+                            {   int ret = r_R1(z);
+                                if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R1, line 109 */
+                                if (ret < 0) return ret;
+                            }
+                            {   int ret;
+                                ret = slice_from_s(z, 3, s_20); /* <-, line 109 */
+                                if (ret < 0) return ret;
+                            }
+                        }
+                    lab4:
+                        break;
+                    case 3:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 111 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 111 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                    case 4:
+                        {   int ret = r_RV(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab3; } /* call RV, line 113 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_from_s(z, 1, s_21); /* <-, line 113 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab3:
+                ;
+            }
+            break;
+        case 7:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 120 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 120 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 121 */
+                z->ket = z->c; /* [, line 122 */
+                among_var = find_among_b(z, a_2, 3); /* substring, line 122 */
+                if (!(among_var)) { z->c = z->l - m; goto lab6; }
+                z->bra = z->c; /* ], line 122 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab6; }
+                    case 1:
+                        {   int m = z->l - z->c; (void) m; /* or, line 123 */
+                            {   int ret = r_R2(z);
+                                if (ret == 0) goto lab8; /* call R2, line 123 */
+                                if (ret < 0) return ret;
+                            }
+                            {   int ret;
+                                ret = slice_del(z); /* delete, line 123 */
+                                if (ret < 0) return ret;
+                            }
+                            goto lab7;
+                        lab8:
+                            z->c = z->l - m;
+                            {   int ret;
+                                ret = slice_from_s(z, 3, s_22); /* <-, line 123 */
+                                if (ret < 0) return ret;
+                            }
+                        }
+                    lab7:
+                        break;
+                    case 2:
+                        {   int m = z->l - z->c; (void) m; /* or, line 124 */
+                            {   int ret = r_R2(z);
+                                if (ret == 0) goto lab10; /* call R2, line 124 */
+                                if (ret < 0) return ret;
+                            }
+                            {   int ret;
+                                ret = slice_del(z); /* delete, line 124 */
+                                if (ret < 0) return ret;
+                            }
+                            goto lab9;
+                        lab10:
+                            z->c = z->l - m;
+                            {   int ret;
+                                ret = slice_from_s(z, 3, s_23); /* <-, line 124 */
+                                if (ret < 0) return ret;
+                            }
+                        }
+                    lab9:
+                        break;
+                    case 3:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab6; } /* call R2, line 125 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 125 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab6:
+                ;
+            }
+            break;
+        case 8:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 132 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 132 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 133 */
+                z->ket = z->c; /* [, line 133 */
+                if (!(eq_s_b(z, 2, s_24))) { z->c = z->l - m; goto lab11; }
+                z->bra = z->c; /* ], line 133 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab11; } /* call R2, line 133 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 133 */
+                    if (ret < 0) return ret;
+                }
+                z->ket = z->c; /* [, line 133 */
+                if (!(eq_s_b(z, 2, s_25))) { z->c = z->l - m; goto lab11; }
+                z->bra = z->c; /* ], line 133 */
+                {   int m = z->l - z->c; (void) m; /* or, line 133 */
+                    {   int ret = r_R2(z);
+                        if (ret == 0) goto lab13; /* call R2, line 133 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 133 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab12;
+                lab13:
+                    z->c = z->l - m;
+                    {   int ret;
+                        ret = slice_from_s(z, 3, s_26); /* <-, line 133 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab12:
+            lab11:
+                ;
+            }
+            break;
+        case 9:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_27); /* <-, line 135 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 10:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 136 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 2, s_28); /* <-, line 136 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 11:
+            {   int m = z->l - z->c; (void) m; /* or, line 138 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) goto lab15; /* call R2, line 138 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 138 */
+                    if (ret < 0) return ret;
+                }
+                goto lab14;
+            lab15:
+                z->c = z->l - m;
+                {   int ret = r_R1(z);
+                    if (ret == 0) return 0; /* call R1, line 138 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_from_s(z, 3, s_29); /* <-, line 138 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab14:
+            break;
+        case 12:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 141 */
+                if (ret < 0) return ret;
+            }
+            if (!(out_grouping_b_U(z, g_v, 97, 251))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 141 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 13:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 146 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_30); /* <-, line 146 */
+                if (ret < 0) return ret;
+            }
+            return 0; /* fail, line 146 */
+            break;
+        case 14:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 147 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_31); /* <-, line 147 */
+                if (ret < 0) return ret;
+            }
+            return 0; /* fail, line 147 */
+            break;
+        case 15:
+            {   int m_test = z->l - z->c; /* test, line 149 */
+                if (!(in_grouping_b_U(z, g_v, 97, 251))) return 0;
+                {   int ret = r_RV(z);
+                    if (ret == 0) return 0; /* call RV, line 149 */
+                    if (ret < 0) return ret;
+                }
+                z->c = z->l - m_test;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 149 */
+                if (ret < 0) return ret;
+            }
+            return 0; /* fail, line 149 */
+            break;
+    }
+    return 1;
+}
+
+static int r_i_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 154 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 154 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 155 */
+        among_var = find_among_b(z, a_4, 35); /* substring, line 155 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 155 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                if (!(out_grouping_b_U(z, g_v, 97, 251))) { z->lb = m3; return 0; }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 161 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 165 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 165 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 166 */
+        among_var = find_among_b(z, a_5, 38); /* substring, line 166 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 166 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->lb = m3; return 0; } /* call R2, line 168 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 168 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 176 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 181 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* try, line 182 */
+                    z->ket = z->c; /* [, line 182 */
+                    if (!(eq_s_b(z, 1, s_32))) { z->c = z->l - m; goto lab0; }
+                    z->bra = z->c; /* ], line 182 */
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 182 */
+                        if (ret < 0) return ret;
+                    }
+                lab0:
+                    ;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_residual_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m = z->l - z->c; (void) m; /* try, line 190 */
+        z->ket = z->c; /* [, line 190 */
+        if (!(eq_s_b(z, 1, s_33))) { z->c = z->l - m; goto lab0; }
+        z->bra = z->c; /* ], line 190 */
+        {   int m_test = z->l - z->c; /* test, line 190 */
+            if (!(out_grouping_b_U(z, g_keep_with_s, 97, 232))) { z->c = z->l - m; goto lab0; }
+            z->c = z->l - m_test;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 190 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        ;
+    }
+    {   int m3; /* setlimit, line 191 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 191 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 192 */
+        among_var = find_among_b(z, a_6, 7); /* substring, line 192 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 192 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->lb = m3; return 0; } /* call R2, line 193 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* or, line 193 */
+                    if (!(eq_s_b(z, 1, s_34))) goto lab2;
+                    goto lab1;
+                lab2:
+                    z->c = z->l - m;
+                    if (!(eq_s_b(z, 1, s_35))) { z->lb = m3; return 0; }
+                }
+            lab1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 193 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_36); /* <-, line 195 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 196 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 4:
+                if (!(eq_s_b(z, 2, s_37))) { z->lb = m3; return 0; }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 197 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_un_double(struct SN_env * z) {
+    {   int m_test = z->l - z->c; /* test, line 203 */
+        if (!(find_among_b(z, a_7, 5))) return 0; /* among, line 203 */
+        z->c = z->l - m_test;
+    }
+    z->ket = z->c; /* [, line 203 */
+    {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+        if (c < 0) return 0;
+        z->c = c; /* next, line 203 */
+    }
+    z->bra = z->c; /* ], line 203 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 203 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_un_accent(struct SN_env * z) {
+    {   int i = 1;
+        while(1) { /* atleast, line 207 */
+            if (!(out_grouping_b_U(z, g_v, 97, 251))) goto lab0;
+            i--;
+            continue;
+        lab0:
+            break;
+        }
+        if (i > 0) return 0;
+    }
+    z->ket = z->c; /* [, line 208 */
+    {   int m = z->l - z->c; (void) m; /* or, line 208 */
+        if (!(eq_s_b(z, 2, s_38))) goto lab2;
+        goto lab1;
+    lab2:
+        z->c = z->l - m;
+        if (!(eq_s_b(z, 2, s_39))) return 0;
+    }
+lab1:
+    z->bra = z->c; /* ], line 208 */
+    {   int ret;
+        ret = slice_from_s(z, 1, s_40); /* <-, line 208 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+extern int french_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 214 */
+        {   int ret = r_prelude(z);
+            if (ret == 0) goto lab0; /* call prelude, line 214 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 215 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab1; /* call mark_regions, line 215 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 216 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 218 */
+        {   int m = z->l - z->c; (void) m; /* or, line 228 */
+            {   int m = z->l - z->c; (void) m; /* and, line 224 */
+                {   int m = z->l - z->c; (void) m; /* or, line 220 */
+                    {   int ret = r_standard_suffix(z);
+                        if (ret == 0) goto lab6; /* call standard_suffix, line 220 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab6:
+                    z->c = z->l - m;
+                    {   int ret = r_i_verb_suffix(z);
+                        if (ret == 0) goto lab7; /* call i_verb_suffix, line 221 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab7:
+                    z->c = z->l - m;
+                    {   int ret = r_verb_suffix(z);
+                        if (ret == 0) goto lab4; /* call verb_suffix, line 222 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab5:
+                z->c = z->l - m;
+                {   int m = z->l - z->c; (void) m; /* try, line 225 */
+                    z->ket = z->c; /* [, line 225 */
+                    {   int m = z->l - z->c; (void) m; /* or, line 225 */
+                        if (!(eq_s_b(z, 1, s_41))) goto lab10;
+                        z->bra = z->c; /* ], line 225 */
+                        {   int ret;
+                            ret = slice_from_s(z, 1, s_42); /* <-, line 225 */
+                            if (ret < 0) return ret;
+                        }
+                        goto lab9;
+                    lab10:
+                        z->c = z->l - m;
+                        if (!(eq_s_b(z, 2, s_43))) { z->c = z->l - m; goto lab8; }
+                        z->bra = z->c; /* ], line 226 */
+                        {   int ret;
+                            ret = slice_from_s(z, 1, s_44); /* <-, line 226 */
+                            if (ret < 0) return ret;
+                        }
+                    }
+                lab9:
+                lab8:
+                    ;
+                }
+            }
+            goto lab3;
+        lab4:
+            z->c = z->l - m;
+            {   int ret = r_residual_suffix(z);
+                if (ret == 0) goto lab2; /* call residual_suffix, line 229 */
+                if (ret < 0) return ret;
+            }
+        }
+    lab3:
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 234 */
+        {   int ret = r_un_double(z);
+            if (ret == 0) goto lab11; /* call un_double, line 234 */
+            if (ret < 0) return ret;
+        }
+    lab11:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 235 */
+        {   int ret = r_un_accent(z);
+            if (ret == 0) goto lab12; /* call un_accent, line 235 */
+            if (ret < 0) return ret;
+        }
+    lab12:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 237 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab13; /* call postlude, line 237 */
+            if (ret < 0) return ret;
+        }
+    lab13:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * french_UTF_8_create_env(void) { return SN_create_env(0, 3, 0); }
+
+extern void french_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_french.h b/libstemmer_c/src_c/stem_UTF_8_french.h
new file mode 100644
index 0000000..08e3418
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_french.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * french_UTF_8_create_env(void);
+extern void french_UTF_8_close_env(struct SN_env * z);
+
+extern int french_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_german.c b/libstemmer_c/src_c/stem_UTF_8_german.c
new file mode 100644
index 0000000..d66a137
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_german.c
@@ -0,0 +1,526 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int german_UTF_8_stem(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * german_UTF_8_create_env(void);
+extern void german_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_1[1] = { 'U' };
+static symbol s_0_2[1] = { 'Y' };
+static symbol s_0_3[2] = { 0xC3, 0xA4 };
+static symbol s_0_4[2] = { 0xC3, 0xB6 };
+static symbol s_0_5[2] = { 0xC3, 0xBC };
+
+static struct among a_0[6] =
+{
+/*  0 */ { 0, 0, -1, 6, 0},
+/*  1 */ { 1, s_0_1, 0, 2, 0},
+/*  2 */ { 1, s_0_2, 0, 1, 0},
+/*  3 */ { 2, s_0_3, 0, 3, 0},
+/*  4 */ { 2, s_0_4, 0, 4, 0},
+/*  5 */ { 2, s_0_5, 0, 5, 0}
+};
+
+static symbol s_1_0[1] = { 'e' };
+static symbol s_1_1[2] = { 'e', 'm' };
+static symbol s_1_2[2] = { 'e', 'n' };
+static symbol s_1_3[3] = { 'e', 'r', 'n' };
+static symbol s_1_4[2] = { 'e', 'r' };
+static symbol s_1_5[1] = { 's' };
+static symbol s_1_6[2] = { 'e', 's' };
+
+static struct among a_1[7] =
+{
+/*  0 */ { 1, s_1_0, -1, 1, 0},
+/*  1 */ { 2, s_1_1, -1, 1, 0},
+/*  2 */ { 2, s_1_2, -1, 1, 0},
+/*  3 */ { 3, s_1_3, -1, 1, 0},
+/*  4 */ { 2, s_1_4, -1, 1, 0},
+/*  5 */ { 1, s_1_5, -1, 2, 0},
+/*  6 */ { 2, s_1_6, 5, 1, 0}
+};
+
+static symbol s_2_0[2] = { 'e', 'n' };
+static symbol s_2_1[2] = { 'e', 'r' };
+static symbol s_2_2[2] = { 's', 't' };
+static symbol s_2_3[3] = { 'e', 's', 't' };
+
+static struct among a_2[4] =
+{
+/*  0 */ { 2, s_2_0, -1, 1, 0},
+/*  1 */ { 2, s_2_1, -1, 1, 0},
+/*  2 */ { 2, s_2_2, -1, 2, 0},
+/*  3 */ { 3, s_2_3, 2, 1, 0}
+};
+
+static symbol s_3_0[2] = { 'i', 'g' };
+static symbol s_3_1[4] = { 'l', 'i', 'c', 'h' };
+
+static struct among a_3[2] =
+{
+/*  0 */ { 2, s_3_0, -1, 1, 0},
+/*  1 */ { 4, s_3_1, -1, 1, 0}
+};
+
+static symbol s_4_0[3] = { 'e', 'n', 'd' };
+static symbol s_4_1[2] = { 'i', 'g' };
+static symbol s_4_2[3] = { 'u', 'n', 'g' };
+static symbol s_4_3[4] = { 'l', 'i', 'c', 'h' };
+static symbol s_4_4[4] = { 'i', 's', 'c', 'h' };
+static symbol s_4_5[2] = { 'i', 'k' };
+static symbol s_4_6[4] = { 'h', 'e', 'i', 't' };
+static symbol s_4_7[4] = { 'k', 'e', 'i', 't' };
+
+static struct among a_4[8] =
+{
+/*  0 */ { 3, s_4_0, -1, 1, 0},
+/*  1 */ { 2, s_4_1, -1, 2, 0},
+/*  2 */ { 3, s_4_2, -1, 1, 0},
+/*  3 */ { 4, s_4_3, -1, 3, 0},
+/*  4 */ { 4, s_4_4, -1, 2, 0},
+/*  5 */ { 2, s_4_5, -1, 2, 0},
+/*  6 */ { 4, s_4_6, -1, 3, 0},
+/*  7 */ { 4, s_4_7, -1, 4, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32, 8 };
+
+static unsigned char g_s_ending[] = { 117, 30, 5 };
+
+static unsigned char g_st_ending[] = { 117, 30, 4 };
+
+static symbol s_0[] = { 0xC3, 0x9F };
+static symbol s_1[] = { 's', 's' };
+static symbol s_2[] = { 'u' };
+static symbol s_3[] = { 'U' };
+static symbol s_4[] = { 'y' };
+static symbol s_5[] = { 'Y' };
+static symbol s_6[] = { 'y' };
+static symbol s_7[] = { 'u' };
+static symbol s_8[] = { 'a' };
+static symbol s_9[] = { 'o' };
+static symbol s_10[] = { 'u' };
+static symbol s_11[] = { 'i', 'g' };
+static symbol s_12[] = { 'e' };
+static symbol s_13[] = { 'e' };
+static symbol s_14[] = { 'e', 'r' };
+static symbol s_15[] = { 'e', 'n' };
+
+static int r_prelude(struct SN_env * z) {
+    {   int c_test = z->c; /* test, line 30 */
+        while(1) { /* repeat, line 30 */
+            int c = z->c;
+            {   int c = z->c; /* or, line 33 */
+                z->bra = z->c; /* [, line 32 */
+                if (!(eq_s(z, 2, s_0))) goto lab2;
+                z->ket = z->c; /* ], line 32 */
+                {   int ret;
+                    ret = slice_from_s(z, 2, s_1); /* <-, line 32 */
+                    if (ret < 0) return ret;
+                }
+                goto lab1;
+            lab2:
+                z->c = c;
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 33 */
+                }
+            }
+        lab1:
+            continue;
+        lab0:
+            z->c = c;
+            break;
+        }
+        z->c = c_test;
+    }
+    while(1) { /* repeat, line 36 */
+        int c = z->c;
+        while(1) { /* goto, line 36 */
+            int c = z->c;
+            if (!(in_grouping_U(z, g_v, 97, 252))) goto lab4;
+            z->bra = z->c; /* [, line 37 */
+            {   int c = z->c; /* or, line 37 */
+                if (!(eq_s(z, 1, s_2))) goto lab6;
+                z->ket = z->c; /* ], line 37 */
+                if (!(in_grouping_U(z, g_v, 97, 252))) goto lab6;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_3); /* <-, line 37 */
+                    if (ret < 0) return ret;
+                }
+                goto lab5;
+            lab6:
+                z->c = c;
+                if (!(eq_s(z, 1, s_4))) goto lab4;
+                z->ket = z->c; /* ], line 38 */
+                if (!(in_grouping_U(z, g_v, 97, 252))) goto lab4;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_5); /* <-, line 38 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab5:
+            z->c = c;
+            break;
+        lab4:
+            z->c = c;
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab3;
+                z->c = c; /* goto, line 36 */
+            }
+        }
+        continue;
+    lab3:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    {   int c_test = z->c; /* test, line 47 */
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, + 3);
+            if (c < 0) return 0;
+            z->c = c; /* hop, line 47 */
+        }
+        z->I[2] = z->c; /* setmark x, line 47 */
+        z->c = c_test;
+    }
+    while(1) { /* gopast, line 49 */
+        if (!(in_grouping_U(z, g_v, 97, 252))) goto lab0;
+        break;
+    lab0:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 49 */
+        }
+    }
+    while(1) { /* gopast, line 49 */
+        if (!(out_grouping_U(z, g_v, 97, 252))) goto lab1;
+        break;
+    lab1:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 49 */
+        }
+    }
+    z->I[0] = z->c; /* setmark p1, line 49 */
+     /* try, line 50 */
+    if (!(z->I[0] < z->I[2])) goto lab2;
+    z->I[0] = z->I[2];
+lab2:
+    while(1) { /* gopast, line 51 */
+        if (!(in_grouping_U(z, g_v, 97, 252))) goto lab3;
+        break;
+    lab3:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 51 */
+        }
+    }
+    while(1) { /* gopast, line 51 */
+        if (!(out_grouping_U(z, g_v, 97, 252))) goto lab4;
+        break;
+    lab4:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 51 */
+        }
+    }
+    z->I[1] = z->c; /* setmark p2, line 51 */
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 55 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 57 */
+        among_var = find_among(z, a_0, 6); /* substring, line 57 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 57 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_6); /* <-, line 58 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_7); /* <-, line 59 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_8); /* <-, line 60 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 4:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_9); /* <-, line 61 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 5:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_10); /* <-, line 62 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 6:
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 63 */
+                }
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m = z->l - z->c; (void) m; /* do, line 74 */
+        z->ket = z->c; /* [, line 75 */
+        among_var = find_among_b(z, a_1, 7); /* substring, line 75 */
+        if (!(among_var)) goto lab0;
+        z->bra = z->c; /* ], line 75 */
+        {   int ret = r_R1(z);
+            if (ret == 0) goto lab0; /* call R1, line 75 */
+            if (ret < 0) return ret;
+        }
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 77 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                if (!(in_grouping_b_U(z, g_s_ending, 98, 116))) goto lab0;
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 80 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab0:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 84 */
+        z->ket = z->c; /* [, line 85 */
+        among_var = find_among_b(z, a_2, 4); /* substring, line 85 */
+        if (!(among_var)) goto lab1;
+        z->bra = z->c; /* ], line 85 */
+        {   int ret = r_R1(z);
+            if (ret == 0) goto lab1; /* call R1, line 85 */
+            if (ret < 0) return ret;
+        }
+        switch(among_var) {
+            case 0: goto lab1;
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 87 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                if (!(in_grouping_b_U(z, g_st_ending, 98, 116))) goto lab1;
+                {   int c = skip_utf8(z->p, z->c, z->lb, z->l, - 3);
+                    if (c < 0) goto lab1;
+                    z->c = c; /* hop, line 90 */
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 90 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 94 */
+        z->ket = z->c; /* [, line 95 */
+        among_var = find_among_b(z, a_4, 8); /* substring, line 95 */
+        if (!(among_var)) goto lab2;
+        z->bra = z->c; /* ], line 95 */
+        {   int ret = r_R2(z);
+            if (ret == 0) goto lab2; /* call R2, line 95 */
+            if (ret < 0) return ret;
+        }
+        switch(among_var) {
+            case 0: goto lab2;
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 97 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* try, line 98 */
+                    z->ket = z->c; /* [, line 98 */
+                    if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m; goto lab3; }
+                    z->bra = z->c; /* ], line 98 */
+                    {   int m = z->l - z->c; (void) m; /* not, line 98 */
+                        if (!(eq_s_b(z, 1, s_12))) goto lab4;
+                        { z->c = z->l - m; goto lab3; }
+                    lab4:
+                        z->c = z->l - m;
+                    }
+                    {   int ret = r_R2(z);
+                        if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 98 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 98 */
+                        if (ret < 0) return ret;
+                    }
+                lab3:
+                    ;
+                }
+                break;
+            case 2:
+                {   int m = z->l - z->c; (void) m; /* not, line 101 */
+                    if (!(eq_s_b(z, 1, s_13))) goto lab5;
+                    goto lab2;
+                lab5:
+                    z->c = z->l - m;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 101 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 104 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* try, line 105 */
+                    z->ket = z->c; /* [, line 106 */
+                    {   int m = z->l - z->c; (void) m; /* or, line 106 */
+                        if (!(eq_s_b(z, 2, s_14))) goto lab8;
+                        goto lab7;
+                    lab8:
+                        z->c = z->l - m;
+                        if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m; goto lab6; }
+                    }
+                lab7:
+                    z->bra = z->c; /* ], line 106 */
+                    {   int ret = r_R1(z);
+                        if (ret == 0) { z->c = z->l - m; goto lab6; } /* call R1, line 106 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 106 */
+                        if (ret < 0) return ret;
+                    }
+                lab6:
+                    ;
+                }
+                break;
+            case 4:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 110 */
+                    if (ret < 0) return ret;
+                }
+                {   int m = z->l - z->c; (void) m; /* try, line 111 */
+                    z->ket = z->c; /* [, line 112 */
+                    among_var = find_among_b(z, a_3, 2); /* substring, line 112 */
+                    if (!(among_var)) { z->c = z->l - m; goto lab9; }
+                    z->bra = z->c; /* ], line 112 */
+                    {   int ret = r_R2(z);
+                        if (ret == 0) { z->c = z->l - m; goto lab9; } /* call R2, line 112 */
+                        if (ret < 0) return ret;
+                    }
+                    switch(among_var) {
+                        case 0: { z->c = z->l - m; goto lab9; }
+                        case 1:
+                            {   int ret;
+                                ret = slice_del(z); /* delete, line 114 */
+                                if (ret < 0) return ret;
+                            }
+                            break;
+                    }
+                lab9:
+                    ;
+                }
+                break;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    return 1;
+}
+
+extern int german_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 125 */
+        {   int ret = r_prelude(z);
+            if (ret == 0) goto lab0; /* call prelude, line 125 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 126 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab1; /* call mark_regions, line 126 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 127 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 128 */
+        {   int ret = r_standard_suffix(z);
+            if (ret == 0) goto lab2; /* call standard_suffix, line 128 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 129 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab3; /* call postlude, line 129 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * german_UTF_8_create_env(void) { return SN_create_env(0, 3, 0); }
+
+extern void german_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_german.h b/libstemmer_c/src_c/stem_UTF_8_german.h
new file mode 100644
index 0000000..5bd84d4
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_german.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * german_UTF_8_create_env(void);
+extern void german_UTF_8_close_env(struct SN_env * z);
+
+extern int german_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_italian.c b/libstemmer_c/src_c/stem_UTF_8_italian.c
new file mode 100644
index 0000000..5639b1c
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_italian.c
@@ -0,0 +1,1113 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int italian_UTF_8_stem(struct SN_env * z);
+static int r_vowel_suffix(struct SN_env * z);
+static int r_verb_suffix(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_attached_pronoun(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_RV(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * italian_UTF_8_create_env(void);
+extern void italian_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_1[2] = { 'q', 'u' };
+static symbol s_0_2[2] = { 0xC3, 0xA1 };
+static symbol s_0_3[2] = { 0xC3, 0xA9 };
+static symbol s_0_4[2] = { 0xC3, 0xAD };
+static symbol s_0_5[2] = { 0xC3, 0xB3 };
+static symbol s_0_6[2] = { 0xC3, 0xBA };
+
+static struct among a_0[7] =
+{
+/*  0 */ { 0, 0, -1, 7, 0},
+/*  1 */ { 2, s_0_1, 0, 6, 0},
+/*  2 */ { 2, s_0_2, 0, 1, 0},
+/*  3 */ { 2, s_0_3, 0, 2, 0},
+/*  4 */ { 2, s_0_4, 0, 3, 0},
+/*  5 */ { 2, s_0_5, 0, 4, 0},
+/*  6 */ { 2, s_0_6, 0, 5, 0}
+};
+
+static symbol s_1_1[1] = { 'I' };
+static symbol s_1_2[1] = { 'U' };
+
+static struct among a_1[3] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 1, s_1_1, 0, 1, 0},
+/*  2 */ { 1, s_1_2, 0, 2, 0}
+};
+
+static symbol s_2_0[2] = { 'l', 'a' };
+static symbol s_2_1[4] = { 'c', 'e', 'l', 'a' };
+static symbol s_2_2[6] = { 'g', 'l', 'i', 'e', 'l', 'a' };
+static symbol s_2_3[4] = { 'm', 'e', 'l', 'a' };
+static symbol s_2_4[4] = { 't', 'e', 'l', 'a' };
+static symbol s_2_5[4] = { 'v', 'e', 'l', 'a' };
+static symbol s_2_6[2] = { 'l', 'e' };
+static symbol s_2_7[4] = { 'c', 'e', 'l', 'e' };
+static symbol s_2_8[6] = { 'g', 'l', 'i', 'e', 'l', 'e' };
+static symbol s_2_9[4] = { 'm', 'e', 'l', 'e' };
+static symbol s_2_10[4] = { 't', 'e', 'l', 'e' };
+static symbol s_2_11[4] = { 'v', 'e', 'l', 'e' };
+static symbol s_2_12[2] = { 'n', 'e' };
+static symbol s_2_13[4] = { 'c', 'e', 'n', 'e' };
+static symbol s_2_14[6] = { 'g', 'l', 'i', 'e', 'n', 'e' };
+static symbol s_2_15[4] = { 'm', 'e', 'n', 'e' };
+static symbol s_2_16[4] = { 's', 'e', 'n', 'e' };
+static symbol s_2_17[4] = { 't', 'e', 'n', 'e' };
+static symbol s_2_18[4] = { 'v', 'e', 'n', 'e' };
+static symbol s_2_19[2] = { 'c', 'i' };
+static symbol s_2_20[2] = { 'l', 'i' };
+static symbol s_2_21[4] = { 'c', 'e', 'l', 'i' };
+static symbol s_2_22[6] = { 'g', 'l', 'i', 'e', 'l', 'i' };
+static symbol s_2_23[4] = { 'm', 'e', 'l', 'i' };
+static symbol s_2_24[4] = { 't', 'e', 'l', 'i' };
+static symbol s_2_25[4] = { 'v', 'e', 'l', 'i' };
+static symbol s_2_26[3] = { 'g', 'l', 'i' };
+static symbol s_2_27[2] = { 'm', 'i' };
+static symbol s_2_28[2] = { 's', 'i' };
+static symbol s_2_29[2] = { 't', 'i' };
+static symbol s_2_30[2] = { 'v', 'i' };
+static symbol s_2_31[2] = { 'l', 'o' };
+static symbol s_2_32[4] = { 'c', 'e', 'l', 'o' };
+static symbol s_2_33[6] = { 'g', 'l', 'i', 'e', 'l', 'o' };
+static symbol s_2_34[4] = { 'm', 'e', 'l', 'o' };
+static symbol s_2_35[4] = { 't', 'e', 'l', 'o' };
+static symbol s_2_36[4] = { 'v', 'e', 'l', 'o' };
+
+static struct among a_2[37] =
+{
+/*  0 */ { 2, s_2_0, -1, -1, 0},
+/*  1 */ { 4, s_2_1, 0, -1, 0},
+/*  2 */ { 6, s_2_2, 0, -1, 0},
+/*  3 */ { 4, s_2_3, 0, -1, 0},
+/*  4 */ { 4, s_2_4, 0, -1, 0},
+/*  5 */ { 4, s_2_5, 0, -1, 0},
+/*  6 */ { 2, s_2_6, -1, -1, 0},
+/*  7 */ { 4, s_2_7, 6, -1, 0},
+/*  8 */ { 6, s_2_8, 6, -1, 0},
+/*  9 */ { 4, s_2_9, 6, -1, 0},
+/* 10 */ { 4, s_2_10, 6, -1, 0},
+/* 11 */ { 4, s_2_11, 6, -1, 0},
+/* 12 */ { 2, s_2_12, -1, -1, 0},
+/* 13 */ { 4, s_2_13, 12, -1, 0},
+/* 14 */ { 6, s_2_14, 12, -1, 0},
+/* 15 */ { 4, s_2_15, 12, -1, 0},
+/* 16 */ { 4, s_2_16, 12, -1, 0},
+/* 17 */ { 4, s_2_17, 12, -1, 0},
+/* 18 */ { 4, s_2_18, 12, -1, 0},
+/* 19 */ { 2, s_2_19, -1, -1, 0},
+/* 20 */ { 2, s_2_20, -1, -1, 0},
+/* 21 */ { 4, s_2_21, 20, -1, 0},
+/* 22 */ { 6, s_2_22, 20, -1, 0},
+/* 23 */ { 4, s_2_23, 20, -1, 0},
+/* 24 */ { 4, s_2_24, 20, -1, 0},
+/* 25 */ { 4, s_2_25, 20, -1, 0},
+/* 26 */ { 3, s_2_26, 20, -1, 0},
+/* 27 */ { 2, s_2_27, -1, -1, 0},
+/* 28 */ { 2, s_2_28, -1, -1, 0},
+/* 29 */ { 2, s_2_29, -1, -1, 0},
+/* 30 */ { 2, s_2_30, -1, -1, 0},
+/* 31 */ { 2, s_2_31, -1, -1, 0},
+/* 32 */ { 4, s_2_32, 31, -1, 0},
+/* 33 */ { 6, s_2_33, 31, -1, 0},
+/* 34 */ { 4, s_2_34, 31, -1, 0},
+/* 35 */ { 4, s_2_35, 31, -1, 0},
+/* 36 */ { 4, s_2_36, 31, -1, 0}
+};
+
+static symbol s_3_0[4] = { 'a', 'n', 'd', 'o' };
+static symbol s_3_1[4] = { 'e', 'n', 'd', 'o' };
+static symbol s_3_2[2] = { 'a', 'r' };
+static symbol s_3_3[2] = { 'e', 'r' };
+static symbol s_3_4[2] = { 'i', 'r' };
+
+static struct among a_3[5] =
+{
+/*  0 */ { 4, s_3_0, -1, 1, 0},
+/*  1 */ { 4, s_3_1, -1, 1, 0},
+/*  2 */ { 2, s_3_2, -1, 2, 0},
+/*  3 */ { 2, s_3_3, -1, 2, 0},
+/*  4 */ { 2, s_3_4, -1, 2, 0}
+};
+
+static symbol s_4_0[2] = { 'i', 'c' };
+static symbol s_4_1[4] = { 'a', 'b', 'i', 'l' };
+static symbol s_4_2[2] = { 'o', 's' };
+static symbol s_4_3[2] = { 'i', 'v' };
+
+static struct among a_4[4] =
+{
+/*  0 */ { 2, s_4_0, -1, -1, 0},
+/*  1 */ { 4, s_4_1, -1, -1, 0},
+/*  2 */ { 2, s_4_2, -1, -1, 0},
+/*  3 */ { 2, s_4_3, -1, 1, 0}
+};
+
+static symbol s_5_0[2] = { 'i', 'c' };
+static symbol s_5_1[4] = { 'a', 'b', 'i', 'l' };
+static symbol s_5_2[2] = { 'i', 'v' };
+
+static struct among a_5[3] =
+{
+/*  0 */ { 2, s_5_0, -1, 1, 0},
+/*  1 */ { 4, s_5_1, -1, 1, 0},
+/*  2 */ { 2, s_5_2, -1, 1, 0}
+};
+
+static symbol s_6_0[3] = { 'i', 'c', 'a' };
+static symbol s_6_1[5] = { 'l', 'o', 'g', 'i', 'a' };
+static symbol s_6_2[3] = { 'o', 's', 'a' };
+static symbol s_6_3[4] = { 'i', 's', 't', 'a' };
+static symbol s_6_4[3] = { 'i', 'v', 'a' };
+static symbol s_6_5[4] = { 'a', 'n', 'z', 'a' };
+static symbol s_6_6[4] = { 'e', 'n', 'z', 'a' };
+static symbol s_6_7[3] = { 'i', 'c', 'e' };
+static symbol s_6_8[6] = { 'a', 't', 'r', 'i', 'c', 'e' };
+static symbol s_6_9[4] = { 'i', 'c', 'h', 'e' };
+static symbol s_6_10[5] = { 'l', 'o', 'g', 'i', 'e' };
+static symbol s_6_11[5] = { 'a', 'b', 'i', 'l', 'e' };
+static symbol s_6_12[5] = { 'i', 'b', 'i', 'l', 'e' };
+static symbol s_6_13[6] = { 'u', 's', 'i', 'o', 'n', 'e' };
+static symbol s_6_14[6] = { 'a', 'z', 'i', 'o', 'n', 'e' };
+static symbol s_6_15[6] = { 'u', 'z', 'i', 'o', 'n', 'e' };
+static symbol s_6_16[5] = { 'a', 't', 'o', 'r', 'e' };
+static symbol s_6_17[3] = { 'o', 's', 'e' };
+static symbol s_6_18[4] = { 'a', 'n', 't', 'e' };
+static symbol s_6_19[5] = { 'm', 'e', 'n', 't', 'e' };
+static symbol s_6_20[6] = { 'a', 'm', 'e', 'n', 't', 'e' };
+static symbol s_6_21[4] = { 'i', 's', 't', 'e' };
+static symbol s_6_22[3] = { 'i', 'v', 'e' };
+static symbol s_6_23[4] = { 'a', 'n', 'z', 'e' };
+static symbol s_6_24[4] = { 'e', 'n', 'z', 'e' };
+static symbol s_6_25[3] = { 'i', 'c', 'i' };
+static symbol s_6_26[6] = { 'a', 't', 'r', 'i', 'c', 'i' };
+static symbol s_6_27[4] = { 'i', 'c', 'h', 'i' };
+static symbol s_6_28[5] = { 'a', 'b', 'i', 'l', 'i' };
+static symbol s_6_29[5] = { 'i', 'b', 'i', 'l', 'i' };
+static symbol s_6_30[4] = { 'i', 's', 'm', 'i' };
+static symbol s_6_31[6] = { 'u', 's', 'i', 'o', 'n', 'i' };
+static symbol s_6_32[6] = { 'a', 'z', 'i', 'o', 'n', 'i' };
+static symbol s_6_33[6] = { 'u', 'z', 'i', 'o', 'n', 'i' };
+static symbol s_6_34[5] = { 'a', 't', 'o', 'r', 'i' };
+static symbol s_6_35[3] = { 'o', 's', 'i' };
+static symbol s_6_36[4] = { 'a', 'n', 't', 'i' };
+static symbol s_6_37[6] = { 'a', 'm', 'e', 'n', 't', 'i' };
+static symbol s_6_38[6] = { 'i', 'm', 'e', 'n', 't', 'i' };
+static symbol s_6_39[4] = { 'i', 's', 't', 'i' };
+static symbol s_6_40[3] = { 'i', 'v', 'i' };
+static symbol s_6_41[3] = { 'i', 'c', 'o' };
+static symbol s_6_42[4] = { 'i', 's', 'm', 'o' };
+static symbol s_6_43[3] = { 'o', 's', 'o' };
+static symbol s_6_44[6] = { 'a', 'm', 'e', 'n', 't', 'o' };
+static symbol s_6_45[6] = { 'i', 'm', 'e', 'n', 't', 'o' };
+static symbol s_6_46[3] = { 'i', 'v', 'o' };
+static symbol s_6_47[4] = { 'i', 't', 0xC3, 0xA0 };
+static symbol s_6_48[5] = { 'i', 's', 't', 0xC3, 0xA0 };
+static symbol s_6_49[5] = { 'i', 's', 't', 0xC3, 0xA8 };
+static symbol s_6_50[5] = { 'i', 's', 't', 0xC3, 0xAC };
+
+static struct among a_6[51] =
+{
+/*  0 */ { 3, s_6_0, -1, 1, 0},
+/*  1 */ { 5, s_6_1, -1, 3, 0},
+/*  2 */ { 3, s_6_2, -1, 1, 0},
+/*  3 */ { 4, s_6_3, -1, 1, 0},
+/*  4 */ { 3, s_6_4, -1, 9, 0},
+/*  5 */ { 4, s_6_5, -1, 1, 0},
+/*  6 */ { 4, s_6_6, -1, 5, 0},
+/*  7 */ { 3, s_6_7, -1, 1, 0},
+/*  8 */ { 6, s_6_8, 7, 1, 0},
+/*  9 */ { 4, s_6_9, -1, 1, 0},
+/* 10 */ { 5, s_6_10, -1, 3, 0},
+/* 11 */ { 5, s_6_11, -1, 1, 0},
+/* 12 */ { 5, s_6_12, -1, 1, 0},
+/* 13 */ { 6, s_6_13, -1, 4, 0},
+/* 14 */ { 6, s_6_14, -1, 2, 0},
+/* 15 */ { 6, s_6_15, -1, 4, 0},
+/* 16 */ { 5, s_6_16, -1, 2, 0},
+/* 17 */ { 3, s_6_17, -1, 1, 0},
+/* 18 */ { 4, s_6_18, -1, 1, 0},
+/* 19 */ { 5, s_6_19, -1, 1, 0},
+/* 20 */ { 6, s_6_20, 19, 7, 0},
+/* 21 */ { 4, s_6_21, -1, 1, 0},
+/* 22 */ { 3, s_6_22, -1, 9, 0},
+/* 23 */ { 4, s_6_23, -1, 1, 0},
+/* 24 */ { 4, s_6_24, -1, 5, 0},
+/* 25 */ { 3, s_6_25, -1, 1, 0},
+/* 26 */ { 6, s_6_26, 25, 1, 0},
+/* 27 */ { 4, s_6_27, -1, 1, 0},
+/* 28 */ { 5, s_6_28, -1, 1, 0},
+/* 29 */ { 5, s_6_29, -1, 1, 0},
+/* 30 */ { 4, s_6_30, -1, 1, 0},
+/* 31 */ { 6, s_6_31, -1, 4, 0},
+/* 32 */ { 6, s_6_32, -1, 2, 0},
+/* 33 */ { 6, s_6_33, -1, 4, 0},
+/* 34 */ { 5, s_6_34, -1, 2, 0},
+/* 35 */ { 3, s_6_35, -1, 1, 0},
+/* 36 */ { 4, s_6_36, -1, 1, 0},
+/* 37 */ { 6, s_6_37, -1, 6, 0},
+/* 38 */ { 6, s_6_38, -1, 6, 0},
+/* 39 */ { 4, s_6_39, -1, 1, 0},
+/* 40 */ { 3, s_6_40, -1, 9, 0},
+/* 41 */ { 3, s_6_41, -1, 1, 0},
+/* 42 */ { 4, s_6_42, -1, 1, 0},
+/* 43 */ { 3, s_6_43, -1, 1, 0},
+/* 44 */ { 6, s_6_44, -1, 6, 0},
+/* 45 */ { 6, s_6_45, -1, 6, 0},
+/* 46 */ { 3, s_6_46, -1, 9, 0},
+/* 47 */ { 4, s_6_47, -1, 8, 0},
+/* 48 */ { 5, s_6_48, -1, 1, 0},
+/* 49 */ { 5, s_6_49, -1, 1, 0},
+/* 50 */ { 5, s_6_50, -1, 1, 0}
+};
+
+static symbol s_7_0[4] = { 'i', 's', 'c', 'a' };
+static symbol s_7_1[4] = { 'e', 'n', 'd', 'a' };
+static symbol s_7_2[3] = { 'a', 't', 'a' };
+static symbol s_7_3[3] = { 'i', 't', 'a' };
+static symbol s_7_4[3] = { 'u', 't', 'a' };
+static symbol s_7_5[3] = { 'a', 'v', 'a' };
+static symbol s_7_6[3] = { 'e', 'v', 'a' };
+static symbol s_7_7[3] = { 'i', 'v', 'a' };
+static symbol s_7_8[6] = { 'e', 'r', 'e', 'b', 'b', 'e' };
+static symbol s_7_9[6] = { 'i', 'r', 'e', 'b', 'b', 'e' };
+static symbol s_7_10[4] = { 'i', 's', 'c', 'e' };
+static symbol s_7_11[4] = { 'e', 'n', 'd', 'e' };
+static symbol s_7_12[3] = { 'a', 'r', 'e' };
+static symbol s_7_13[3] = { 'e', 'r', 'e' };
+static symbol s_7_14[3] = { 'i', 'r', 'e' };
+static symbol s_7_15[4] = { 'a', 's', 's', 'e' };
+static symbol s_7_16[3] = { 'a', 't', 'e' };
+static symbol s_7_17[5] = { 'a', 'v', 'a', 't', 'e' };
+static symbol s_7_18[5] = { 'e', 'v', 'a', 't', 'e' };
+static symbol s_7_19[5] = { 'i', 'v', 'a', 't', 'e' };
+static symbol s_7_20[3] = { 'e', 't', 'e' };
+static symbol s_7_21[5] = { 'e', 'r', 'e', 't', 'e' };
+static symbol s_7_22[5] = { 'i', 'r', 'e', 't', 'e' };
+static symbol s_7_23[3] = { 'i', 't', 'e' };
+static symbol s_7_24[6] = { 'e', 'r', 'e', 's', 't', 'e' };
+static symbol s_7_25[6] = { 'i', 'r', 'e', 's', 't', 'e' };
+static symbol s_7_26[3] = { 'u', 't', 'e' };
+static symbol s_7_27[4] = { 'e', 'r', 'a', 'i' };
+static symbol s_7_28[4] = { 'i', 'r', 'a', 'i' };
+static symbol s_7_29[4] = { 'i', 's', 'c', 'i' };
+static symbol s_7_30[4] = { 'e', 'n', 'd', 'i' };
+static symbol s_7_31[4] = { 'e', 'r', 'e', 'i' };
+static symbol s_7_32[4] = { 'i', 'r', 'e', 'i' };
+static symbol s_7_33[4] = { 'a', 's', 's', 'i' };
+static symbol s_7_34[3] = { 'a', 't', 'i' };
+static symbol s_7_35[3] = { 'i', 't', 'i' };
+static symbol s_7_36[6] = { 'e', 'r', 'e', 's', 't', 'i' };
+static symbol s_7_37[6] = { 'i', 'r', 'e', 's', 't', 'i' };
+static symbol s_7_38[3] = { 'u', 't', 'i' };
+static symbol s_7_39[3] = { 'a', 'v', 'i' };
+static symbol s_7_40[3] = { 'e', 'v', 'i' };
+static symbol s_7_41[3] = { 'i', 'v', 'i' };
+static symbol s_7_42[4] = { 'i', 's', 'c', 'o' };
+static symbol s_7_43[4] = { 'a', 'n', 'd', 'o' };
+static symbol s_7_44[4] = { 'e', 'n', 'd', 'o' };
+static symbol s_7_45[4] = { 'Y', 'a', 'm', 'o' };
+static symbol s_7_46[4] = { 'i', 'a', 'm', 'o' };
+static symbol s_7_47[5] = { 'a', 'v', 'a', 'm', 'o' };
+static symbol s_7_48[5] = { 'e', 'v', 'a', 'm', 'o' };
+static symbol s_7_49[5] = { 'i', 'v', 'a', 'm', 'o' };
+static symbol s_7_50[5] = { 'e', 'r', 'e', 'm', 'o' };
+static symbol s_7_51[5] = { 'i', 'r', 'e', 'm', 'o' };
+static symbol s_7_52[6] = { 'a', 's', 's', 'i', 'm', 'o' };
+static symbol s_7_53[4] = { 'a', 'm', 'm', 'o' };
+static symbol s_7_54[4] = { 'e', 'm', 'm', 'o' };
+static symbol s_7_55[6] = { 'e', 'r', 'e', 'm', 'm', 'o' };
+static symbol s_7_56[6] = { 'i', 'r', 'e', 'm', 'm', 'o' };
+static symbol s_7_57[4] = { 'i', 'm', 'm', 'o' };
+static symbol s_7_58[3] = { 'a', 'n', 'o' };
+static symbol s_7_59[6] = { 'i', 's', 'c', 'a', 'n', 'o' };
+static symbol s_7_60[5] = { 'a', 'v', 'a', 'n', 'o' };
+static symbol s_7_61[5] = { 'e', 'v', 'a', 'n', 'o' };
+static symbol s_7_62[5] = { 'i', 'v', 'a', 'n', 'o' };
+static symbol s_7_63[6] = { 'e', 'r', 'a', 'n', 'n', 'o' };
+static symbol s_7_64[6] = { 'i', 'r', 'a', 'n', 'n', 'o' };
+static symbol s_7_65[3] = { 'o', 'n', 'o' };
+static symbol s_7_66[6] = { 'i', 's', 'c', 'o', 'n', 'o' };
+static symbol s_7_67[5] = { 'a', 'r', 'o', 'n', 'o' };
+static symbol s_7_68[5] = { 'e', 'r', 'o', 'n', 'o' };
+static symbol s_7_69[5] = { 'i', 'r', 'o', 'n', 'o' };
+static symbol s_7_70[8] = { 'e', 'r', 'e', 'b', 'b', 'e', 'r', 'o' };
+static symbol s_7_71[8] = { 'i', 'r', 'e', 'b', 'b', 'e', 'r', 'o' };
+static symbol s_7_72[6] = { 'a', 's', 's', 'e', 'r', 'o' };
+static symbol s_7_73[6] = { 'e', 's', 's', 'e', 'r', 'o' };
+static symbol s_7_74[6] = { 'i', 's', 's', 'e', 'r', 'o' };
+static symbol s_7_75[3] = { 'a', 't', 'o' };
+static symbol s_7_76[3] = { 'i', 't', 'o' };
+static symbol s_7_77[3] = { 'u', 't', 'o' };
+static symbol s_7_78[3] = { 'a', 'v', 'o' };
+static symbol s_7_79[3] = { 'e', 'v', 'o' };
+static symbol s_7_80[3] = { 'i', 'v', 'o' };
+static symbol s_7_81[2] = { 'a', 'r' };
+static symbol s_7_82[2] = { 'i', 'r' };
+static symbol s_7_83[4] = { 'e', 'r', 0xC3, 0xA0 };
+static symbol s_7_84[4] = { 'i', 'r', 0xC3, 0xA0 };
+static symbol s_7_85[4] = { 'e', 'r', 0xC3, 0xB2 };
+static symbol s_7_86[4] = { 'i', 'r', 0xC3, 0xB2 };
+
+static struct among a_7[87] =
+{
+/*  0 */ { 4, s_7_0, -1, 1, 0},
+/*  1 */ { 4, s_7_1, -1, 1, 0},
+/*  2 */ { 3, s_7_2, -1, 1, 0},
+/*  3 */ { 3, s_7_3, -1, 1, 0},
+/*  4 */ { 3, s_7_4, -1, 1, 0},
+/*  5 */ { 3, s_7_5, -1, 1, 0},
+/*  6 */ { 3, s_7_6, -1, 1, 0},
+/*  7 */ { 3, s_7_7, -1, 1, 0},
+/*  8 */ { 6, s_7_8, -1, 1, 0},
+/*  9 */ { 6, s_7_9, -1, 1, 0},
+/* 10 */ { 4, s_7_10, -1, 1, 0},
+/* 11 */ { 4, s_7_11, -1, 1, 0},
+/* 12 */ { 3, s_7_12, -1, 1, 0},
+/* 13 */ { 3, s_7_13, -1, 1, 0},
+/* 14 */ { 3, s_7_14, -1, 1, 0},
+/* 15 */ { 4, s_7_15, -1, 1, 0},
+/* 16 */ { 3, s_7_16, -1, 1, 0},
+/* 17 */ { 5, s_7_17, 16, 1, 0},
+/* 18 */ { 5, s_7_18, 16, 1, 0},
+/* 19 */ { 5, s_7_19, 16, 1, 0},
+/* 20 */ { 3, s_7_20, -1, 1, 0},
+/* 21 */ { 5, s_7_21, 20, 1, 0},
+/* 22 */ { 5, s_7_22, 20, 1, 0},
+/* 23 */ { 3, s_7_23, -1, 1, 0},
+/* 24 */ { 6, s_7_24, -1, 1, 0},
+/* 25 */ { 6, s_7_25, -1, 1, 0},
+/* 26 */ { 3, s_7_26, -1, 1, 0},
+/* 27 */ { 4, s_7_27, -1, 1, 0},
+/* 28 */ { 4, s_7_28, -1, 1, 0},
+/* 29 */ { 4, s_7_29, -1, 1, 0},
+/* 30 */ { 4, s_7_30, -1, 1, 0},
+/* 31 */ { 4, s_7_31, -1, 1, 0},
+/* 32 */ { 4, s_7_32, -1, 1, 0},
+/* 33 */ { 4, s_7_33, -1, 1, 0},
+/* 34 */ { 3, s_7_34, -1, 1, 0},
+/* 35 */ { 3, s_7_35, -1, 1, 0},
+/* 36 */ { 6, s_7_36, -1, 1, 0},
+/* 37 */ { 6, s_7_37, -1, 1, 0},
+/* 38 */ { 3, s_7_38, -1, 1, 0},
+/* 39 */ { 3, s_7_39, -1, 1, 0},
+/* 40 */ { 3, s_7_40, -1, 1, 0},
+/* 41 */ { 3, s_7_41, -1, 1, 0},
+/* 42 */ { 4, s_7_42, -1, 1, 0},
+/* 43 */ { 4, s_7_43, -1, 1, 0},
+/* 44 */ { 4, s_7_44, -1, 1, 0},
+/* 45 */ { 4, s_7_45, -1, 1, 0},
+/* 46 */ { 4, s_7_46, -1, 1, 0},
+/* 47 */ { 5, s_7_47, -1, 1, 0},
+/* 48 */ { 5, s_7_48, -1, 1, 0},
+/* 49 */ { 5, s_7_49, -1, 1, 0},
+/* 50 */ { 5, s_7_50, -1, 1, 0},
+/* 51 */ { 5, s_7_51, -1, 1, 0},
+/* 52 */ { 6, s_7_52, -1, 1, 0},
+/* 53 */ { 4, s_7_53, -1, 1, 0},
+/* 54 */ { 4, s_7_54, -1, 1, 0},
+/* 55 */ { 6, s_7_55, 54, 1, 0},
+/* 56 */ { 6, s_7_56, 54, 1, 0},
+/* 57 */ { 4, s_7_57, -1, 1, 0},
+/* 58 */ { 3, s_7_58, -1, 1, 0},
+/* 59 */ { 6, s_7_59, 58, 1, 0},
+/* 60 */ { 5, s_7_60, 58, 1, 0},
+/* 61 */ { 5, s_7_61, 58, 1, 0},
+/* 62 */ { 5, s_7_62, 58, 1, 0},
+/* 63 */ { 6, s_7_63, -1, 1, 0},
+/* 64 */ { 6, s_7_64, -1, 1, 0},
+/* 65 */ { 3, s_7_65, -1, 1, 0},
+/* 66 */ { 6, s_7_66, 65, 1, 0},
+/* 67 */ { 5, s_7_67, 65, 1, 0},
+/* 68 */ { 5, s_7_68, 65, 1, 0},
+/* 69 */ { 5, s_7_69, 65, 1, 0},
+/* 70 */ { 8, s_7_70, -1, 1, 0},
+/* 71 */ { 8, s_7_71, -1, 1, 0},
+/* 72 */ { 6, s_7_72, -1, 1, 0},
+/* 73 */ { 6, s_7_73, -1, 1, 0},
+/* 74 */ { 6, s_7_74, -1, 1, 0},
+/* 75 */ { 3, s_7_75, -1, 1, 0},
+/* 76 */ { 3, s_7_76, -1, 1, 0},
+/* 77 */ { 3, s_7_77, -1, 1, 0},
+/* 78 */ { 3, s_7_78, -1, 1, 0},
+/* 79 */ { 3, s_7_79, -1, 1, 0},
+/* 80 */ { 3, s_7_80, -1, 1, 0},
+/* 81 */ { 2, s_7_81, -1, 1, 0},
+/* 82 */ { 2, s_7_82, -1, 1, 0},
+/* 83 */ { 4, s_7_83, -1, 1, 0},
+/* 84 */ { 4, s_7_84, -1, 1, 0},
+/* 85 */ { 4, s_7_85, -1, 1, 0},
+/* 86 */ { 4, s_7_86, -1, 1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2, 1 };
+
+static unsigned char g_AEIO[] = { 17, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 8, 2 };
+
+static unsigned char g_CG[] = { 17 };
+
+static symbol s_0[] = { 0xC3, 0xA0 };
+static symbol s_1[] = { 0xC3, 0xA8 };
+static symbol s_2[] = { 0xC3, 0xAC };
+static symbol s_3[] = { 0xC3, 0xB2 };
+static symbol s_4[] = { 0xC3, 0xB9 };
+static symbol s_5[] = { 'q', 'U' };
+static symbol s_6[] = { 'u' };
+static symbol s_7[] = { 'U' };
+static symbol s_8[] = { 'i' };
+static symbol s_9[] = { 'I' };
+static symbol s_10[] = { 'i' };
+static symbol s_11[] = { 'u' };
+static symbol s_12[] = { 'e' };
+static symbol s_13[] = { 'i', 'c' };
+static symbol s_14[] = { 'l', 'o', 'g' };
+static symbol s_15[] = { 'u' };
+static symbol s_16[] = { 'e', 'n', 't', 'e' };
+static symbol s_17[] = { 'a', 't' };
+static symbol s_18[] = { 'a', 't' };
+static symbol s_19[] = { 'i', 'c' };
+static symbol s_20[] = { 'i' };
+static symbol s_21[] = { 'h' };
+
+static int r_prelude(struct SN_env * z) {
+    int among_var;
+    {   int c_test = z->c; /* test, line 35 */
+        while(1) { /* repeat, line 35 */
+            int c = z->c;
+            z->bra = z->c; /* [, line 36 */
+            among_var = find_among(z, a_0, 7); /* substring, line 36 */
+            if (!(among_var)) goto lab0;
+            z->ket = z->c; /* ], line 36 */
+            switch(among_var) {
+                case 0: goto lab0;
+                case 1:
+                    {   int ret;
+                        ret = slice_from_s(z, 2, s_0); /* <-, line 37 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 2:
+                    {   int ret;
+                        ret = slice_from_s(z, 2, s_1); /* <-, line 38 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 3:
+                    {   int ret;
+                        ret = slice_from_s(z, 2, s_2); /* <-, line 39 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 4:
+                    {   int ret;
+                        ret = slice_from_s(z, 2, s_3); /* <-, line 40 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 5:
+                    {   int ret;
+                        ret = slice_from_s(z, 2, s_4); /* <-, line 41 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 6:
+                    {   int ret;
+                        ret = slice_from_s(z, 2, s_5); /* <-, line 42 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 7:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab0;
+                        z->c = c; /* next, line 43 */
+                    }
+                    break;
+            }
+            continue;
+        lab0:
+            z->c = c;
+            break;
+        }
+        z->c = c_test;
+    }
+    while(1) { /* repeat, line 46 */
+        int c = z->c;
+        while(1) { /* goto, line 46 */
+            int c = z->c;
+            if (!(in_grouping_U(z, g_v, 97, 249))) goto lab2;
+            z->bra = z->c; /* [, line 47 */
+            {   int c = z->c; /* or, line 47 */
+                if (!(eq_s(z, 1, s_6))) goto lab4;
+                z->ket = z->c; /* ], line 47 */
+                if (!(in_grouping_U(z, g_v, 97, 249))) goto lab4;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_7); /* <-, line 47 */
+                    if (ret < 0) return ret;
+                }
+                goto lab3;
+            lab4:
+                z->c = c;
+                if (!(eq_s(z, 1, s_8))) goto lab2;
+                z->ket = z->c; /* ], line 48 */
+                if (!(in_grouping_U(z, g_v, 97, 249))) goto lab2;
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_9); /* <-, line 48 */
+                    if (ret < 0) return ret;
+                }
+            }
+        lab3:
+            z->c = c;
+            break;
+        lab2:
+            z->c = c;
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab1;
+                z->c = c; /* goto, line 46 */
+            }
+        }
+        continue;
+    lab1:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    z->I[2] = z->l;
+    {   int c = z->c; /* do, line 58 */
+        {   int c = z->c; /* or, line 60 */
+            if (!(in_grouping_U(z, g_v, 97, 249))) goto lab2;
+            {   int c = z->c; /* or, line 59 */
+                if (!(out_grouping_U(z, g_v, 97, 249))) goto lab4;
+                while(1) { /* gopast, line 59 */
+                    if (!(in_grouping_U(z, g_v, 97, 249))) goto lab5;
+                    break;
+                lab5:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab4;
+                        z->c = c; /* gopast, line 59 */
+                    }
+                }
+                goto lab3;
+            lab4:
+                z->c = c;
+                if (!(in_grouping_U(z, g_v, 97, 249))) goto lab2;
+                while(1) { /* gopast, line 59 */
+                    if (!(out_grouping_U(z, g_v, 97, 249))) goto lab6;
+                    break;
+                lab6:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab2;
+                        z->c = c; /* gopast, line 59 */
+                    }
+                }
+            }
+        lab3:
+            goto lab1;
+        lab2:
+            z->c = c;
+            if (!(out_grouping_U(z, g_v, 97, 249))) goto lab0;
+            {   int c = z->c; /* or, line 61 */
+                if (!(out_grouping_U(z, g_v, 97, 249))) goto lab8;
+                while(1) { /* gopast, line 61 */
+                    if (!(in_grouping_U(z, g_v, 97, 249))) goto lab9;
+                    break;
+                lab9:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab8;
+                        z->c = c; /* gopast, line 61 */
+                    }
+                }
+                goto lab7;
+            lab8:
+                z->c = c;
+                if (!(in_grouping_U(z, g_v, 97, 249))) goto lab0;
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 61 */
+                }
+            }
+        lab7:
+            ;
+        }
+    lab1:
+        z->I[0] = z->c; /* setmark pV, line 62 */
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 64 */
+        while(1) { /* gopast, line 65 */
+            if (!(in_grouping_U(z, g_v, 97, 249))) goto lab11;
+            break;
+        lab11:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 65 */
+            }
+        }
+        while(1) { /* gopast, line 65 */
+            if (!(out_grouping_U(z, g_v, 97, 249))) goto lab12;
+            break;
+        lab12:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 65 */
+            }
+        }
+        z->I[1] = z->c; /* setmark p1, line 65 */
+        while(1) { /* gopast, line 66 */
+            if (!(in_grouping_U(z, g_v, 97, 249))) goto lab13;
+            break;
+        lab13:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 66 */
+            }
+        }
+        while(1) { /* gopast, line 66 */
+            if (!(out_grouping_U(z, g_v, 97, 249))) goto lab14;
+            break;
+        lab14:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 66 */
+            }
+        }
+        z->I[2] = z->c; /* setmark p2, line 66 */
+    lab10:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 70 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 72 */
+        among_var = find_among(z, a_1, 3); /* substring, line 72 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 72 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_10); /* <-, line 73 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_11); /* <-, line 74 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 75 */
+                }
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_RV(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[2] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_attached_pronoun(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 87 */
+    if (!(find_among_b(z, a_2, 37))) return 0; /* substring, line 87 */
+    z->bra = z->c; /* ], line 87 */
+    among_var = find_among_b(z, a_3, 5); /* among, line 97 */
+    if (!(among_var)) return 0;
+    {   int ret = r_RV(z);
+        if (ret == 0) return 0; /* call RV, line 97 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 98 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 1, s_12); /* <-, line 99 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 104 */
+    among_var = find_among_b(z, a_6, 51); /* substring, line 104 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 104 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 111 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 111 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 113 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 113 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 114 */
+                z->ket = z->c; /* [, line 114 */
+                if (!(eq_s_b(z, 2, s_13))) { z->c = z->l - m; goto lab0; }
+                z->bra = z->c; /* ], line 114 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 114 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 114 */
+                    if (ret < 0) return ret;
+                }
+            lab0:
+                ;
+            }
+            break;
+        case 3:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 117 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_14); /* <-, line 117 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 119 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_15); /* <-, line 119 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 121 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 4, s_16); /* <-, line 121 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 123 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 123 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 7:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 125 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 125 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 126 */
+                z->ket = z->c; /* [, line 127 */
+                among_var = find_among_b(z, a_4, 4); /* substring, line 127 */
+                if (!(among_var)) { z->c = z->l - m; goto lab1; }
+                z->bra = z->c; /* ], line 127 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 127 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 127 */
+                    if (ret < 0) return ret;
+                }
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab1; }
+                    case 1:
+                        z->ket = z->c; /* [, line 128 */
+                        if (!(eq_s_b(z, 2, s_17))) { z->c = z->l - m; goto lab1; }
+                        z->bra = z->c; /* ], line 128 */
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 128 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 128 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab1:
+                ;
+            }
+            break;
+        case 8:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 134 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 134 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 135 */
+                z->ket = z->c; /* [, line 136 */
+                among_var = find_among_b(z, a_5, 3); /* substring, line 136 */
+                if (!(among_var)) { z->c = z->l - m; goto lab2; }
+                z->bra = z->c; /* ], line 136 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab2; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 137 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 137 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab2:
+                ;
+            }
+            break;
+        case 9:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 142 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 142 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 143 */
+                z->ket = z->c; /* [, line 143 */
+                if (!(eq_s_b(z, 2, s_18))) { z->c = z->l - m; goto lab3; }
+                z->bra = z->c; /* ], line 143 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 143 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 143 */
+                    if (ret < 0) return ret;
+                }
+                z->ket = z->c; /* [, line 143 */
+                if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m; goto lab3; }
+                z->bra = z->c; /* ], line 143 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 143 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 143 */
+                    if (ret < 0) return ret;
+                }
+            lab3:
+                ;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 148 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 148 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 149 */
+        among_var = find_among_b(z, a_7, 87); /* substring, line 149 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 149 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 163 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_vowel_suffix(struct SN_env * z) {
+    {   int m = z->l - z->c; (void) m; /* try, line 171 */
+        z->ket = z->c; /* [, line 172 */
+        if (!(in_grouping_b_U(z, g_AEIO, 97, 242))) { z->c = z->l - m; goto lab0; }
+        z->bra = z->c; /* ], line 172 */
+        {   int ret = r_RV(z);
+            if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 172 */
+            if (ret < 0) return ret;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 172 */
+            if (ret < 0) return ret;
+        }
+        z->ket = z->c; /* [, line 173 */
+        if (!(eq_s_b(z, 1, s_20))) { z->c = z->l - m; goto lab0; }
+        z->bra = z->c; /* ], line 173 */
+        {   int ret = r_RV(z);
+            if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 173 */
+            if (ret < 0) return ret;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 173 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        ;
+    }
+    {   int m = z->l - z->c; (void) m; /* try, line 175 */
+        z->ket = z->c; /* [, line 176 */
+        if (!(eq_s_b(z, 1, s_21))) { z->c = z->l - m; goto lab1; }
+        z->bra = z->c; /* ], line 176 */
+        if (!(in_grouping_b_U(z, g_CG, 99, 103))) { z->c = z->l - m; goto lab1; }
+        {   int ret = r_RV(z);
+            if (ret == 0) { z->c = z->l - m; goto lab1; } /* call RV, line 176 */
+            if (ret < 0) return ret;
+        }
+        {   int ret;
+            ret = slice_del(z); /* delete, line 176 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        ;
+    }
+    return 1;
+}
+
+extern int italian_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 182 */
+        {   int ret = r_prelude(z);
+            if (ret == 0) goto lab0; /* call prelude, line 182 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 183 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab1; /* call mark_regions, line 183 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 184 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 185 */
+        {   int ret = r_attached_pronoun(z);
+            if (ret == 0) goto lab2; /* call attached_pronoun, line 185 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 186 */
+        {   int m = z->l - z->c; (void) m; /* or, line 186 */
+            {   int ret = r_standard_suffix(z);
+                if (ret == 0) goto lab5; /* call standard_suffix, line 186 */
+                if (ret < 0) return ret;
+            }
+            goto lab4;
+        lab5:
+            z->c = z->l - m;
+            {   int ret = r_verb_suffix(z);
+                if (ret == 0) goto lab3; /* call verb_suffix, line 186 */
+                if (ret < 0) return ret;
+            }
+        }
+    lab4:
+    lab3:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 187 */
+        {   int ret = r_vowel_suffix(z);
+            if (ret == 0) goto lab6; /* call vowel_suffix, line 187 */
+            if (ret < 0) return ret;
+        }
+    lab6:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 189 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab7; /* call postlude, line 189 */
+            if (ret < 0) return ret;
+        }
+    lab7:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * italian_UTF_8_create_env(void) { return SN_create_env(0, 3, 0); }
+
+extern void italian_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_italian.h b/libstemmer_c/src_c/stem_UTF_8_italian.h
new file mode 100644
index 0000000..3bee080
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_italian.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * italian_UTF_8_create_env(void);
+extern void italian_UTF_8_close_env(struct SN_env * z);
+
+extern int italian_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_norwegian.c b/libstemmer_c/src_c/stem_UTF_8_norwegian.c
new file mode 100644
index 0000000..6a5ea99
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_norwegian.c
@@ -0,0 +1,302 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int norwegian_UTF_8_stem(struct SN_env * z);
+static int r_other_suffix(struct SN_env * z);
+static int r_consonant_pair(struct SN_env * z);
+static int r_main_suffix(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+
+extern struct SN_env * norwegian_UTF_8_create_env(void);
+extern void norwegian_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_0[1] = { 'a' };
+static symbol s_0_1[1] = { 'e' };
+static symbol s_0_2[3] = { 'e', 'd', 'e' };
+static symbol s_0_3[4] = { 'a', 'n', 'd', 'e' };
+static symbol s_0_4[4] = { 'e', 'n', 'd', 'e' };
+static symbol s_0_5[3] = { 'a', 'n', 'e' };
+static symbol s_0_6[3] = { 'e', 'n', 'e' };
+static symbol s_0_7[6] = { 'h', 'e', 't', 'e', 'n', 'e' };
+static symbol s_0_8[4] = { 'e', 'r', 't', 'e' };
+static symbol s_0_9[2] = { 'e', 'n' };
+static symbol s_0_10[5] = { 'h', 'e', 't', 'e', 'n' };
+static symbol s_0_11[2] = { 'a', 'r' };
+static symbol s_0_12[2] = { 'e', 'r' };
+static symbol s_0_13[5] = { 'h', 'e', 't', 'e', 'r' };
+static symbol s_0_14[1] = { 's' };
+static symbol s_0_15[2] = { 'a', 's' };
+static symbol s_0_16[2] = { 'e', 's' };
+static symbol s_0_17[4] = { 'e', 'd', 'e', 's' };
+static symbol s_0_18[5] = { 'e', 'n', 'd', 'e', 's' };
+static symbol s_0_19[4] = { 'e', 'n', 'e', 's' };
+static symbol s_0_20[7] = { 'h', 'e', 't', 'e', 'n', 'e', 's' };
+static symbol s_0_21[3] = { 'e', 'n', 's' };
+static symbol s_0_22[6] = { 'h', 'e', 't', 'e', 'n', 's' };
+static symbol s_0_23[3] = { 'e', 'r', 's' };
+static symbol s_0_24[3] = { 'e', 't', 's' };
+static symbol s_0_25[2] = { 'e', 't' };
+static symbol s_0_26[3] = { 'h', 'e', 't' };
+static symbol s_0_27[3] = { 'e', 'r', 't' };
+static symbol s_0_28[3] = { 'a', 's', 't' };
+
+static struct among a_0[29] =
+{
+/*  0 */ { 1, s_0_0, -1, 1, 0},
+/*  1 */ { 1, s_0_1, -1, 1, 0},
+/*  2 */ { 3, s_0_2, 1, 1, 0},
+/*  3 */ { 4, s_0_3, 1, 1, 0},
+/*  4 */ { 4, s_0_4, 1, 1, 0},
+/*  5 */ { 3, s_0_5, 1, 1, 0},
+/*  6 */ { 3, s_0_6, 1, 1, 0},
+/*  7 */ { 6, s_0_7, 6, 1, 0},
+/*  8 */ { 4, s_0_8, 1, 3, 0},
+/*  9 */ { 2, s_0_9, -1, 1, 0},
+/* 10 */ { 5, s_0_10, 9, 1, 0},
+/* 11 */ { 2, s_0_11, -1, 1, 0},
+/* 12 */ { 2, s_0_12, -1, 1, 0},
+/* 13 */ { 5, s_0_13, 12, 1, 0},
+/* 14 */ { 1, s_0_14, -1, 2, 0},
+/* 15 */ { 2, s_0_15, 14, 1, 0},
+/* 16 */ { 2, s_0_16, 14, 1, 0},
+/* 17 */ { 4, s_0_17, 16, 1, 0},
+/* 18 */ { 5, s_0_18, 16, 1, 0},
+/* 19 */ { 4, s_0_19, 16, 1, 0},
+/* 20 */ { 7, s_0_20, 19, 1, 0},
+/* 21 */ { 3, s_0_21, 14, 1, 0},
+/* 22 */ { 6, s_0_22, 21, 1, 0},
+/* 23 */ { 3, s_0_23, 14, 1, 0},
+/* 24 */ { 3, s_0_24, 14, 1, 0},
+/* 25 */ { 2, s_0_25, -1, 1, 0},
+/* 26 */ { 3, s_0_26, 25, 1, 0},
+/* 27 */ { 3, s_0_27, -1, 3, 0},
+/* 28 */ { 3, s_0_28, -1, 1, 0}
+};
+
+static symbol s_1_0[2] = { 'd', 't' };
+static symbol s_1_1[2] = { 'v', 't' };
+
+static struct among a_1[2] =
+{
+/*  0 */ { 2, s_1_0, -1, -1, 0},
+/*  1 */ { 2, s_1_1, -1, -1, 0}
+};
+
+static symbol s_2_0[3] = { 'l', 'e', 'g' };
+static symbol s_2_1[4] = { 'e', 'l', 'e', 'g' };
+static symbol s_2_2[2] = { 'i', 'g' };
+static symbol s_2_3[3] = { 'e', 'i', 'g' };
+static symbol s_2_4[3] = { 'l', 'i', 'g' };
+static symbol s_2_5[4] = { 'e', 'l', 'i', 'g' };
+static symbol s_2_6[3] = { 'e', 'l', 's' };
+static symbol s_2_7[3] = { 'l', 'o', 'v' };
+static symbol s_2_8[4] = { 'e', 'l', 'o', 'v' };
+static symbol s_2_9[4] = { 's', 'l', 'o', 'v' };
+static symbol s_2_10[7] = { 'h', 'e', 't', 's', 'l', 'o', 'v' };
+
+static struct among a_2[11] =
+{
+/*  0 */ { 3, s_2_0, -1, 1, 0},
+/*  1 */ { 4, s_2_1, 0, 1, 0},
+/*  2 */ { 2, s_2_2, -1, 1, 0},
+/*  3 */ { 3, s_2_3, 2, 1, 0},
+/*  4 */ { 3, s_2_4, 2, 1, 0},
+/*  5 */ { 4, s_2_5, 4, 1, 0},
+/*  6 */ { 3, s_2_6, -1, 1, 0},
+/*  7 */ { 3, s_2_7, -1, 1, 0},
+/*  8 */ { 4, s_2_8, 7, 1, 0},
+/*  9 */ { 4, s_2_9, 7, 1, 0},
+/* 10 */ { 7, s_2_10, 9, 1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128 };
+
+static unsigned char g_s_ending[] = { 119, 125, 149, 1 };
+
+static symbol s_0[] = { 'k' };
+static symbol s_1[] = { 'e', 'r' };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    {   int c_test = z->c; /* test, line 30 */
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, + 3);
+            if (c < 0) return 0;
+            z->c = c; /* hop, line 30 */
+        }
+        z->I[1] = z->c; /* setmark x, line 30 */
+        z->c = c_test;
+    }
+    while(1) { /* goto, line 31 */
+        int c = z->c;
+        if (!(in_grouping_U(z, g_v, 97, 248))) goto lab0;
+        z->c = c;
+        break;
+    lab0:
+        z->c = c;
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* goto, line 31 */
+        }
+    }
+    while(1) { /* gopast, line 31 */
+        if (!(out_grouping_U(z, g_v, 97, 248))) goto lab1;
+        break;
+    lab1:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 31 */
+        }
+    }
+    z->I[0] = z->c; /* setmark p1, line 31 */
+     /* try, line 32 */
+    if (!(z->I[0] < z->I[1])) goto lab2;
+    z->I[0] = z->I[1];
+lab2:
+    return 1;
+}
+
+static int r_main_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 38 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 38 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 38 */
+        among_var = find_among_b(z, a_0, 29); /* substring, line 38 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 38 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 44 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m = z->l - z->c; (void) m; /* or, line 46 */
+                if (!(in_grouping_b_U(z, g_s_ending, 98, 122))) goto lab1;
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_0))) return 0;
+                if (!(out_grouping_b_U(z, g_v, 97, 248))) return 0;
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 46 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_1); /* <-, line 48 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_consonant_pair(struct SN_env * z) {
+    {   int m_test = z->l - z->c; /* test, line 53 */
+        {   int m3; /* setlimit, line 54 */
+            int m = z->l - z->c; (void) m;
+            if (z->c < z->I[0]) return 0;
+            z->c = z->I[0]; /* tomark, line 54 */
+            m3 = z->lb; z->lb = z->c;
+            z->c = z->l - m;
+            z->ket = z->c; /* [, line 54 */
+            if (!(find_among_b(z, a_1, 2))) { z->lb = m3; return 0; } /* substring, line 54 */
+            z->bra = z->c; /* ], line 54 */
+            z->lb = m3;
+        }
+        z->c = z->l - m_test;
+    }
+    {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+        if (c < 0) return 0;
+        z->c = c; /* next, line 59 */
+    }
+    z->bra = z->c; /* ], line 59 */
+    {   int ret;
+        ret = slice_del(z); /* delete, line 59 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_other_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 63 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 63 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 63 */
+        among_var = find_among_b(z, a_2, 11); /* substring, line 63 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 63 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 67 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+extern int norwegian_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 74 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 74 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 75 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 76 */
+        {   int ret = r_main_suffix(z);
+            if (ret == 0) goto lab1; /* call main_suffix, line 76 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 77 */
+        {   int ret = r_consonant_pair(z);
+            if (ret == 0) goto lab2; /* call consonant_pair, line 77 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 78 */
+        {   int ret = r_other_suffix(z);
+            if (ret == 0) goto lab3; /* call other_suffix, line 78 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * norwegian_UTF_8_create_env(void) { return SN_create_env(0, 2, 0); }
+
+extern void norwegian_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_norwegian.h b/libstemmer_c/src_c/stem_UTF_8_norwegian.h
new file mode 100644
index 0000000..c75444b
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_norwegian.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * norwegian_UTF_8_create_env(void);
+extern void norwegian_UTF_8_close_env(struct SN_env * z);
+
+extern int norwegian_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_porter.c b/libstemmer_c/src_c/stem_UTF_8_porter.c
new file mode 100644
index 0000000..1d22e71
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_porter.c
@@ -0,0 +1,794 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int porter_UTF_8_stem(struct SN_env * z);
+static int r_Step_5b(struct SN_env * z);
+static int r_Step_5a(struct SN_env * z);
+static int r_Step_4(struct SN_env * z);
+static int r_Step_3(struct SN_env * z);
+static int r_Step_2(struct SN_env * z);
+static int r_Step_1c(struct SN_env * z);
+static int r_Step_1b(struct SN_env * z);
+static int r_Step_1a(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_shortv(struct SN_env * z);
+
+extern struct SN_env * porter_UTF_8_create_env(void);
+extern void porter_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_0[1] = { 's' };
+static symbol s_0_1[3] = { 'i', 'e', 's' };
+static symbol s_0_2[4] = { 's', 's', 'e', 's' };
+static symbol s_0_3[2] = { 's', 's' };
+
+static struct among a_0[4] =
+{
+/*  0 */ { 1, s_0_0, -1, 3, 0},
+/*  1 */ { 3, s_0_1, 0, 2, 0},
+/*  2 */ { 4, s_0_2, 0, 1, 0},
+/*  3 */ { 2, s_0_3, 0, -1, 0}
+};
+
+static symbol s_1_1[2] = { 'b', 'b' };
+static symbol s_1_2[2] = { 'd', 'd' };
+static symbol s_1_3[2] = { 'f', 'f' };
+static symbol s_1_4[2] = { 'g', 'g' };
+static symbol s_1_5[2] = { 'b', 'l' };
+static symbol s_1_6[2] = { 'm', 'm' };
+static symbol s_1_7[2] = { 'n', 'n' };
+static symbol s_1_8[2] = { 'p', 'p' };
+static symbol s_1_9[2] = { 'r', 'r' };
+static symbol s_1_10[2] = { 'a', 't' };
+static symbol s_1_11[2] = { 't', 't' };
+static symbol s_1_12[2] = { 'i', 'z' };
+
+static struct among a_1[13] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 2, s_1_1, 0, 2, 0},
+/*  2 */ { 2, s_1_2, 0, 2, 0},
+/*  3 */ { 2, s_1_3, 0, 2, 0},
+/*  4 */ { 2, s_1_4, 0, 2, 0},
+/*  5 */ { 2, s_1_5, 0, 1, 0},
+/*  6 */ { 2, s_1_6, 0, 2, 0},
+/*  7 */ { 2, s_1_7, 0, 2, 0},
+/*  8 */ { 2, s_1_8, 0, 2, 0},
+/*  9 */ { 2, s_1_9, 0, 2, 0},
+/* 10 */ { 2, s_1_10, 0, 1, 0},
+/* 11 */ { 2, s_1_11, 0, 2, 0},
+/* 12 */ { 2, s_1_12, 0, 1, 0}
+};
+
+static symbol s_2_0[2] = { 'e', 'd' };
+static symbol s_2_1[3] = { 'e', 'e', 'd' };
+static symbol s_2_2[3] = { 'i', 'n', 'g' };
+
+static struct among a_2[3] =
+{
+/*  0 */ { 2, s_2_0, -1, 2, 0},
+/*  1 */ { 3, s_2_1, 0, 1, 0},
+/*  2 */ { 3, s_2_2, -1, 2, 0}
+};
+
+static symbol s_3_0[4] = { 'a', 'n', 'c', 'i' };
+static symbol s_3_1[4] = { 'e', 'n', 'c', 'i' };
+static symbol s_3_2[4] = { 'a', 'b', 'l', 'i' };
+static symbol s_3_3[3] = { 'e', 'l', 'i' };
+static symbol s_3_4[4] = { 'a', 'l', 'l', 'i' };
+static symbol s_3_5[5] = { 'o', 'u', 's', 'l', 'i' };
+static symbol s_3_6[5] = { 'e', 'n', 't', 'l', 'i' };
+static symbol s_3_7[5] = { 'a', 'l', 'i', 't', 'i' };
+static symbol s_3_8[6] = { 'b', 'i', 'l', 'i', 't', 'i' };
+static symbol s_3_9[5] = { 'i', 'v', 'i', 't', 'i' };
+static symbol s_3_10[6] = { 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_3_11[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' };
+static symbol s_3_12[5] = { 'a', 'l', 'i', 's', 'm' };
+static symbol s_3_13[5] = { 'a', 't', 'i', 'o', 'n' };
+static symbol s_3_14[7] = { 'i', 'z', 'a', 't', 'i', 'o', 'n' };
+static symbol s_3_15[4] = { 'i', 'z', 'e', 'r' };
+static symbol s_3_16[4] = { 'a', 't', 'o', 'r' };
+static symbol s_3_17[7] = { 'i', 'v', 'e', 'n', 'e', 's', 's' };
+static symbol s_3_18[7] = { 'f', 'u', 'l', 'n', 'e', 's', 's' };
+static symbol s_3_19[7] = { 'o', 'u', 's', 'n', 'e', 's', 's' };
+
+static struct among a_3[20] =
+{
+/*  0 */ { 4, s_3_0, -1, 3, 0},
+/*  1 */ { 4, s_3_1, -1, 2, 0},
+/*  2 */ { 4, s_3_2, -1, 4, 0},
+/*  3 */ { 3, s_3_3, -1, 6, 0},
+/*  4 */ { 4, s_3_4, -1, 9, 0},
+/*  5 */ { 5, s_3_5, -1, 12, 0},
+/*  6 */ { 5, s_3_6, -1, 5, 0},
+/*  7 */ { 5, s_3_7, -1, 10, 0},
+/*  8 */ { 6, s_3_8, -1, 14, 0},
+/*  9 */ { 5, s_3_9, -1, 13, 0},
+/* 10 */ { 6, s_3_10, -1, 1, 0},
+/* 11 */ { 7, s_3_11, 10, 8, 0},
+/* 12 */ { 5, s_3_12, -1, 10, 0},
+/* 13 */ { 5, s_3_13, -1, 8, 0},
+/* 14 */ { 7, s_3_14, 13, 7, 0},
+/* 15 */ { 4, s_3_15, -1, 7, 0},
+/* 16 */ { 4, s_3_16, -1, 8, 0},
+/* 17 */ { 7, s_3_17, -1, 13, 0},
+/* 18 */ { 7, s_3_18, -1, 11, 0},
+/* 19 */ { 7, s_3_19, -1, 12, 0}
+};
+
+static symbol s_4_0[5] = { 'i', 'c', 'a', 't', 'e' };
+static symbol s_4_1[5] = { 'a', 't', 'i', 'v', 'e' };
+static symbol s_4_2[5] = { 'a', 'l', 'i', 'z', 'e' };
+static symbol s_4_3[5] = { 'i', 'c', 'i', 't', 'i' };
+static symbol s_4_4[4] = { 'i', 'c', 'a', 'l' };
+static symbol s_4_5[3] = { 'f', 'u', 'l' };
+static symbol s_4_6[4] = { 'n', 'e', 's', 's' };
+
+static struct among a_4[7] =
+{
+/*  0 */ { 5, s_4_0, -1, 2, 0},
+/*  1 */ { 5, s_4_1, -1, 3, 0},
+/*  2 */ { 5, s_4_2, -1, 1, 0},
+/*  3 */ { 5, s_4_3, -1, 2, 0},
+/*  4 */ { 4, s_4_4, -1, 2, 0},
+/*  5 */ { 3, s_4_5, -1, 3, 0},
+/*  6 */ { 4, s_4_6, -1, 3, 0}
+};
+
+static symbol s_5_0[2] = { 'i', 'c' };
+static symbol s_5_1[4] = { 'a', 'n', 'c', 'e' };
+static symbol s_5_2[4] = { 'e', 'n', 'c', 'e' };
+static symbol s_5_3[4] = { 'a', 'b', 'l', 'e' };
+static symbol s_5_4[4] = { 'i', 'b', 'l', 'e' };
+static symbol s_5_5[3] = { 'a', 't', 'e' };
+static symbol s_5_6[3] = { 'i', 'v', 'e' };
+static symbol s_5_7[3] = { 'i', 'z', 'e' };
+static symbol s_5_8[3] = { 'i', 't', 'i' };
+static symbol s_5_9[2] = { 'a', 'l' };
+static symbol s_5_10[3] = { 'i', 's', 'm' };
+static symbol s_5_11[3] = { 'i', 'o', 'n' };
+static symbol s_5_12[2] = { 'e', 'r' };
+static symbol s_5_13[3] = { 'o', 'u', 's' };
+static symbol s_5_14[3] = { 'a', 'n', 't' };
+static symbol s_5_15[3] = { 'e', 'n', 't' };
+static symbol s_5_16[4] = { 'm', 'e', 'n', 't' };
+static symbol s_5_17[5] = { 'e', 'm', 'e', 'n', 't' };
+static symbol s_5_18[2] = { 'o', 'u' };
+
+static struct among a_5[19] =
+{
+/*  0 */ { 2, s_5_0, -1, 1, 0},
+/*  1 */ { 4, s_5_1, -1, 1, 0},
+/*  2 */ { 4, s_5_2, -1, 1, 0},
+/*  3 */ { 4, s_5_3, -1, 1, 0},
+/*  4 */ { 4, s_5_4, -1, 1, 0},
+/*  5 */ { 3, s_5_5, -1, 1, 0},
+/*  6 */ { 3, s_5_6, -1, 1, 0},
+/*  7 */ { 3, s_5_7, -1, 1, 0},
+/*  8 */ { 3, s_5_8, -1, 1, 0},
+/*  9 */ { 2, s_5_9, -1, 1, 0},
+/* 10 */ { 3, s_5_10, -1, 1, 0},
+/* 11 */ { 3, s_5_11, -1, 2, 0},
+/* 12 */ { 2, s_5_12, -1, 1, 0},
+/* 13 */ { 3, s_5_13, -1, 1, 0},
+/* 14 */ { 3, s_5_14, -1, 1, 0},
+/* 15 */ { 3, s_5_15, -1, 1, 0},
+/* 16 */ { 4, s_5_16, 15, 1, 0},
+/* 17 */ { 5, s_5_17, 16, 1, 0},
+/* 18 */ { 2, s_5_18, -1, 1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1 };
+
+static unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 };
+
+static symbol s_0[] = { 's', 's' };
+static symbol s_1[] = { 'i' };
+static symbol s_2[] = { 'e', 'e' };
+static symbol s_3[] = { 'e' };
+static symbol s_4[] = { 'e' };
+static symbol s_5[] = { 'y' };
+static symbol s_6[] = { 'Y' };
+static symbol s_7[] = { 'i' };
+static symbol s_8[] = { 't', 'i', 'o', 'n' };
+static symbol s_9[] = { 'e', 'n', 'c', 'e' };
+static symbol s_10[] = { 'a', 'n', 'c', 'e' };
+static symbol s_11[] = { 'a', 'b', 'l', 'e' };
+static symbol s_12[] = { 'e', 'n', 't' };
+static symbol s_13[] = { 'e' };
+static symbol s_14[] = { 'i', 'z', 'e' };
+static symbol s_15[] = { 'a', 't', 'e' };
+static symbol s_16[] = { 'a', 'l' };
+static symbol s_17[] = { 'a', 'l' };
+static symbol s_18[] = { 'f', 'u', 'l' };
+static symbol s_19[] = { 'o', 'u', 's' };
+static symbol s_20[] = { 'i', 'v', 'e' };
+static symbol s_21[] = { 'b', 'l', 'e' };
+static symbol s_22[] = { 'a', 'l' };
+static symbol s_23[] = { 'i', 'c' };
+static symbol s_24[] = { 's' };
+static symbol s_25[] = { 't' };
+static symbol s_26[] = { 'e' };
+static symbol s_27[] = { 'l' };
+static symbol s_28[] = { 'l' };
+static symbol s_29[] = { 'y' };
+static symbol s_30[] = { 'Y' };
+static symbol s_31[] = { 'y' };
+static symbol s_32[] = { 'Y' };
+static symbol s_33[] = { 'Y' };
+static symbol s_34[] = { 'y' };
+
+static int r_shortv(struct SN_env * z) {
+    if (!(out_grouping_b_U(z, g_v_WXY, 89, 121))) return 0;
+    if (!(in_grouping_b_U(z, g_v, 97, 121))) return 0;
+    if (!(out_grouping_b_U(z, g_v, 97, 121))) return 0;
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_Step_1a(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 25 */
+    among_var = find_among_b(z, a_0, 4); /* substring, line 25 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 25 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_0); /* <-, line 26 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 1, s_1); /* <-, line 27 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 29 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_1b(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 34 */
+    among_var = find_among_b(z, a_2, 3); /* substring, line 34 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 34 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 35 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 2, s_2); /* <-, line 35 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m_test = z->l - z->c; /* test, line 38 */
+                while(1) { /* gopast, line 38 */
+                    if (!(in_grouping_b_U(z, g_v, 97, 121))) goto lab0;
+                    break;
+                lab0:
+                    {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+                        if (c < 0) return 0;
+                        z->c = c; /* gopast, line 38 */
+                    }
+                }
+                z->c = z->l - m_test;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 38 */
+                if (ret < 0) return ret;
+            }
+            {   int m_test = z->l - z->c; /* test, line 39 */
+                among_var = find_among_b(z, a_1, 13); /* substring, line 39 */
+                if (!(among_var)) return 0;
+                z->c = z->l - m_test;
+            }
+            switch(among_var) {
+                case 0: return 0;
+                case 1:
+                    {   int ret;
+                        {   int c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_3); /* <+, line 41 */
+                            z->c = c;
+                        }
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 2:
+                    z->ket = z->c; /* [, line 44 */
+                    {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+                        if (c < 0) return 0;
+                        z->c = c; /* next, line 44 */
+                    }
+                    z->bra = z->c; /* ], line 44 */
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 44 */
+                        if (ret < 0) return ret;
+                    }
+                    break;
+                case 3:
+                    if (z->c != z->I[0]) return 0; /* atmark, line 45 */
+                    {   int m_test = z->l - z->c; /* test, line 45 */
+                        {   int ret = r_shortv(z);
+                            if (ret == 0) return 0; /* call shortv, line 45 */
+                            if (ret < 0) return ret;
+                        }
+                        z->c = z->l - m_test;
+                    }
+                    {   int ret;
+                        {   int c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_4); /* <+, line 45 */
+                            z->c = c;
+                        }
+                        if (ret < 0) return ret;
+                    }
+                    break;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_1c(struct SN_env * z) {
+    z->ket = z->c; /* [, line 52 */
+    {   int m = z->l - z->c; (void) m; /* or, line 52 */
+        if (!(eq_s_b(z, 1, s_5))) goto lab1;
+        goto lab0;
+    lab1:
+        z->c = z->l - m;
+        if (!(eq_s_b(z, 1, s_6))) return 0;
+    }
+lab0:
+    z->bra = z->c; /* ], line 52 */
+    while(1) { /* gopast, line 53 */
+        if (!(in_grouping_b_U(z, g_v, 97, 121))) goto lab2;
+        break;
+    lab2:
+        {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 53 */
+        }
+    }
+    {   int ret;
+        ret = slice_from_s(z, 1, s_7); /* <-, line 54 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_Step_2(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 58 */
+    among_var = find_among_b(z, a_3, 20); /* substring, line 58 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 58 */
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 58 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_8); /* <-, line 59 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_9); /* <-, line 60 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_10); /* <-, line 61 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret;
+                ret = slice_from_s(z, 4, s_11); /* <-, line 62 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_12); /* <-, line 63 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret;
+                ret = slice_from_s(z, 1, s_13); /* <-, line 64 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 7:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_14); /* <-, line 66 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 8:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_15); /* <-, line 68 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 9:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_16); /* <-, line 69 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 10:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_17); /* <-, line 71 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 11:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_18); /* <-, line 72 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 12:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_19); /* <-, line 74 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 13:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_20); /* <-, line 76 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 14:
+            {   int ret;
+                ret = slice_from_s(z, 3, s_21); /* <-, line 77 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_3(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 82 */
+    among_var = find_among_b(z, a_4, 7); /* substring, line 82 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 82 */
+    {   int ret = r_R1(z);
+        if (ret == 0) return 0; /* call R1, line 82 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_22); /* <-, line 83 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 2, s_23); /* <-, line 85 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 87 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_4(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 92 */
+    among_var = find_among_b(z, a_5, 19); /* substring, line 92 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 92 */
+    {   int ret = r_R2(z);
+        if (ret == 0) return 0; /* call R2, line 92 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 95 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int m = z->l - z->c; (void) m; /* or, line 96 */
+                if (!(eq_s_b(z, 1, s_24))) goto lab1;
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_25))) return 0;
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 96 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_Step_5a(struct SN_env * z) {
+    z->ket = z->c; /* [, line 101 */
+    if (!(eq_s_b(z, 1, s_26))) return 0;
+    z->bra = z->c; /* ], line 101 */
+    {   int m = z->l - z->c; (void) m; /* or, line 102 */
+        {   int ret = r_R2(z);
+            if (ret == 0) goto lab1; /* call R2, line 102 */
+            if (ret < 0) return ret;
+        }
+        goto lab0;
+    lab1:
+        z->c = z->l - m;
+        {   int ret = r_R1(z);
+            if (ret == 0) return 0; /* call R1, line 102 */
+            if (ret < 0) return ret;
+        }
+        {   int m = z->l - z->c; (void) m; /* not, line 102 */
+            {   int ret = r_shortv(z);
+                if (ret == 0) goto lab2; /* call shortv, line 102 */
+                if (ret < 0) return ret;
+            }
+            return 0;
+        lab2:
+            z->c = z->l - m;
+        }
+    }
+lab0:
+    {   int ret;
+        ret = slice_del(z); /* delete, line 103 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_Step_5b(struct SN_env * z) {
+    z->ket = z->c; /* [, line 107 */
+    if (!(eq_s_b(z, 1, s_27))) return 0;
+    z->bra = z->c; /* ], line 107 */
+    {   int ret = r_R2(z);
+        if (ret == 0) return 0; /* call R2, line 108 */
+        if (ret < 0) return ret;
+    }
+    if (!(eq_s_b(z, 1, s_28))) return 0;
+    {   int ret;
+        ret = slice_del(z); /* delete, line 109 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+extern int porter_UTF_8_stem(struct SN_env * z) {
+    z->B[0] = 0; /* unset Y_found, line 115 */
+    {   int c = z->c; /* do, line 116 */
+        z->bra = z->c; /* [, line 116 */
+        if (!(eq_s(z, 1, s_29))) goto lab0;
+        z->ket = z->c; /* ], line 116 */
+        {   int ret;
+            ret = slice_from_s(z, 1, s_30); /* <-, line 116 */
+            if (ret < 0) return ret;
+        }
+        z->B[0] = 1; /* set Y_found, line 116 */
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 117 */
+        while(1) { /* repeat, line 117 */
+            int c = z->c;
+            while(1) { /* goto, line 117 */
+                int c = z->c;
+                if (!(in_grouping_U(z, g_v, 97, 121))) goto lab3;
+                z->bra = z->c; /* [, line 117 */
+                if (!(eq_s(z, 1, s_31))) goto lab3;
+                z->ket = z->c; /* ], line 117 */
+                z->c = c;
+                break;
+            lab3:
+                z->c = c;
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab2;
+                    z->c = c; /* goto, line 117 */
+                }
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_32); /* <-, line 117 */
+                if (ret < 0) return ret;
+            }
+            z->B[0] = 1; /* set Y_found, line 117 */
+            continue;
+        lab2:
+            z->c = c;
+            break;
+        }
+        z->c = c;
+    }
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    {   int c = z->c; /* do, line 121 */
+        while(1) { /* gopast, line 122 */
+            if (!(in_grouping_U(z, g_v, 97, 121))) goto lab5;
+            break;
+        lab5:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab4;
+                z->c = c; /* gopast, line 122 */
+            }
+        }
+        while(1) { /* gopast, line 122 */
+            if (!(out_grouping_U(z, g_v, 97, 121))) goto lab6;
+            break;
+        lab6:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab4;
+                z->c = c; /* gopast, line 122 */
+            }
+        }
+        z->I[0] = z->c; /* setmark p1, line 122 */
+        while(1) { /* gopast, line 123 */
+            if (!(in_grouping_U(z, g_v, 97, 121))) goto lab7;
+            break;
+        lab7:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab4;
+                z->c = c; /* gopast, line 123 */
+            }
+        }
+        while(1) { /* gopast, line 123 */
+            if (!(out_grouping_U(z, g_v, 97, 121))) goto lab8;
+            break;
+        lab8:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab4;
+                z->c = c; /* gopast, line 123 */
+            }
+        }
+        z->I[1] = z->c; /* setmark p2, line 123 */
+    lab4:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 126 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 127 */
+        {   int ret = r_Step_1a(z);
+            if (ret == 0) goto lab9; /* call Step_1a, line 127 */
+            if (ret < 0) return ret;
+        }
+    lab9:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 128 */
+        {   int ret = r_Step_1b(z);
+            if (ret == 0) goto lab10; /* call Step_1b, line 128 */
+            if (ret < 0) return ret;
+        }
+    lab10:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 129 */
+        {   int ret = r_Step_1c(z);
+            if (ret == 0) goto lab11; /* call Step_1c, line 129 */
+            if (ret < 0) return ret;
+        }
+    lab11:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 130 */
+        {   int ret = r_Step_2(z);
+            if (ret == 0) goto lab12; /* call Step_2, line 130 */
+            if (ret < 0) return ret;
+        }
+    lab12:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 131 */
+        {   int ret = r_Step_3(z);
+            if (ret == 0) goto lab13; /* call Step_3, line 131 */
+            if (ret < 0) return ret;
+        }
+    lab13:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 132 */
+        {   int ret = r_Step_4(z);
+            if (ret == 0) goto lab14; /* call Step_4, line 132 */
+            if (ret < 0) return ret;
+        }
+    lab14:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 133 */
+        {   int ret = r_Step_5a(z);
+            if (ret == 0) goto lab15; /* call Step_5a, line 133 */
+            if (ret < 0) return ret;
+        }
+    lab15:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 134 */
+        {   int ret = r_Step_5b(z);
+            if (ret == 0) goto lab16; /* call Step_5b, line 134 */
+            if (ret < 0) return ret;
+        }
+    lab16:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 137 */
+        if (!(z->B[0])) goto lab17; /* Boolean test Y_found, line 137 */
+        while(1) { /* repeat, line 137 */
+            int c = z->c;
+            while(1) { /* goto, line 137 */
+                int c = z->c;
+                z->bra = z->c; /* [, line 137 */
+                if (!(eq_s(z, 1, s_33))) goto lab19;
+                z->ket = z->c; /* ], line 137 */
+                z->c = c;
+                break;
+            lab19:
+                z->c = c;
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab18;
+                    z->c = c; /* goto, line 137 */
+                }
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_34); /* <-, line 137 */
+                if (ret < 0) return ret;
+            }
+            continue;
+        lab18:
+            z->c = c;
+            break;
+        }
+    lab17:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * porter_UTF_8_create_env(void) { return SN_create_env(0, 2, 1); }
+
+extern void porter_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_porter.h b/libstemmer_c/src_c/stem_UTF_8_porter.h
new file mode 100644
index 0000000..82d469a
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_porter.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * porter_UTF_8_create_env(void);
+extern void porter_UTF_8_close_env(struct SN_env * z);
+
+extern int porter_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_portuguese.c b/libstemmer_c/src_c/stem_UTF_8_portuguese.c
new file mode 100644
index 0000000..e288544
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_portuguese.c
@@ -0,0 +1,1055 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int portuguese_UTF_8_stem(struct SN_env * z);
+static int r_residual_form(struct SN_env * z);
+static int r_residual_suffix(struct SN_env * z);
+static int r_verb_suffix(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_RV(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+static int r_prelude(struct SN_env * z);
+
+extern struct SN_env * portuguese_UTF_8_create_env(void);
+extern void portuguese_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_1[2] = { 0xC3, 0xA3 };
+static symbol s_0_2[2] = { 0xC3, 0xB5 };
+
+static struct among a_0[3] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 2, s_0_1, 0, 1, 0},
+/*  2 */ { 2, s_0_2, 0, 2, 0}
+};
+
+static symbol s_1_1[2] = { 'a', '~' };
+static symbol s_1_2[2] = { 'o', '~' };
+
+static struct among a_1[3] =
+{
+/*  0 */ { 0, 0, -1, 3, 0},
+/*  1 */ { 2, s_1_1, 0, 1, 0},
+/*  2 */ { 2, s_1_2, 0, 2, 0}
+};
+
+static symbol s_2_0[2] = { 'i', 'c' };
+static symbol s_2_1[2] = { 'a', 'd' };
+static symbol s_2_2[2] = { 'o', 's' };
+static symbol s_2_3[2] = { 'i', 'v' };
+
+static struct among a_2[4] =
+{
+/*  0 */ { 2, s_2_0, -1, -1, 0},
+/*  1 */ { 2, s_2_1, -1, -1, 0},
+/*  2 */ { 2, s_2_2, -1, -1, 0},
+/*  3 */ { 2, s_2_3, -1, 1, 0}
+};
+
+static symbol s_3_0[4] = { 'a', 'n', 't', 'e' };
+static symbol s_3_1[4] = { 'a', 'v', 'e', 'l' };
+static symbol s_3_2[5] = { 0xC3, 0xAD, 'v', 'e', 'l' };
+
+static struct among a_3[3] =
+{
+/*  0 */ { 4, s_3_0, -1, 1, 0},
+/*  1 */ { 4, s_3_1, -1, 1, 0},
+/*  2 */ { 5, s_3_2, -1, 1, 0}
+};
+
+static symbol s_4_0[2] = { 'i', 'c' };
+static symbol s_4_1[4] = { 'a', 'b', 'i', 'l' };
+static symbol s_4_2[2] = { 'i', 'v' };
+
+static struct among a_4[3] =
+{
+/*  0 */ { 2, s_4_0, -1, 1, 0},
+/*  1 */ { 4, s_4_1, -1, 1, 0},
+/*  2 */ { 2, s_4_2, -1, 1, 0}
+};
+
+static symbol s_5_0[3] = { 'i', 'c', 'a' };
+static symbol s_5_1[6] = { 0xC3, 0xA2, 'n', 'c', 'i', 'a' };
+static symbol s_5_2[6] = { 0xC3, 0xAA, 'n', 'c', 'i', 'a' };
+static symbol s_5_3[3] = { 'i', 'r', 'a' };
+static symbol s_5_4[5] = { 'a', 'd', 'o', 'r', 'a' };
+static symbol s_5_5[3] = { 'o', 's', 'a' };
+static symbol s_5_6[4] = { 'i', 's', 't', 'a' };
+static symbol s_5_7[3] = { 'i', 'v', 'a' };
+static symbol s_5_8[3] = { 'e', 'z', 'a' };
+static symbol s_5_9[6] = { 'l', 'o', 'g', 0xC3, 0xAD, 'a' };
+static symbol s_5_10[5] = { 'i', 'd', 'a', 'd', 'e' };
+static symbol s_5_11[4] = { 'a', 'n', 't', 'e' };
+static symbol s_5_12[5] = { 'm', 'e', 'n', 't', 'e' };
+static symbol s_5_13[6] = { 'a', 'm', 'e', 'n', 't', 'e' };
+static symbol s_5_14[5] = { 0xC3, 0xA1, 'v', 'e', 'l' };
+static symbol s_5_15[5] = { 0xC3, 0xAD, 'v', 'e', 'l' };
+static symbol s_5_16[6] = { 'u', 'c', 'i', 0xC3, 0xB3, 'n' };
+static symbol s_5_17[3] = { 'i', 'c', 'o' };
+static symbol s_5_18[4] = { 'i', 's', 'm', 'o' };
+static symbol s_5_19[3] = { 'o', 's', 'o' };
+static symbol s_5_20[6] = { 'a', 'm', 'e', 'n', 't', 'o' };
+static symbol s_5_21[6] = { 'i', 'm', 'e', 'n', 't', 'o' };
+static symbol s_5_22[3] = { 'i', 'v', 'o' };
+static symbol s_5_23[6] = { 'a', 0xC3, 0xA7, 'a', '~', 'o' };
+static symbol s_5_24[4] = { 'a', 'd', 'o', 'r' };
+static symbol s_5_25[4] = { 'i', 'c', 'a', 's' };
+static symbol s_5_26[7] = { 0xC3, 0xAA, 'n', 'c', 'i', 'a', 's' };
+static symbol s_5_27[4] = { 'i', 'r', 'a', 's' };
+static symbol s_5_28[6] = { 'a', 'd', 'o', 'r', 'a', 's' };
+static symbol s_5_29[4] = { 'o', 's', 'a', 's' };
+static symbol s_5_30[5] = { 'i', 's', 't', 'a', 's' };
+static symbol s_5_31[4] = { 'i', 'v', 'a', 's' };
+static symbol s_5_32[4] = { 'e', 'z', 'a', 's' };
+static symbol s_5_33[7] = { 'l', 'o', 'g', 0xC3, 0xAD, 'a', 's' };
+static symbol s_5_34[6] = { 'i', 'd', 'a', 'd', 'e', 's' };
+static symbol s_5_35[7] = { 'u', 'c', 'i', 'o', 'n', 'e', 's' };
+static symbol s_5_36[6] = { 'a', 'd', 'o', 'r', 'e', 's' };
+static symbol s_5_37[5] = { 'a', 'n', 't', 'e', 's' };
+static symbol s_5_38[7] = { 'a', 0xC3, 0xA7, 'o', '~', 'e', 's' };
+static symbol s_5_39[4] = { 'i', 'c', 'o', 's' };
+static symbol s_5_40[5] = { 'i', 's', 'm', 'o', 's' };
+static symbol s_5_41[4] = { 'o', 's', 'o', 's' };
+static symbol s_5_42[7] = { 'a', 'm', 'e', 'n', 't', 'o', 's' };
+static symbol s_5_43[7] = { 'i', 'm', 'e', 'n', 't', 'o', 's' };
+static symbol s_5_44[4] = { 'i', 'v', 'o', 's' };
+
+static struct among a_5[45] =
+{
+/*  0 */ { 3, s_5_0, -1, 1, 0},
+/*  1 */ { 6, s_5_1, -1, 1, 0},
+/*  2 */ { 6, s_5_2, -1, 4, 0},
+/*  3 */ { 3, s_5_3, -1, 9, 0},
+/*  4 */ { 5, s_5_4, -1, 1, 0},
+/*  5 */ { 3, s_5_5, -1, 1, 0},
+/*  6 */ { 4, s_5_6, -1, 1, 0},
+/*  7 */ { 3, s_5_7, -1, 8, 0},
+/*  8 */ { 3, s_5_8, -1, 1, 0},
+/*  9 */ { 6, s_5_9, -1, 2, 0},
+/* 10 */ { 5, s_5_10, -1, 7, 0},
+/* 11 */ { 4, s_5_11, -1, 1, 0},
+/* 12 */ { 5, s_5_12, -1, 6, 0},
+/* 13 */ { 6, s_5_13, 12, 5, 0},
+/* 14 */ { 5, s_5_14, -1, 1, 0},
+/* 15 */ { 5, s_5_15, -1, 1, 0},
+/* 16 */ { 6, s_5_16, -1, 3, 0},
+/* 17 */ { 3, s_5_17, -1, 1, 0},
+/* 18 */ { 4, s_5_18, -1, 1, 0},
+/* 19 */ { 3, s_5_19, -1, 1, 0},
+/* 20 */ { 6, s_5_20, -1, 1, 0},
+/* 21 */ { 6, s_5_21, -1, 1, 0},
+/* 22 */ { 3, s_5_22, -1, 8, 0},
+/* 23 */ { 6, s_5_23, -1, 1, 0},
+/* 24 */ { 4, s_5_24, -1, 1, 0},
+/* 25 */ { 4, s_5_25, -1, 1, 0},
+/* 26 */ { 7, s_5_26, -1, 4, 0},
+/* 27 */ { 4, s_5_27, -1, 9, 0},
+/* 28 */ { 6, s_5_28, -1, 1, 0},
+/* 29 */ { 4, s_5_29, -1, 1, 0},
+/* 30 */ { 5, s_5_30, -1, 1, 0},
+/* 31 */ { 4, s_5_31, -1, 8, 0},
+/* 32 */ { 4, s_5_32, -1, 1, 0},
+/* 33 */ { 7, s_5_33, -1, 2, 0},
+/* 34 */ { 6, s_5_34, -1, 7, 0},
+/* 35 */ { 7, s_5_35, -1, 3, 0},
+/* 36 */ { 6, s_5_36, -1, 1, 0},
+/* 37 */ { 5, s_5_37, -1, 1, 0},
+/* 38 */ { 7, s_5_38, -1, 1, 0},
+/* 39 */ { 4, s_5_39, -1, 1, 0},
+/* 40 */ { 5, s_5_40, -1, 1, 0},
+/* 41 */ { 4, s_5_41, -1, 1, 0},
+/* 42 */ { 7, s_5_42, -1, 1, 0},
+/* 43 */ { 7, s_5_43, -1, 1, 0},
+/* 44 */ { 4, s_5_44, -1, 8, 0}
+};
+
+static symbol s_6_0[3] = { 'a', 'd', 'a' };
+static symbol s_6_1[3] = { 'i', 'd', 'a' };
+static symbol s_6_2[2] = { 'i', 'a' };
+static symbol s_6_3[4] = { 'a', 'r', 'i', 'a' };
+static symbol s_6_4[4] = { 'e', 'r', 'i', 'a' };
+static symbol s_6_5[4] = { 'i', 'r', 'i', 'a' };
+static symbol s_6_6[3] = { 'a', 'r', 'a' };
+static symbol s_6_7[3] = { 'e', 'r', 'a' };
+static symbol s_6_8[3] = { 'i', 'r', 'a' };
+static symbol s_6_9[3] = { 'a', 'v', 'a' };
+static symbol s_6_10[4] = { 'a', 's', 's', 'e' };
+static symbol s_6_11[4] = { 'e', 's', 's', 'e' };
+static symbol s_6_12[4] = { 'i', 's', 's', 'e' };
+static symbol s_6_13[4] = { 'a', 's', 't', 'e' };
+static symbol s_6_14[4] = { 'e', 's', 't', 'e' };
+static symbol s_6_15[4] = { 'i', 's', 't', 'e' };
+static symbol s_6_16[2] = { 'e', 'i' };
+static symbol s_6_17[4] = { 'a', 'r', 'e', 'i' };
+static symbol s_6_18[4] = { 'e', 'r', 'e', 'i' };
+static symbol s_6_19[4] = { 'i', 'r', 'e', 'i' };
+static symbol s_6_20[2] = { 'a', 'm' };
+static symbol s_6_21[3] = { 'i', 'a', 'm' };
+static symbol s_6_22[5] = { 'a', 'r', 'i', 'a', 'm' };
+static symbol s_6_23[5] = { 'e', 'r', 'i', 'a', 'm' };
+static symbol s_6_24[5] = { 'i', 'r', 'i', 'a', 'm' };
+static symbol s_6_25[4] = { 'a', 'r', 'a', 'm' };
+static symbol s_6_26[4] = { 'e', 'r', 'a', 'm' };
+static symbol s_6_27[4] = { 'i', 'r', 'a', 'm' };
+static symbol s_6_28[4] = { 'a', 'v', 'a', 'm' };
+static symbol s_6_29[2] = { 'e', 'm' };
+static symbol s_6_30[4] = { 'a', 'r', 'e', 'm' };
+static symbol s_6_31[4] = { 'e', 'r', 'e', 'm' };
+static symbol s_6_32[4] = { 'i', 'r', 'e', 'm' };
+static symbol s_6_33[5] = { 'a', 's', 's', 'e', 'm' };
+static symbol s_6_34[5] = { 'e', 's', 's', 'e', 'm' };
+static symbol s_6_35[5] = { 'i', 's', 's', 'e', 'm' };
+static symbol s_6_36[3] = { 'a', 'd', 'o' };
+static symbol s_6_37[3] = { 'i', 'd', 'o' };
+static symbol s_6_38[4] = { 'a', 'n', 'd', 'o' };
+static symbol s_6_39[4] = { 'e', 'n', 'd', 'o' };
+static symbol s_6_40[4] = { 'i', 'n', 'd', 'o' };
+static symbol s_6_41[5] = { 'a', 'r', 'a', '~', 'o' };
+static symbol s_6_42[5] = { 'e', 'r', 'a', '~', 'o' };
+static symbol s_6_43[5] = { 'i', 'r', 'a', '~', 'o' };
+static symbol s_6_44[2] = { 'a', 'r' };
+static symbol s_6_45[2] = { 'e', 'r' };
+static symbol s_6_46[2] = { 'i', 'r' };
+static symbol s_6_47[2] = { 'a', 's' };
+static symbol s_6_48[4] = { 'a', 'd', 'a', 's' };
+static symbol s_6_49[4] = { 'i', 'd', 'a', 's' };
+static symbol s_6_50[3] = { 'i', 'a', 's' };
+static symbol s_6_51[5] = { 'a', 'r', 'i', 'a', 's' };
+static symbol s_6_52[5] = { 'e', 'r', 'i', 'a', 's' };
+static symbol s_6_53[5] = { 'i', 'r', 'i', 'a', 's' };
+static symbol s_6_54[4] = { 'a', 'r', 'a', 's' };
+static symbol s_6_55[4] = { 'e', 'r', 'a', 's' };
+static symbol s_6_56[4] = { 'i', 'r', 'a', 's' };
+static symbol s_6_57[4] = { 'a', 'v', 'a', 's' };
+static symbol s_6_58[2] = { 'e', 's' };
+static symbol s_6_59[5] = { 'a', 'r', 'd', 'e', 's' };
+static symbol s_6_60[5] = { 'e', 'r', 'd', 'e', 's' };
+static symbol s_6_61[5] = { 'i', 'r', 'd', 'e', 's' };
+static symbol s_6_62[4] = { 'a', 'r', 'e', 's' };
+static symbol s_6_63[4] = { 'e', 'r', 'e', 's' };
+static symbol s_6_64[4] = { 'i', 'r', 'e', 's' };
+static symbol s_6_65[5] = { 'a', 's', 's', 'e', 's' };
+static symbol s_6_66[5] = { 'e', 's', 's', 'e', 's' };
+static symbol s_6_67[5] = { 'i', 's', 's', 'e', 's' };
+static symbol s_6_68[5] = { 'a', 's', 't', 'e', 's' };
+static symbol s_6_69[5] = { 'e', 's', 't', 'e', 's' };
+static symbol s_6_70[5] = { 'i', 's', 't', 'e', 's' };
+static symbol s_6_71[2] = { 'i', 's' };
+static symbol s_6_72[3] = { 'a', 'i', 's' };
+static symbol s_6_73[3] = { 'e', 'i', 's' };
+static symbol s_6_74[5] = { 'a', 'r', 'e', 'i', 's' };
+static symbol s_6_75[5] = { 'e', 'r', 'e', 'i', 's' };
+static symbol s_6_76[5] = { 'i', 'r', 'e', 'i', 's' };
+static symbol s_6_77[6] = { 0xC3, 0xA1, 'r', 'e', 'i', 's' };
+static symbol s_6_78[6] = { 0xC3, 0xA9, 'r', 'e', 'i', 's' };
+static symbol s_6_79[6] = { 0xC3, 0xAD, 'r', 'e', 'i', 's' };
+static symbol s_6_80[7] = { 0xC3, 0xA1, 's', 's', 'e', 'i', 's' };
+static symbol s_6_81[7] = { 0xC3, 0xA9, 's', 's', 'e', 'i', 's' };
+static symbol s_6_82[7] = { 0xC3, 0xAD, 's', 's', 'e', 'i', 's' };
+static symbol s_6_83[6] = { 0xC3, 0xA1, 'v', 'e', 'i', 's' };
+static symbol s_6_84[5] = { 0xC3, 0xAD, 'e', 'i', 's' };
+static symbol s_6_85[7] = { 'a', 'r', 0xC3, 0xAD, 'e', 'i', 's' };
+static symbol s_6_86[7] = { 'e', 'r', 0xC3, 0xAD, 'e', 'i', 's' };
+static symbol s_6_87[7] = { 'i', 'r', 0xC3, 0xAD, 'e', 'i', 's' };
+static symbol s_6_88[4] = { 'a', 'd', 'o', 's' };
+static symbol s_6_89[4] = { 'i', 'd', 'o', 's' };
+static symbol s_6_90[4] = { 'a', 'm', 'o', 's' };
+static symbol s_6_91[7] = { 0xC3, 0xA1, 'r', 'a', 'm', 'o', 's' };
+static symbol s_6_92[7] = { 0xC3, 0xA9, 'r', 'a', 'm', 'o', 's' };
+static symbol s_6_93[7] = { 0xC3, 0xAD, 'r', 'a', 'm', 'o', 's' };
+static symbol s_6_94[7] = { 0xC3, 0xA1, 'v', 'a', 'm', 'o', 's' };
+static symbol s_6_95[6] = { 0xC3, 0xAD, 'a', 'm', 'o', 's' };
+static symbol s_6_96[8] = { 'a', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' };
+static symbol s_6_97[8] = { 'e', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' };
+static symbol s_6_98[8] = { 'i', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' };
+static symbol s_6_99[4] = { 'e', 'm', 'o', 's' };
+static symbol s_6_100[6] = { 'a', 'r', 'e', 'm', 'o', 's' };
+static symbol s_6_101[6] = { 'e', 'r', 'e', 'm', 'o', 's' };
+static symbol s_6_102[6] = { 'i', 'r', 'e', 'm', 'o', 's' };
+static symbol s_6_103[8] = { 0xC3, 0xA1, 's', 's', 'e', 'm', 'o', 's' };
+static symbol s_6_104[8] = { 0xC3, 0xAA, 's', 's', 'e', 'm', 'o', 's' };
+static symbol s_6_105[8] = { 0xC3, 0xAD, 's', 's', 'e', 'm', 'o', 's' };
+static symbol s_6_106[4] = { 'i', 'm', 'o', 's' };
+static symbol s_6_107[5] = { 'a', 'r', 'm', 'o', 's' };
+static symbol s_6_108[5] = { 'e', 'r', 'm', 'o', 's' };
+static symbol s_6_109[5] = { 'i', 'r', 'm', 'o', 's' };
+static symbol s_6_110[5] = { 0xC3, 0xA1, 'm', 'o', 's' };
+static symbol s_6_111[5] = { 'a', 'r', 0xC3, 0xA1, 's' };
+static symbol s_6_112[5] = { 'e', 'r', 0xC3, 0xA1, 's' };
+static symbol s_6_113[5] = { 'i', 'r', 0xC3, 0xA1, 's' };
+static symbol s_6_114[2] = { 'e', 'u' };
+static symbol s_6_115[2] = { 'i', 'u' };
+static symbol s_6_116[2] = { 'o', 'u' };
+static symbol s_6_117[4] = { 'a', 'r', 0xC3, 0xA1 };
+static symbol s_6_118[4] = { 'e', 'r', 0xC3, 0xA1 };
+static symbol s_6_119[4] = { 'i', 'r', 0xC3, 0xA1 };
+
+static struct among a_6[120] =
+{
+/*  0 */ { 3, s_6_0, -1, 1, 0},
+/*  1 */ { 3, s_6_1, -1, 1, 0},
+/*  2 */ { 2, s_6_2, -1, 1, 0},
+/*  3 */ { 4, s_6_3, 2, 1, 0},
+/*  4 */ { 4, s_6_4, 2, 1, 0},
+/*  5 */ { 4, s_6_5, 2, 1, 0},
+/*  6 */ { 3, s_6_6, -1, 1, 0},
+/*  7 */ { 3, s_6_7, -1, 1, 0},
+/*  8 */ { 3, s_6_8, -1, 1, 0},
+/*  9 */ { 3, s_6_9, -1, 1, 0},
+/* 10 */ { 4, s_6_10, -1, 1, 0},
+/* 11 */ { 4, s_6_11, -1, 1, 0},
+/* 12 */ { 4, s_6_12, -1, 1, 0},
+/* 13 */ { 4, s_6_13, -1, 1, 0},
+/* 14 */ { 4, s_6_14, -1, 1, 0},
+/* 15 */ { 4, s_6_15, -1, 1, 0},
+/* 16 */ { 2, s_6_16, -1, 1, 0},
+/* 17 */ { 4, s_6_17, 16, 1, 0},
+/* 18 */ { 4, s_6_18, 16, 1, 0},
+/* 19 */ { 4, s_6_19, 16, 1, 0},
+/* 20 */ { 2, s_6_20, -1, 1, 0},
+/* 21 */ { 3, s_6_21, 20, 1, 0},
+/* 22 */ { 5, s_6_22, 21, 1, 0},
+/* 23 */ { 5, s_6_23, 21, 1, 0},
+/* 24 */ { 5, s_6_24, 21, 1, 0},
+/* 25 */ { 4, s_6_25, 20, 1, 0},
+/* 26 */ { 4, s_6_26, 20, 1, 0},
+/* 27 */ { 4, s_6_27, 20, 1, 0},
+/* 28 */ { 4, s_6_28, 20, 1, 0},
+/* 29 */ { 2, s_6_29, -1, 1, 0},
+/* 30 */ { 4, s_6_30, 29, 1, 0},
+/* 31 */ { 4, s_6_31, 29, 1, 0},
+/* 32 */ { 4, s_6_32, 29, 1, 0},
+/* 33 */ { 5, s_6_33, 29, 1, 0},
+/* 34 */ { 5, s_6_34, 29, 1, 0},
+/* 35 */ { 5, s_6_35, 29, 1, 0},
+/* 36 */ { 3, s_6_36, -1, 1, 0},
+/* 37 */ { 3, s_6_37, -1, 1, 0},
+/* 38 */ { 4, s_6_38, -1, 1, 0},
+/* 39 */ { 4, s_6_39, -1, 1, 0},
+/* 40 */ { 4, s_6_40, -1, 1, 0},
+/* 41 */ { 5, s_6_41, -1, 1, 0},
+/* 42 */ { 5, s_6_42, -1, 1, 0},
+/* 43 */ { 5, s_6_43, -1, 1, 0},
+/* 44 */ { 2, s_6_44, -1, 1, 0},
+/* 45 */ { 2, s_6_45, -1, 1, 0},
+/* 46 */ { 2, s_6_46, -1, 1, 0},
+/* 47 */ { 2, s_6_47, -1, 1, 0},
+/* 48 */ { 4, s_6_48, 47, 1, 0},
+/* 49 */ { 4, s_6_49, 47, 1, 0},
+/* 50 */ { 3, s_6_50, 47, 1, 0},
+/* 51 */ { 5, s_6_51, 50, 1, 0},
+/* 52 */ { 5, s_6_52, 50, 1, 0},
+/* 53 */ { 5, s_6_53, 50, 1, 0},
+/* 54 */ { 4, s_6_54, 47, 1, 0},
+/* 55 */ { 4, s_6_55, 47, 1, 0},
+/* 56 */ { 4, s_6_56, 47, 1, 0},
+/* 57 */ { 4, s_6_57, 47, 1, 0},
+/* 58 */ { 2, s_6_58, -1, 1, 0},
+/* 59 */ { 5, s_6_59, 58, 1, 0},
+/* 60 */ { 5, s_6_60, 58, 1, 0},
+/* 61 */ { 5, s_6_61, 58, 1, 0},
+/* 62 */ { 4, s_6_62, 58, 1, 0},
+/* 63 */ { 4, s_6_63, 58, 1, 0},
+/* 64 */ { 4, s_6_64, 58, 1, 0},
+/* 65 */ { 5, s_6_65, 58, 1, 0},
+/* 66 */ { 5, s_6_66, 58, 1, 0},
+/* 67 */ { 5, s_6_67, 58, 1, 0},
+/* 68 */ { 5, s_6_68, 58, 1, 0},
+/* 69 */ { 5, s_6_69, 58, 1, 0},
+/* 70 */ { 5, s_6_70, 58, 1, 0},
+/* 71 */ { 2, s_6_71, -1, 1, 0},
+/* 72 */ { 3, s_6_72, 71, 1, 0},
+/* 73 */ { 3, s_6_73, 71, 1, 0},
+/* 74 */ { 5, s_6_74, 73, 1, 0},
+/* 75 */ { 5, s_6_75, 73, 1, 0},
+/* 76 */ { 5, s_6_76, 73, 1, 0},
+/* 77 */ { 6, s_6_77, 73, 1, 0},
+/* 78 */ { 6, s_6_78, 73, 1, 0},
+/* 79 */ { 6, s_6_79, 73, 1, 0},
+/* 80 */ { 7, s_6_80, 73, 1, 0},
+/* 81 */ { 7, s_6_81, 73, 1, 0},
+/* 82 */ { 7, s_6_82, 73, 1, 0},
+/* 83 */ { 6, s_6_83, 73, 1, 0},
+/* 84 */ { 5, s_6_84, 73, 1, 0},
+/* 85 */ { 7, s_6_85, 84, 1, 0},
+/* 86 */ { 7, s_6_86, 84, 1, 0},
+/* 87 */ { 7, s_6_87, 84, 1, 0},
+/* 88 */ { 4, s_6_88, -1, 1, 0},
+/* 89 */ { 4, s_6_89, -1, 1, 0},
+/* 90 */ { 4, s_6_90, -1, 1, 0},
+/* 91 */ { 7, s_6_91, 90, 1, 0},
+/* 92 */ { 7, s_6_92, 90, 1, 0},
+/* 93 */ { 7, s_6_93, 90, 1, 0},
+/* 94 */ { 7, s_6_94, 90, 1, 0},
+/* 95 */ { 6, s_6_95, 90, 1, 0},
+/* 96 */ { 8, s_6_96, 95, 1, 0},
+/* 97 */ { 8, s_6_97, 95, 1, 0},
+/* 98 */ { 8, s_6_98, 95, 1, 0},
+/* 99 */ { 4, s_6_99, -1, 1, 0},
+/*100 */ { 6, s_6_100, 99, 1, 0},
+/*101 */ { 6, s_6_101, 99, 1, 0},
+/*102 */ { 6, s_6_102, 99, 1, 0},
+/*103 */ { 8, s_6_103, 99, 1, 0},
+/*104 */ { 8, s_6_104, 99, 1, 0},
+/*105 */ { 8, s_6_105, 99, 1, 0},
+/*106 */ { 4, s_6_106, -1, 1, 0},
+/*107 */ { 5, s_6_107, -1, 1, 0},
+/*108 */ { 5, s_6_108, -1, 1, 0},
+/*109 */ { 5, s_6_109, -1, 1, 0},
+/*110 */ { 5, s_6_110, -1, 1, 0},
+/*111 */ { 5, s_6_111, -1, 1, 0},
+/*112 */ { 5, s_6_112, -1, 1, 0},
+/*113 */ { 5, s_6_113, -1, 1, 0},
+/*114 */ { 2, s_6_114, -1, 1, 0},
+/*115 */ { 2, s_6_115, -1, 1, 0},
+/*116 */ { 2, s_6_116, -1, 1, 0},
+/*117 */ { 4, s_6_117, -1, 1, 0},
+/*118 */ { 4, s_6_118, -1, 1, 0},
+/*119 */ { 4, s_6_119, -1, 1, 0}
+};
+
+static symbol s_7_0[1] = { 'a' };
+static symbol s_7_1[1] = { 'i' };
+static symbol s_7_2[1] = { 'o' };
+static symbol s_7_3[2] = { 'o', 's' };
+static symbol s_7_4[2] = { 0xC3, 0xA1 };
+static symbol s_7_5[2] = { 0xC3, 0xAD };
+static symbol s_7_6[2] = { 0xC3, 0xB3 };
+
+static struct among a_7[7] =
+{
+/*  0 */ { 1, s_7_0, -1, 1, 0},
+/*  1 */ { 1, s_7_1, -1, 1, 0},
+/*  2 */ { 1, s_7_2, -1, 1, 0},
+/*  3 */ { 2, s_7_3, -1, 1, 0},
+/*  4 */ { 2, s_7_4, -1, 1, 0},
+/*  5 */ { 2, s_7_5, -1, 1, 0},
+/*  6 */ { 2, s_7_6, -1, 1, 0}
+};
+
+static symbol s_8_0[1] = { 'e' };
+static symbol s_8_1[2] = { 0xC3, 0xA7 };
+static symbol s_8_2[2] = { 0xC3, 0xA9 };
+static symbol s_8_3[2] = { 0xC3, 0xAA };
+
+static struct among a_8[4] =
+{
+/*  0 */ { 1, s_8_0, -1, 1, 0},
+/*  1 */ { 2, s_8_1, -1, 2, 0},
+/*  2 */ { 2, s_8_2, -1, 1, 0},
+/*  3 */ { 2, s_8_3, -1, 1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 12, 2 };
+
+static symbol s_0[] = { 'a', '~' };
+static symbol s_1[] = { 'o', '~' };
+static symbol s_2[] = { 0xC3, 0xA3 };
+static symbol s_3[] = { 0xC3, 0xB5 };
+static symbol s_4[] = { 'l', 'o', 'g' };
+static symbol s_5[] = { 'u' };
+static symbol s_6[] = { 'e', 'n', 't', 'e' };
+static symbol s_7[] = { 'a', 't' };
+static symbol s_8[] = { 'a', 't' };
+static symbol s_9[] = { 'e' };
+static symbol s_10[] = { 'i', 'r' };
+static symbol s_11[] = { 'u' };
+static symbol s_12[] = { 'g' };
+static symbol s_13[] = { 'i' };
+static symbol s_14[] = { 'c' };
+static symbol s_15[] = { 'c' };
+static symbol s_16[] = { 'i' };
+static symbol s_17[] = { 'c' };
+
+static int r_prelude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 36 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 37 */
+        among_var = find_among(z, a_0, 3); /* substring, line 37 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 37 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 2, s_0); /* <-, line 38 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 2, s_1); /* <-, line 39 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 40 */
+                }
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    z->I[2] = z->l;
+    {   int c = z->c; /* do, line 50 */
+        {   int c = z->c; /* or, line 52 */
+            if (!(in_grouping_U(z, g_v, 97, 250))) goto lab2;
+            {   int c = z->c; /* or, line 51 */
+                if (!(out_grouping_U(z, g_v, 97, 250))) goto lab4;
+                while(1) { /* gopast, line 51 */
+                    if (!(in_grouping_U(z, g_v, 97, 250))) goto lab5;
+                    break;
+                lab5:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab4;
+                        z->c = c; /* gopast, line 51 */
+                    }
+                }
+                goto lab3;
+            lab4:
+                z->c = c;
+                if (!(in_grouping_U(z, g_v, 97, 250))) goto lab2;
+                while(1) { /* gopast, line 51 */
+                    if (!(out_grouping_U(z, g_v, 97, 250))) goto lab6;
+                    break;
+                lab6:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab2;
+                        z->c = c; /* gopast, line 51 */
+                    }
+                }
+            }
+        lab3:
+            goto lab1;
+        lab2:
+            z->c = c;
+            if (!(out_grouping_U(z, g_v, 97, 250))) goto lab0;
+            {   int c = z->c; /* or, line 53 */
+                if (!(out_grouping_U(z, g_v, 97, 250))) goto lab8;
+                while(1) { /* gopast, line 53 */
+                    if (!(in_grouping_U(z, g_v, 97, 250))) goto lab9;
+                    break;
+                lab9:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab8;
+                        z->c = c; /* gopast, line 53 */
+                    }
+                }
+                goto lab7;
+            lab8:
+                z->c = c;
+                if (!(in_grouping_U(z, g_v, 97, 250))) goto lab0;
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 53 */
+                }
+            }
+        lab7:
+            ;
+        }
+    lab1:
+        z->I[0] = z->c; /* setmark pV, line 54 */
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 56 */
+        while(1) { /* gopast, line 57 */
+            if (!(in_grouping_U(z, g_v, 97, 250))) goto lab11;
+            break;
+        lab11:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 57 */
+            }
+        }
+        while(1) { /* gopast, line 57 */
+            if (!(out_grouping_U(z, g_v, 97, 250))) goto lab12;
+            break;
+        lab12:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 57 */
+            }
+        }
+        z->I[1] = z->c; /* setmark p1, line 57 */
+        while(1) { /* gopast, line 58 */
+            if (!(in_grouping_U(z, g_v, 97, 250))) goto lab13;
+            break;
+        lab13:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 58 */
+            }
+        }
+        while(1) { /* gopast, line 58 */
+            if (!(out_grouping_U(z, g_v, 97, 250))) goto lab14;
+            break;
+        lab14:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 58 */
+            }
+        }
+        z->I[2] = z->c; /* setmark p2, line 58 */
+    lab10:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 62 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 63 */
+        among_var = find_among(z, a_1, 3); /* substring, line 63 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 63 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 2, s_2); /* <-, line 64 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 2, s_3); /* <-, line 65 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 66 */
+                }
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_RV(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[2] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 77 */
+    among_var = find_among_b(z, a_5, 45); /* substring, line 77 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 77 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 93 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 93 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 98 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_4); /* <-, line 98 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 102 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_5); /* <-, line 102 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 106 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 4, s_6); /* <-, line 106 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 110 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 110 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 111 */
+                z->ket = z->c; /* [, line 112 */
+                among_var = find_among_b(z, a_2, 4); /* substring, line 112 */
+                if (!(among_var)) { z->c = z->l - m; goto lab0; }
+                z->bra = z->c; /* ], line 112 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 112 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 112 */
+                    if (ret < 0) return ret;
+                }
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab0; }
+                    case 1:
+                        z->ket = z->c; /* [, line 113 */
+                        if (!(eq_s_b(z, 2, s_7))) { z->c = z->l - m; goto lab0; }
+                        z->bra = z->c; /* ], line 113 */
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 113 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 113 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab0:
+                ;
+            }
+            break;
+        case 6:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 122 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 122 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 123 */
+                z->ket = z->c; /* [, line 124 */
+                among_var = find_among_b(z, a_3, 3); /* substring, line 124 */
+                if (!(among_var)) { z->c = z->l - m; goto lab1; }
+                z->bra = z->c; /* ], line 124 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab1; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 127 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 127 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab1:
+                ;
+            }
+            break;
+        case 7:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 134 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 134 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 135 */
+                z->ket = z->c; /* [, line 136 */
+                among_var = find_among_b(z, a_4, 3); /* substring, line 136 */
+                if (!(among_var)) { z->c = z->l - m; goto lab2; }
+                z->bra = z->c; /* ], line 136 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab2; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 139 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 139 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab2:
+                ;
+            }
+            break;
+        case 8:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 146 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 146 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 147 */
+                z->ket = z->c; /* [, line 148 */
+                if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m; goto lab3; }
+                z->bra = z->c; /* ], line 148 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 148 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 148 */
+                    if (ret < 0) return ret;
+                }
+            lab3:
+                ;
+            }
+            break;
+        case 9:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 153 */
+                if (ret < 0) return ret;
+            }
+            if (!(eq_s_b(z, 1, s_9))) return 0;
+            {   int ret;
+                ret = slice_from_s(z, 2, s_10); /* <-, line 154 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 159 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 159 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 160 */
+        among_var = find_among_b(z, a_6, 120); /* substring, line 160 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 160 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 179 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_residual_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 184 */
+    among_var = find_among_b(z, a_7, 7); /* substring, line 184 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 184 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 187 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 187 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_residual_form(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 192 */
+    among_var = find_among_b(z, a_8, 4); /* substring, line 192 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 192 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 194 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 194 */
+                if (ret < 0) return ret;
+            }
+            z->ket = z->c; /* [, line 194 */
+            {   int m = z->l - z->c; (void) m; /* or, line 194 */
+                if (!(eq_s_b(z, 1, s_11))) goto lab1;
+                z->bra = z->c; /* ], line 194 */
+                {   int m_test = z->l - z->c; /* test, line 194 */
+                    if (!(eq_s_b(z, 1, s_12))) goto lab1;
+                    z->c = z->l - m_test;
+                }
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 1, s_13))) return 0;
+                z->bra = z->c; /* ], line 195 */
+                {   int m_test = z->l - z->c; /* test, line 195 */
+                    if (!(eq_s_b(z, 1, s_14))) return 0;
+                    z->c = z->l - m_test;
+                }
+            }
+        lab0:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 195 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 195 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_from_s(z, 1, s_15); /* <-, line 196 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+extern int portuguese_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 202 */
+        {   int ret = r_prelude(z);
+            if (ret == 0) goto lab0; /* call prelude, line 202 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 203 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab1; /* call mark_regions, line 203 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 204 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 205 */
+        {   int m = z->l - z->c; (void) m; /* or, line 209 */
+            {   int m = z->l - z->c; (void) m; /* and, line 207 */
+                {   int m = z->l - z->c; (void) m; /* or, line 206 */
+                    {   int ret = r_standard_suffix(z);
+                        if (ret == 0) goto lab6; /* call standard_suffix, line 206 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab6:
+                    z->c = z->l - m;
+                    {   int ret = r_verb_suffix(z);
+                        if (ret == 0) goto lab4; /* call verb_suffix, line 206 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab5:
+                z->c = z->l - m;
+                {   int m = z->l - z->c; (void) m; /* do, line 207 */
+                    z->ket = z->c; /* [, line 207 */
+                    if (!(eq_s_b(z, 1, s_16))) goto lab7;
+                    z->bra = z->c; /* ], line 207 */
+                    {   int m_test = z->l - z->c; /* test, line 207 */
+                        if (!(eq_s_b(z, 1, s_17))) goto lab7;
+                        z->c = z->l - m_test;
+                    }
+                    {   int ret = r_RV(z);
+                        if (ret == 0) goto lab7; /* call RV, line 207 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret;
+                        ret = slice_del(z); /* delete, line 207 */
+                        if (ret < 0) return ret;
+                    }
+                lab7:
+                    z->c = z->l - m;
+                }
+            }
+            goto lab3;
+        lab4:
+            z->c = z->l - m;
+            {   int ret = r_residual_suffix(z);
+                if (ret == 0) goto lab2; /* call residual_suffix, line 209 */
+                if (ret < 0) return ret;
+            }
+        }
+    lab3:
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 211 */
+        {   int ret = r_residual_form(z);
+            if (ret == 0) goto lab8; /* call residual_form, line 211 */
+            if (ret < 0) return ret;
+        }
+    lab8:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 213 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab9; /* call postlude, line 213 */
+            if (ret < 0) return ret;
+        }
+    lab9:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * portuguese_UTF_8_create_env(void) { return SN_create_env(0, 3, 0); }
+
+extern void portuguese_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_portuguese.h b/libstemmer_c/src_c/stem_UTF_8_portuguese.h
new file mode 100644
index 0000000..9fe7f9a
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_portuguese.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * portuguese_UTF_8_create_env(void);
+extern void portuguese_UTF_8_close_env(struct SN_env * z);
+
+extern int portuguese_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_russian.c b/libstemmer_c/src_c/stem_UTF_8_russian.c
new file mode 100644
index 0000000..19581dd
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_russian.c
@@ -0,0 +1,709 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int russian_UTF_8_stem(struct SN_env * z);
+static int r_tidy_up(struct SN_env * z);
+static int r_derivational(struct SN_env * z);
+static int r_noun(struct SN_env * z);
+static int r_verb(struct SN_env * z);
+static int r_reflexive(struct SN_env * z);
+static int r_adjectival(struct SN_env * z);
+static int r_adjective(struct SN_env * z);
+static int r_perfective_gerund(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+
+extern struct SN_env * russian_UTF_8_create_env(void);
+extern void russian_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_0[10] = { 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C };
+static symbol s_0_1[12] = { 0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C };
+static symbol s_0_2[12] = { 0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8, 0xD1, 0x81, 0xD1, 0x8C };
+static symbol s_0_3[2] = { 0xD0, 0xB2 };
+static symbol s_0_4[4] = { 0xD1, 0x8B, 0xD0, 0xB2 };
+static symbol s_0_5[4] = { 0xD0, 0xB8, 0xD0, 0xB2 };
+static symbol s_0_6[6] = { 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8 };
+static symbol s_0_7[8] = { 0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8 };
+static symbol s_0_8[8] = { 0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88, 0xD0, 0xB8 };
+
+static struct among a_0[9] =
+{
+/*  0 */ { 10, s_0_0, -1, 1, 0},
+/*  1 */ { 12, s_0_1, 0, 2, 0},
+/*  2 */ { 12, s_0_2, 0, 2, 0},
+/*  3 */ { 2, s_0_3, -1, 1, 0},
+/*  4 */ { 4, s_0_4, 3, 2, 0},
+/*  5 */ { 4, s_0_5, 3, 2, 0},
+/*  6 */ { 6, s_0_6, -1, 1, 0},
+/*  7 */ { 8, s_0_7, 6, 2, 0},
+/*  8 */ { 8, s_0_8, 6, 2, 0}
+};
+
+static symbol s_1_0[6] = { 0xD0, 0xB5, 0xD0, 0xBC, 0xD1, 0x83 };
+static symbol s_1_1[6] = { 0xD0, 0xBE, 0xD0, 0xBC, 0xD1, 0x83 };
+static symbol s_1_2[4] = { 0xD1, 0x8B, 0xD1, 0x85 };
+static symbol s_1_3[4] = { 0xD0, 0xB8, 0xD1, 0x85 };
+static symbol s_1_4[4] = { 0xD1, 0x83, 0xD1, 0x8E };
+static symbol s_1_5[4] = { 0xD1, 0x8E, 0xD1, 0x8E };
+static symbol s_1_6[4] = { 0xD0, 0xB5, 0xD1, 0x8E };
+static symbol s_1_7[4] = { 0xD0, 0xBE, 0xD1, 0x8E };
+static symbol s_1_8[4] = { 0xD1, 0x8F, 0xD1, 0x8F };
+static symbol s_1_9[4] = { 0xD0, 0xB0, 0xD1, 0x8F };
+static symbol s_1_10[4] = { 0xD1, 0x8B, 0xD0, 0xB5 };
+static symbol s_1_11[4] = { 0xD0, 0xB5, 0xD0, 0xB5 };
+static symbol s_1_12[4] = { 0xD0, 0xB8, 0xD0, 0xB5 };
+static symbol s_1_13[4] = { 0xD0, 0xBE, 0xD0, 0xB5 };
+static symbol s_1_14[6] = { 0xD1, 0x8B, 0xD0, 0xBC, 0xD0, 0xB8 };
+static symbol s_1_15[6] = { 0xD0, 0xB8, 0xD0, 0xBC, 0xD0, 0xB8 };
+static symbol s_1_16[4] = { 0xD1, 0x8B, 0xD0, 0xB9 };
+static symbol s_1_17[4] = { 0xD0, 0xB5, 0xD0, 0xB9 };
+static symbol s_1_18[4] = { 0xD0, 0xB8, 0xD0, 0xB9 };
+static symbol s_1_19[4] = { 0xD0, 0xBE, 0xD0, 0xB9 };
+static symbol s_1_20[4] = { 0xD1, 0x8B, 0xD0, 0xBC };
+static symbol s_1_21[4] = { 0xD0, 0xB5, 0xD0, 0xBC };
+static symbol s_1_22[4] = { 0xD0, 0xB8, 0xD0, 0xBC };
+static symbol s_1_23[4] = { 0xD0, 0xBE, 0xD0, 0xBC };
+static symbol s_1_24[6] = { 0xD0, 0xB5, 0xD0, 0xB3, 0xD0, 0xBE };
+static symbol s_1_25[6] = { 0xD0, 0xBE, 0xD0, 0xB3, 0xD0, 0xBE };
+
+static struct among a_1[26] =
+{
+/*  0 */ { 6, s_1_0, -1, 1, 0},
+/*  1 */ { 6, s_1_1, -1, 1, 0},
+/*  2 */ { 4, s_1_2, -1, 1, 0},
+/*  3 */ { 4, s_1_3, -1, 1, 0},
+/*  4 */ { 4, s_1_4, -1, 1, 0},
+/*  5 */ { 4, s_1_5, -1, 1, 0},
+/*  6 */ { 4, s_1_6, -1, 1, 0},
+/*  7 */ { 4, s_1_7, -1, 1, 0},
+/*  8 */ { 4, s_1_8, -1, 1, 0},
+/*  9 */ { 4, s_1_9, -1, 1, 0},
+/* 10 */ { 4, s_1_10, -1, 1, 0},
+/* 11 */ { 4, s_1_11, -1, 1, 0},
+/* 12 */ { 4, s_1_12, -1, 1, 0},
+/* 13 */ { 4, s_1_13, -1, 1, 0},
+/* 14 */ { 6, s_1_14, -1, 1, 0},
+/* 15 */ { 6, s_1_15, -1, 1, 0},
+/* 16 */ { 4, s_1_16, -1, 1, 0},
+/* 17 */ { 4, s_1_17, -1, 1, 0},
+/* 18 */ { 4, s_1_18, -1, 1, 0},
+/* 19 */ { 4, s_1_19, -1, 1, 0},
+/* 20 */ { 4, s_1_20, -1, 1, 0},
+/* 21 */ { 4, s_1_21, -1, 1, 0},
+/* 22 */ { 4, s_1_22, -1, 1, 0},
+/* 23 */ { 4, s_1_23, -1, 1, 0},
+/* 24 */ { 6, s_1_24, -1, 1, 0},
+/* 25 */ { 6, s_1_25, -1, 1, 0}
+};
+
+static symbol s_2_0[4] = { 0xD0, 0xB2, 0xD1, 0x88 };
+static symbol s_2_1[6] = { 0xD1, 0x8B, 0xD0, 0xB2, 0xD1, 0x88 };
+static symbol s_2_2[6] = { 0xD0, 0xB8, 0xD0, 0xB2, 0xD1, 0x88 };
+static symbol s_2_3[2] = { 0xD1, 0x89 };
+static symbol s_2_4[4] = { 0xD1, 0x8E, 0xD1, 0x89 };
+static symbol s_2_5[6] = { 0xD1, 0x83, 0xD1, 0x8E, 0xD1, 0x89 };
+static symbol s_2_6[4] = { 0xD0, 0xB5, 0xD0, 0xBC };
+static symbol s_2_7[4] = { 0xD0, 0xBD, 0xD0, 0xBD };
+
+static struct among a_2[8] =
+{
+/*  0 */ { 4, s_2_0, -1, 1, 0},
+/*  1 */ { 6, s_2_1, 0, 2, 0},
+/*  2 */ { 6, s_2_2, 0, 2, 0},
+/*  3 */ { 2, s_2_3, -1, 1, 0},
+/*  4 */ { 4, s_2_4, 3, 1, 0},
+/*  5 */ { 6, s_2_5, 4, 2, 0},
+/*  6 */ { 4, s_2_6, -1, 1, 0},
+/*  7 */ { 4, s_2_7, -1, 1, 0}
+};
+
+static symbol s_3_0[4] = { 0xD1, 0x81, 0xD1, 0x8C };
+static symbol s_3_1[4] = { 0xD1, 0x81, 0xD1, 0x8F };
+
+static struct among a_3[2] =
+{
+/*  0 */ { 4, s_3_0, -1, 1, 0},
+/*  1 */ { 4, s_3_1, -1, 1, 0}
+};
+
+static symbol s_4_0[4] = { 0xD1, 0x8B, 0xD1, 0x82 };
+static symbol s_4_1[4] = { 0xD1, 0x8E, 0xD1, 0x82 };
+static symbol s_4_2[6] = { 0xD1, 0x83, 0xD1, 0x8E, 0xD1, 0x82 };
+static symbol s_4_3[4] = { 0xD1, 0x8F, 0xD1, 0x82 };
+static symbol s_4_4[4] = { 0xD0, 0xB5, 0xD1, 0x82 };
+static symbol s_4_5[6] = { 0xD1, 0x83, 0xD0, 0xB5, 0xD1, 0x82 };
+static symbol s_4_6[4] = { 0xD0, 0xB8, 0xD1, 0x82 };
+static symbol s_4_7[4] = { 0xD0, 0xBD, 0xD1, 0x8B };
+static symbol s_4_8[6] = { 0xD0, 0xB5, 0xD0, 0xBD, 0xD1, 0x8B };
+static symbol s_4_9[4] = { 0xD1, 0x82, 0xD1, 0x8C };
+static symbol s_4_10[6] = { 0xD1, 0x8B, 0xD1, 0x82, 0xD1, 0x8C };
+static symbol s_4_11[6] = { 0xD0, 0xB8, 0xD1, 0x82, 0xD1, 0x8C };
+static symbol s_4_12[6] = { 0xD0, 0xB5, 0xD1, 0x88, 0xD1, 0x8C };
+static symbol s_4_13[6] = { 0xD0, 0xB8, 0xD1, 0x88, 0xD1, 0x8C };
+static symbol s_4_14[2] = { 0xD1, 0x8E };
+static symbol s_4_15[4] = { 0xD1, 0x83, 0xD1, 0x8E };
+static symbol s_4_16[4] = { 0xD0, 0xBB, 0xD0, 0xB0 };
+static symbol s_4_17[6] = { 0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xB0 };
+static symbol s_4_18[6] = { 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xB0 };
+static symbol s_4_19[4] = { 0xD0, 0xBD, 0xD0, 0xB0 };
+static symbol s_4_20[6] = { 0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xB0 };
+static symbol s_4_21[6] = { 0xD0, 0xB5, 0xD1, 0x82, 0xD0, 0xB5 };
+static symbol s_4_22[6] = { 0xD0, 0xB8, 0xD1, 0x82, 0xD0, 0xB5 };
+static symbol s_4_23[6] = { 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5 };
+static symbol s_4_24[8] = { 0xD1, 0x83, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5 };
+static symbol s_4_25[8] = { 0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x82, 0xD0, 0xB5 };
+static symbol s_4_26[4] = { 0xD0, 0xBB, 0xD0, 0xB8 };
+static symbol s_4_27[6] = { 0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xB8 };
+static symbol s_4_28[6] = { 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xB8 };
+static symbol s_4_29[2] = { 0xD0, 0xB9 };
+static symbol s_4_30[4] = { 0xD1, 0x83, 0xD0, 0xB9 };
+static symbol s_4_31[4] = { 0xD0, 0xB5, 0xD0, 0xB9 };
+static symbol s_4_32[2] = { 0xD0, 0xBB };
+static symbol s_4_33[4] = { 0xD1, 0x8B, 0xD0, 0xBB };
+static symbol s_4_34[4] = { 0xD0, 0xB8, 0xD0, 0xBB };
+static symbol s_4_35[4] = { 0xD1, 0x8B, 0xD0, 0xBC };
+static symbol s_4_36[4] = { 0xD0, 0xB5, 0xD0, 0xBC };
+static symbol s_4_37[4] = { 0xD0, 0xB8, 0xD0, 0xBC };
+static symbol s_4_38[2] = { 0xD0, 0xBD };
+static symbol s_4_39[4] = { 0xD0, 0xB5, 0xD0, 0xBD };
+static symbol s_4_40[4] = { 0xD0, 0xBB, 0xD0, 0xBE };
+static symbol s_4_41[6] = { 0xD1, 0x8B, 0xD0, 0xBB, 0xD0, 0xBE };
+static symbol s_4_42[6] = { 0xD0, 0xB8, 0xD0, 0xBB, 0xD0, 0xBE };
+static symbol s_4_43[4] = { 0xD0, 0xBD, 0xD0, 0xBE };
+static symbol s_4_44[6] = { 0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xBE };
+static symbol s_4_45[6] = { 0xD0, 0xBD, 0xD0, 0xBD, 0xD0, 0xBE };
+
+static struct among a_4[46] =
+{
+/*  0 */ { 4, s_4_0, -1, 2, 0},
+/*  1 */ { 4, s_4_1, -1, 1, 0},
+/*  2 */ { 6, s_4_2, 1, 2, 0},
+/*  3 */ { 4, s_4_3, -1, 2, 0},
+/*  4 */ { 4, s_4_4, -1, 1, 0},
+/*  5 */ { 6, s_4_5, 4, 2, 0},
+/*  6 */ { 4, s_4_6, -1, 2, 0},
+/*  7 */ { 4, s_4_7, -1, 1, 0},
+/*  8 */ { 6, s_4_8, 7, 2, 0},
+/*  9 */ { 4, s_4_9, -1, 1, 0},
+/* 10 */ { 6, s_4_10, 9, 2, 0},
+/* 11 */ { 6, s_4_11, 9, 2, 0},
+/* 12 */ { 6, s_4_12, -1, 1, 0},
+/* 13 */ { 6, s_4_13, -1, 2, 0},
+/* 14 */ { 2, s_4_14, -1, 2, 0},
+/* 15 */ { 4, s_4_15, 14, 2, 0},
+/* 16 */ { 4, s_4_16, -1, 1, 0},
+/* 17 */ { 6, s_4_17, 16, 2, 0},
+/* 18 */ { 6, s_4_18, 16, 2, 0},
+/* 19 */ { 4, s_4_19, -1, 1, 0},
+/* 20 */ { 6, s_4_20, 19, 2, 0},
+/* 21 */ { 6, s_4_21, -1, 1, 0},
+/* 22 */ { 6, s_4_22, -1, 2, 0},
+/* 23 */ { 6, s_4_23, -1, 1, 0},
+/* 24 */ { 8, s_4_24, 23, 2, 0},
+/* 25 */ { 8, s_4_25, 23, 2, 0},
+/* 26 */ { 4, s_4_26, -1, 1, 0},
+/* 27 */ { 6, s_4_27, 26, 2, 0},
+/* 28 */ { 6, s_4_28, 26, 2, 0},
+/* 29 */ { 2, s_4_29, -1, 1, 0},
+/* 30 */ { 4, s_4_30, 29, 2, 0},
+/* 31 */ { 4, s_4_31, 29, 2, 0},
+/* 32 */ { 2, s_4_32, -1, 1, 0},
+/* 33 */ { 4, s_4_33, 32, 2, 0},
+/* 34 */ { 4, s_4_34, 32, 2, 0},
+/* 35 */ { 4, s_4_35, -1, 2, 0},
+/* 36 */ { 4, s_4_36, -1, 1, 0},
+/* 37 */ { 4, s_4_37, -1, 2, 0},
+/* 38 */ { 2, s_4_38, -1, 1, 0},
+/* 39 */ { 4, s_4_39, 38, 2, 0},
+/* 40 */ { 4, s_4_40, -1, 1, 0},
+/* 41 */ { 6, s_4_41, 40, 2, 0},
+/* 42 */ { 6, s_4_42, 40, 2, 0},
+/* 43 */ { 4, s_4_43, -1, 1, 0},
+/* 44 */ { 6, s_4_44, 43, 2, 0},
+/* 45 */ { 6, s_4_45, 43, 1, 0}
+};
+
+static symbol s_5_0[2] = { 0xD1, 0x83 };
+static symbol s_5_1[4] = { 0xD1, 0x8F, 0xD1, 0x85 };
+static symbol s_5_2[6] = { 0xD0, 0xB8, 0xD1, 0x8F, 0xD1, 0x85 };
+static symbol s_5_3[4] = { 0xD0, 0xB0, 0xD1, 0x85 };
+static symbol s_5_4[2] = { 0xD1, 0x8B };
+static symbol s_5_5[2] = { 0xD1, 0x8C };
+static symbol s_5_6[2] = { 0xD1, 0x8E };
+static symbol s_5_7[4] = { 0xD1, 0x8C, 0xD1, 0x8E };
+static symbol s_5_8[4] = { 0xD0, 0xB8, 0xD1, 0x8E };
+static symbol s_5_9[2] = { 0xD1, 0x8F };
+static symbol s_5_10[4] = { 0xD1, 0x8C, 0xD1, 0x8F };
+static symbol s_5_11[4] = { 0xD0, 0xB8, 0xD1, 0x8F };
+static symbol s_5_12[2] = { 0xD0, 0xB0 };
+static symbol s_5_13[4] = { 0xD0, 0xB5, 0xD0, 0xB2 };
+static symbol s_5_14[4] = { 0xD0, 0xBE, 0xD0, 0xB2 };
+static symbol s_5_15[2] = { 0xD0, 0xB5 };
+static symbol s_5_16[4] = { 0xD1, 0x8C, 0xD0, 0xB5 };
+static symbol s_5_17[4] = { 0xD0, 0xB8, 0xD0, 0xB5 };
+static symbol s_5_18[2] = { 0xD0, 0xB8 };
+static symbol s_5_19[4] = { 0xD0, 0xB5, 0xD0, 0xB8 };
+static symbol s_5_20[4] = { 0xD0, 0xB8, 0xD0, 0xB8 };
+static symbol s_5_21[6] = { 0xD1, 0x8F, 0xD0, 0xBC, 0xD0, 0xB8 };
+static symbol s_5_22[8] = { 0xD0, 0xB8, 0xD1, 0x8F, 0xD0, 0xBC, 0xD0, 0xB8 };
+static symbol s_5_23[6] = { 0xD0, 0xB0, 0xD0, 0xBC, 0xD0, 0xB8 };
+static symbol s_5_24[2] = { 0xD0, 0xB9 };
+static symbol s_5_25[4] = { 0xD0, 0xB5, 0xD0, 0xB9 };
+static symbol s_5_26[6] = { 0xD0, 0xB8, 0xD0, 0xB5, 0xD0, 0xB9 };
+static symbol s_5_27[4] = { 0xD0, 0xB8, 0xD0, 0xB9 };
+static symbol s_5_28[4] = { 0xD0, 0xBE, 0xD0, 0xB9 };
+static symbol s_5_29[4] = { 0xD1, 0x8F, 0xD0, 0xBC };
+static symbol s_5_30[6] = { 0xD0, 0xB8, 0xD1, 0x8F, 0xD0, 0xBC };
+static symbol s_5_31[4] = { 0xD0, 0xB0, 0xD0, 0xBC };
+static symbol s_5_32[4] = { 0xD0, 0xB5, 0xD0, 0xBC };
+static symbol s_5_33[6] = { 0xD0, 0xB8, 0xD0, 0xB5, 0xD0, 0xBC };
+static symbol s_5_34[4] = { 0xD0, 0xBE, 0xD0, 0xBC };
+static symbol s_5_35[2] = { 0xD0, 0xBE };
+
+static struct among a_5[36] =
+{
+/*  0 */ { 2, s_5_0, -1, 1, 0},
+/*  1 */ { 4, s_5_1, -1, 1, 0},
+/*  2 */ { 6, s_5_2, 1, 1, 0},
+/*  3 */ { 4, s_5_3, -1, 1, 0},
+/*  4 */ { 2, s_5_4, -1, 1, 0},
+/*  5 */ { 2, s_5_5, -1, 1, 0},
+/*  6 */ { 2, s_5_6, -1, 1, 0},
+/*  7 */ { 4, s_5_7, 6, 1, 0},
+/*  8 */ { 4, s_5_8, 6, 1, 0},
+/*  9 */ { 2, s_5_9, -1, 1, 0},
+/* 10 */ { 4, s_5_10, 9, 1, 0},
+/* 11 */ { 4, s_5_11, 9, 1, 0},
+/* 12 */ { 2, s_5_12, -1, 1, 0},
+/* 13 */ { 4, s_5_13, -1, 1, 0},
+/* 14 */ { 4, s_5_14, -1, 1, 0},
+/* 15 */ { 2, s_5_15, -1, 1, 0},
+/* 16 */ { 4, s_5_16, 15, 1, 0},
+/* 17 */ { 4, s_5_17, 15, 1, 0},
+/* 18 */ { 2, s_5_18, -1, 1, 0},
+/* 19 */ { 4, s_5_19, 18, 1, 0},
+/* 20 */ { 4, s_5_20, 18, 1, 0},
+/* 21 */ { 6, s_5_21, 18, 1, 0},
+/* 22 */ { 8, s_5_22, 21, 1, 0},
+/* 23 */ { 6, s_5_23, 18, 1, 0},
+/* 24 */ { 2, s_5_24, -1, 1, 0},
+/* 25 */ { 4, s_5_25, 24, 1, 0},
+/* 26 */ { 6, s_5_26, 25, 1, 0},
+/* 27 */ { 4, s_5_27, 24, 1, 0},
+/* 28 */ { 4, s_5_28, 24, 1, 0},
+/* 29 */ { 4, s_5_29, -1, 1, 0},
+/* 30 */ { 6, s_5_30, 29, 1, 0},
+/* 31 */ { 4, s_5_31, -1, 1, 0},
+/* 32 */ { 4, s_5_32, -1, 1, 0},
+/* 33 */ { 6, s_5_33, 32, 1, 0},
+/* 34 */ { 4, s_5_34, -1, 1, 0},
+/* 35 */ { 2, s_5_35, -1, 1, 0}
+};
+
+static symbol s_6_0[6] = { 0xD0, 0xBE, 0xD1, 0x81, 0xD1, 0x82 };
+static symbol s_6_1[8] = { 0xD0, 0xBE, 0xD1, 0x81, 0xD1, 0x82, 0xD1, 0x8C };
+
+static struct among a_6[2] =
+{
+/*  0 */ { 6, s_6_0, -1, 1, 0},
+/*  1 */ { 8, s_6_1, -1, 1, 0}
+};
+
+static symbol s_7_0[6] = { 0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x88 };
+static symbol s_7_1[2] = { 0xD1, 0x8C };
+static symbol s_7_2[8] = { 0xD0, 0xB5, 0xD0, 0xB9, 0xD1, 0x88, 0xD0, 0xB5 };
+static symbol s_7_3[2] = { 0xD0, 0xBD };
+
+static struct among a_7[4] =
+{
+/*  0 */ { 6, s_7_0, -1, 1, 0},
+/*  1 */ { 2, s_7_1, -1, 3, 0},
+/*  2 */ { 8, s_7_2, -1, 1, 0},
+/*  3 */ { 2, s_7_3, -1, 2, 0}
+};
+
+static unsigned char g_v[] = { 33, 65, 8, 232 };
+
+static symbol s_0[] = { 0xD0, 0xB0 };
+static symbol s_1[] = { 0xD1, 0x8F };
+static symbol s_2[] = { 0xD0, 0xB0 };
+static symbol s_3[] = { 0xD1, 0x8F };
+static symbol s_4[] = { 0xD0, 0xB0 };
+static symbol s_5[] = { 0xD1, 0x8F };
+static symbol s_6[] = { 0xD0, 0xBD };
+static symbol s_7[] = { 0xD0, 0xBD };
+static symbol s_8[] = { 0xD0, 0xBD };
+static symbol s_9[] = { 0xD0, 0xB8 };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    {   int c = z->c; /* do, line 61 */
+        while(1) { /* gopast, line 62 */
+            if (!(in_grouping_U(z, g_v, 1072, 1103))) goto lab1;
+            break;
+        lab1:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab0;
+                z->c = c; /* gopast, line 62 */
+            }
+        }
+        z->I[0] = z->c; /* setmark pV, line 62 */
+        while(1) { /* gopast, line 62 */
+            if (!(out_grouping_U(z, g_v, 1072, 1103))) goto lab2;
+            break;
+        lab2:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab0;
+                z->c = c; /* gopast, line 62 */
+            }
+        }
+        while(1) { /* gopast, line 63 */
+            if (!(in_grouping_U(z, g_v, 1072, 1103))) goto lab3;
+            break;
+        lab3:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab0;
+                z->c = c; /* gopast, line 63 */
+            }
+        }
+        while(1) { /* gopast, line 63 */
+            if (!(out_grouping_U(z, g_v, 1072, 1103))) goto lab4;
+            break;
+        lab4:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab0;
+                z->c = c; /* gopast, line 63 */
+            }
+        }
+        z->I[1] = z->c; /* setmark p2, line 63 */
+    lab0:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_perfective_gerund(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 72 */
+    among_var = find_among_b(z, a_0, 9); /* substring, line 72 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 72 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* or, line 76 */
+                if (!(eq_s_b(z, 2, s_0))) goto lab1;
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 2, s_1))) return 0;
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 76 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 83 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_adjective(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 88 */
+    among_var = find_among_b(z, a_1, 26); /* substring, line 88 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 88 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 97 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_adjectival(struct SN_env * z) {
+    int among_var;
+    {   int ret = r_adjective(z);
+        if (ret == 0) return 0; /* call adjective, line 102 */
+        if (ret < 0) return ret;
+    }
+    {   int m = z->l - z->c; (void) m; /* try, line 109 */
+        z->ket = z->c; /* [, line 110 */
+        among_var = find_among_b(z, a_2, 8); /* substring, line 110 */
+        if (!(among_var)) { z->c = z->l - m; goto lab0; }
+        z->bra = z->c; /* ], line 110 */
+        switch(among_var) {
+            case 0: { z->c = z->l - m; goto lab0; }
+            case 1:
+                {   int m = z->l - z->c; (void) m; /* or, line 115 */
+                    if (!(eq_s_b(z, 2, s_2))) goto lab2;
+                    goto lab1;
+                lab2:
+                    z->c = z->l - m;
+                    if (!(eq_s_b(z, 2, s_3))) { z->c = z->l - m; goto lab0; }
+                }
+            lab1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 115 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 122 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+    lab0:
+        ;
+    }
+    return 1;
+}
+
+static int r_reflexive(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 129 */
+    among_var = find_among_b(z, a_3, 2); /* substring, line 129 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 129 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 132 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_verb(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 137 */
+    among_var = find_among_b(z, a_4, 46); /* substring, line 137 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 137 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* or, line 143 */
+                if (!(eq_s_b(z, 2, s_4))) goto lab1;
+                goto lab0;
+            lab1:
+                z->c = z->l - m;
+                if (!(eq_s_b(z, 2, s_5))) return 0;
+            }
+        lab0:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 143 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 151 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_noun(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 160 */
+    among_var = find_among_b(z, a_5, 36); /* substring, line 160 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 160 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 167 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_derivational(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 176 */
+    among_var = find_among_b(z, a_6, 2); /* substring, line 176 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 176 */
+    {   int ret = r_R2(z);
+        if (ret == 0) return 0; /* call R2, line 176 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 179 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_tidy_up(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 184 */
+    among_var = find_among_b(z, a_7, 4); /* substring, line 184 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 184 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 188 */
+                if (ret < 0) return ret;
+            }
+            z->ket = z->c; /* [, line 189 */
+            if (!(eq_s_b(z, 2, s_6))) return 0;
+            z->bra = z->c; /* ], line 189 */
+            if (!(eq_s_b(z, 2, s_7))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 189 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            if (!(eq_s_b(z, 2, s_8))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 192 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 194 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+extern int russian_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 201 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 201 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 202 */
+
+    {   int m3; /* setlimit, line 202 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 202 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        {   int m = z->l - z->c; (void) m; /* do, line 203 */
+            {   int m = z->l - z->c; (void) m; /* or, line 204 */
+                {   int ret = r_perfective_gerund(z);
+                    if (ret == 0) goto lab3; /* call perfective_gerund, line 204 */
+                    if (ret < 0) return ret;
+                }
+                goto lab2;
+            lab3:
+                z->c = z->l - m;
+                {   int m = z->l - z->c; (void) m; /* try, line 205 */
+                    {   int ret = r_reflexive(z);
+                        if (ret == 0) { z->c = z->l - m; goto lab4; } /* call reflexive, line 205 */
+                        if (ret < 0) return ret;
+                    }
+                lab4:
+                    ;
+                }
+                {   int m = z->l - z->c; (void) m; /* or, line 206 */
+                    {   int ret = r_adjectival(z);
+                        if (ret == 0) goto lab6; /* call adjectival, line 206 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab6:
+                    z->c = z->l - m;
+                    {   int ret = r_verb(z);
+                        if (ret == 0) goto lab7; /* call verb, line 206 */
+                        if (ret < 0) return ret;
+                    }
+                    goto lab5;
+                lab7:
+                    z->c = z->l - m;
+                    {   int ret = r_noun(z);
+                        if (ret == 0) goto lab1; /* call noun, line 206 */
+                        if (ret < 0) return ret;
+                    }
+                }
+            lab5:
+                ;
+            }
+        lab2:
+        lab1:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* try, line 209 */
+            z->ket = z->c; /* [, line 209 */
+            if (!(eq_s_b(z, 2, s_9))) { z->c = z->l - m; goto lab8; }
+            z->bra = z->c; /* ], line 209 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 209 */
+                if (ret < 0) return ret;
+            }
+        lab8:
+            ;
+        }
+        {   int m = z->l - z->c; (void) m; /* do, line 212 */
+            {   int ret = r_derivational(z);
+                if (ret == 0) goto lab9; /* call derivational, line 212 */
+                if (ret < 0) return ret;
+            }
+        lab9:
+            z->c = z->l - m;
+        }
+        {   int m = z->l - z->c; (void) m; /* do, line 213 */
+            {   int ret = r_tidy_up(z);
+                if (ret == 0) goto lab10; /* call tidy_up, line 213 */
+                if (ret < 0) return ret;
+            }
+        lab10:
+            z->c = z->l - m;
+        }
+        z->lb = m3;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * russian_UTF_8_create_env(void) { return SN_create_env(0, 2, 0); }
+
+extern void russian_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_russian.h b/libstemmer_c/src_c/stem_UTF_8_russian.h
new file mode 100644
index 0000000..4ef774d
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_russian.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * russian_UTF_8_create_env(void);
+extern void russian_UTF_8_close_env(struct SN_env * z);
+
+extern int russian_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_spanish.c b/libstemmer_c/src_c/stem_UTF_8_spanish.c
new file mode 100644
index 0000000..77771ba
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_spanish.c
@@ -0,0 +1,1137 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int spanish_UTF_8_stem(struct SN_env * z);
+static int r_residual_suffix(struct SN_env * z);
+static int r_verb_suffix(struct SN_env * z);
+static int r_y_verb_suffix(struct SN_env * z);
+static int r_standard_suffix(struct SN_env * z);
+static int r_attached_pronoun(struct SN_env * z);
+static int r_R2(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_RV(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+static int r_postlude(struct SN_env * z);
+
+extern struct SN_env * spanish_UTF_8_create_env(void);
+extern void spanish_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_1[2] = { 0xC3, 0xA1 };
+static symbol s_0_2[2] = { 0xC3, 0xA9 };
+static symbol s_0_3[2] = { 0xC3, 0xAD };
+static symbol s_0_4[2] = { 0xC3, 0xB3 };
+static symbol s_0_5[2] = { 0xC3, 0xBA };
+
+static struct among a_0[6] =
+{
+/*  0 */ { 0, 0, -1, 6, 0},
+/*  1 */ { 2, s_0_1, 0, 1, 0},
+/*  2 */ { 2, s_0_2, 0, 2, 0},
+/*  3 */ { 2, s_0_3, 0, 3, 0},
+/*  4 */ { 2, s_0_4, 0, 4, 0},
+/*  5 */ { 2, s_0_5, 0, 5, 0}
+};
+
+static symbol s_1_0[2] = { 'l', 'a' };
+static symbol s_1_1[4] = { 's', 'e', 'l', 'a' };
+static symbol s_1_2[2] = { 'l', 'e' };
+static symbol s_1_3[2] = { 'm', 'e' };
+static symbol s_1_4[2] = { 's', 'e' };
+static symbol s_1_5[2] = { 'l', 'o' };
+static symbol s_1_6[4] = { 's', 'e', 'l', 'o' };
+static symbol s_1_7[3] = { 'l', 'a', 's' };
+static symbol s_1_8[5] = { 's', 'e', 'l', 'a', 's' };
+static symbol s_1_9[3] = { 'l', 'e', 's' };
+static symbol s_1_10[3] = { 'l', 'o', 's' };
+static symbol s_1_11[5] = { 's', 'e', 'l', 'o', 's' };
+static symbol s_1_12[3] = { 'n', 'o', 's' };
+
+static struct among a_1[13] =
+{
+/*  0 */ { 2, s_1_0, -1, -1, 0},
+/*  1 */ { 4, s_1_1, 0, -1, 0},
+/*  2 */ { 2, s_1_2, -1, -1, 0},
+/*  3 */ { 2, s_1_3, -1, -1, 0},
+/*  4 */ { 2, s_1_4, -1, -1, 0},
+/*  5 */ { 2, s_1_5, -1, -1, 0},
+/*  6 */ { 4, s_1_6, 5, -1, 0},
+/*  7 */ { 3, s_1_7, -1, -1, 0},
+/*  8 */ { 5, s_1_8, 7, -1, 0},
+/*  9 */ { 3, s_1_9, -1, -1, 0},
+/* 10 */ { 3, s_1_10, -1, -1, 0},
+/* 11 */ { 5, s_1_11, 10, -1, 0},
+/* 12 */ { 3, s_1_12, -1, -1, 0}
+};
+
+static symbol s_2_0[4] = { 'a', 'n', 'd', 'o' };
+static symbol s_2_1[5] = { 'i', 'e', 'n', 'd', 'o' };
+static symbol s_2_2[5] = { 'y', 'e', 'n', 'd', 'o' };
+static symbol s_2_3[5] = { 0xC3, 0xA1, 'n', 'd', 'o' };
+static symbol s_2_4[6] = { 'i', 0xC3, 0xA9, 'n', 'd', 'o' };
+static symbol s_2_5[2] = { 'a', 'r' };
+static symbol s_2_6[2] = { 'e', 'r' };
+static symbol s_2_7[2] = { 'i', 'r' };
+static symbol s_2_8[3] = { 0xC3, 0xA1, 'r' };
+static symbol s_2_9[3] = { 0xC3, 0xA9, 'r' };
+static symbol s_2_10[3] = { 0xC3, 0xAD, 'r' };
+
+static struct among a_2[11] =
+{
+/*  0 */ { 4, s_2_0, -1, 6, 0},
+/*  1 */ { 5, s_2_1, -1, 6, 0},
+/*  2 */ { 5, s_2_2, -1, 7, 0},
+/*  3 */ { 5, s_2_3, -1, 2, 0},
+/*  4 */ { 6, s_2_4, -1, 1, 0},
+/*  5 */ { 2, s_2_5, -1, 6, 0},
+/*  6 */ { 2, s_2_6, -1, 6, 0},
+/*  7 */ { 2, s_2_7, -1, 6, 0},
+/*  8 */ { 3, s_2_8, -1, 3, 0},
+/*  9 */ { 3, s_2_9, -1, 4, 0},
+/* 10 */ { 3, s_2_10, -1, 5, 0}
+};
+
+static symbol s_3_0[2] = { 'i', 'c' };
+static symbol s_3_1[2] = { 'a', 'd' };
+static symbol s_3_2[2] = { 'o', 's' };
+static symbol s_3_3[2] = { 'i', 'v' };
+
+static struct among a_3[4] =
+{
+/*  0 */ { 2, s_3_0, -1, -1, 0},
+/*  1 */ { 2, s_3_1, -1, -1, 0},
+/*  2 */ { 2, s_3_2, -1, -1, 0},
+/*  3 */ { 2, s_3_3, -1, 1, 0}
+};
+
+static symbol s_4_0[4] = { 'a', 'b', 'l', 'e' };
+static symbol s_4_1[4] = { 'i', 'b', 'l', 'e' };
+static symbol s_4_2[4] = { 'a', 'n', 't', 'e' };
+
+static struct among a_4[3] =
+{
+/*  0 */ { 4, s_4_0, -1, 1, 0},
+/*  1 */ { 4, s_4_1, -1, 1, 0},
+/*  2 */ { 4, s_4_2, -1, 1, 0}
+};
+
+static symbol s_5_0[2] = { 'i', 'c' };
+static symbol s_5_1[4] = { 'a', 'b', 'i', 'l' };
+static symbol s_5_2[2] = { 'i', 'v' };
+
+static struct among a_5[3] =
+{
+/*  0 */ { 2, s_5_0, -1, 1, 0},
+/*  1 */ { 4, s_5_1, -1, 1, 0},
+/*  2 */ { 2, s_5_2, -1, 1, 0}
+};
+
+static symbol s_6_0[3] = { 'i', 'c', 'a' };
+static symbol s_6_1[5] = { 'a', 'n', 'c', 'i', 'a' };
+static symbol s_6_2[5] = { 'e', 'n', 'c', 'i', 'a' };
+static symbol s_6_3[5] = { 'a', 'd', 'o', 'r', 'a' };
+static symbol s_6_4[3] = { 'o', 's', 'a' };
+static symbol s_6_5[4] = { 'i', 's', 't', 'a' };
+static symbol s_6_6[3] = { 'i', 'v', 'a' };
+static symbol s_6_7[4] = { 'a', 'n', 'z', 'a' };
+static symbol s_6_8[6] = { 'l', 'o', 'g', 0xC3, 0xAD, 'a' };
+static symbol s_6_9[4] = { 'i', 'd', 'a', 'd' };
+static symbol s_6_10[4] = { 'a', 'b', 'l', 'e' };
+static symbol s_6_11[4] = { 'i', 'b', 'l', 'e' };
+static symbol s_6_12[4] = { 'a', 'n', 't', 'e' };
+static symbol s_6_13[5] = { 'm', 'e', 'n', 't', 'e' };
+static symbol s_6_14[6] = { 'a', 'm', 'e', 'n', 't', 'e' };
+static symbol s_6_15[6] = { 'a', 'c', 'i', 0xC3, 0xB3, 'n' };
+static symbol s_6_16[6] = { 'u', 'c', 'i', 0xC3, 0xB3, 'n' };
+static symbol s_6_17[3] = { 'i', 'c', 'o' };
+static symbol s_6_18[4] = { 'i', 's', 'm', 'o' };
+static symbol s_6_19[3] = { 'o', 's', 'o' };
+static symbol s_6_20[7] = { 'a', 'm', 'i', 'e', 'n', 't', 'o' };
+static symbol s_6_21[7] = { 'i', 'm', 'i', 'e', 'n', 't', 'o' };
+static symbol s_6_22[3] = { 'i', 'v', 'o' };
+static symbol s_6_23[4] = { 'a', 'd', 'o', 'r' };
+static symbol s_6_24[4] = { 'i', 'c', 'a', 's' };
+static symbol s_6_25[6] = { 'a', 'n', 'c', 'i', 'a', 's' };
+static symbol s_6_26[6] = { 'e', 'n', 'c', 'i', 'a', 's' };
+static symbol s_6_27[6] = { 'a', 'd', 'o', 'r', 'a', 's' };
+static symbol s_6_28[4] = { 'o', 's', 'a', 's' };
+static symbol s_6_29[5] = { 'i', 's', 't', 'a', 's' };
+static symbol s_6_30[4] = { 'i', 'v', 'a', 's' };
+static symbol s_6_31[5] = { 'a', 'n', 'z', 'a', 's' };
+static symbol s_6_32[7] = { 'l', 'o', 'g', 0xC3, 0xAD, 'a', 's' };
+static symbol s_6_33[6] = { 'i', 'd', 'a', 'd', 'e', 's' };
+static symbol s_6_34[5] = { 'a', 'b', 'l', 'e', 's' };
+static symbol s_6_35[5] = { 'i', 'b', 'l', 'e', 's' };
+static symbol s_6_36[7] = { 'a', 'c', 'i', 'o', 'n', 'e', 's' };
+static symbol s_6_37[7] = { 'u', 'c', 'i', 'o', 'n', 'e', 's' };
+static symbol s_6_38[6] = { 'a', 'd', 'o', 'r', 'e', 's' };
+static symbol s_6_39[5] = { 'a', 'n', 't', 'e', 's' };
+static symbol s_6_40[4] = { 'i', 'c', 'o', 's' };
+static symbol s_6_41[5] = { 'i', 's', 'm', 'o', 's' };
+static symbol s_6_42[4] = { 'o', 's', 'o', 's' };
+static symbol s_6_43[8] = { 'a', 'm', 'i', 'e', 'n', 't', 'o', 's' };
+static symbol s_6_44[8] = { 'i', 'm', 'i', 'e', 'n', 't', 'o', 's' };
+static symbol s_6_45[4] = { 'i', 'v', 'o', 's' };
+
+static struct among a_6[46] =
+{
+/*  0 */ { 3, s_6_0, -1, 1, 0},
+/*  1 */ { 5, s_6_1, -1, 2, 0},
+/*  2 */ { 5, s_6_2, -1, 5, 0},
+/*  3 */ { 5, s_6_3, -1, 2, 0},
+/*  4 */ { 3, s_6_4, -1, 1, 0},
+/*  5 */ { 4, s_6_5, -1, 1, 0},
+/*  6 */ { 3, s_6_6, -1, 9, 0},
+/*  7 */ { 4, s_6_7, -1, 1, 0},
+/*  8 */ { 6, s_6_8, -1, 3, 0},
+/*  9 */ { 4, s_6_9, -1, 8, 0},
+/* 10 */ { 4, s_6_10, -1, 1, 0},
+/* 11 */ { 4, s_6_11, -1, 1, 0},
+/* 12 */ { 4, s_6_12, -1, 2, 0},
+/* 13 */ { 5, s_6_13, -1, 7, 0},
+/* 14 */ { 6, s_6_14, 13, 6, 0},
+/* 15 */ { 6, s_6_15, -1, 2, 0},
+/* 16 */ { 6, s_6_16, -1, 4, 0},
+/* 17 */ { 3, s_6_17, -1, 1, 0},
+/* 18 */ { 4, s_6_18, -1, 1, 0},
+/* 19 */ { 3, s_6_19, -1, 1, 0},
+/* 20 */ { 7, s_6_20, -1, 1, 0},
+/* 21 */ { 7, s_6_21, -1, 1, 0},
+/* 22 */ { 3, s_6_22, -1, 9, 0},
+/* 23 */ { 4, s_6_23, -1, 2, 0},
+/* 24 */ { 4, s_6_24, -1, 1, 0},
+/* 25 */ { 6, s_6_25, -1, 2, 0},
+/* 26 */ { 6, s_6_26, -1, 5, 0},
+/* 27 */ { 6, s_6_27, -1, 2, 0},
+/* 28 */ { 4, s_6_28, -1, 1, 0},
+/* 29 */ { 5, s_6_29, -1, 1, 0},
+/* 30 */ { 4, s_6_30, -1, 9, 0},
+/* 31 */ { 5, s_6_31, -1, 1, 0},
+/* 32 */ { 7, s_6_32, -1, 3, 0},
+/* 33 */ { 6, s_6_33, -1, 8, 0},
+/* 34 */ { 5, s_6_34, -1, 1, 0},
+/* 35 */ { 5, s_6_35, -1, 1, 0},
+/* 36 */ { 7, s_6_36, -1, 2, 0},
+/* 37 */ { 7, s_6_37, -1, 4, 0},
+/* 38 */ { 6, s_6_38, -1, 2, 0},
+/* 39 */ { 5, s_6_39, -1, 2, 0},
+/* 40 */ { 4, s_6_40, -1, 1, 0},
+/* 41 */ { 5, s_6_41, -1, 1, 0},
+/* 42 */ { 4, s_6_42, -1, 1, 0},
+/* 43 */ { 8, s_6_43, -1, 1, 0},
+/* 44 */ { 8, s_6_44, -1, 1, 0},
+/* 45 */ { 4, s_6_45, -1, 9, 0}
+};
+
+static symbol s_7_0[2] = { 'y', 'a' };
+static symbol s_7_1[2] = { 'y', 'e' };
+static symbol s_7_2[3] = { 'y', 'a', 'n' };
+static symbol s_7_3[3] = { 'y', 'e', 'n' };
+static symbol s_7_4[5] = { 'y', 'e', 'r', 'o', 'n' };
+static symbol s_7_5[5] = { 'y', 'e', 'n', 'd', 'o' };
+static symbol s_7_6[2] = { 'y', 'o' };
+static symbol s_7_7[3] = { 'y', 'a', 's' };
+static symbol s_7_8[3] = { 'y', 'e', 's' };
+static symbol s_7_9[4] = { 'y', 'a', 'i', 's' };
+static symbol s_7_10[5] = { 'y', 'a', 'm', 'o', 's' };
+static symbol s_7_11[3] = { 'y', 0xC3, 0xB3 };
+
+static struct among a_7[12] =
+{
+/*  0 */ { 2, s_7_0, -1, 1, 0},
+/*  1 */ { 2, s_7_1, -1, 1, 0},
+/*  2 */ { 3, s_7_2, -1, 1, 0},
+/*  3 */ { 3, s_7_3, -1, 1, 0},
+/*  4 */ { 5, s_7_4, -1, 1, 0},
+/*  5 */ { 5, s_7_5, -1, 1, 0},
+/*  6 */ { 2, s_7_6, -1, 1, 0},
+/*  7 */ { 3, s_7_7, -1, 1, 0},
+/*  8 */ { 3, s_7_8, -1, 1, 0},
+/*  9 */ { 4, s_7_9, -1, 1, 0},
+/* 10 */ { 5, s_7_10, -1, 1, 0},
+/* 11 */ { 3, s_7_11, -1, 1, 0}
+};
+
+static symbol s_8_0[3] = { 'a', 'b', 'a' };
+static symbol s_8_1[3] = { 'a', 'd', 'a' };
+static symbol s_8_2[3] = { 'i', 'd', 'a' };
+static symbol s_8_3[3] = { 'a', 'r', 'a' };
+static symbol s_8_4[4] = { 'i', 'e', 'r', 'a' };
+static symbol s_8_5[3] = { 0xC3, 0xAD, 'a' };
+static symbol s_8_6[5] = { 'a', 'r', 0xC3, 0xAD, 'a' };
+static symbol s_8_7[5] = { 'e', 'r', 0xC3, 0xAD, 'a' };
+static symbol s_8_8[5] = { 'i', 'r', 0xC3, 0xAD, 'a' };
+static symbol s_8_9[2] = { 'a', 'd' };
+static symbol s_8_10[2] = { 'e', 'd' };
+static symbol s_8_11[2] = { 'i', 'd' };
+static symbol s_8_12[3] = { 'a', 's', 'e' };
+static symbol s_8_13[4] = { 'i', 'e', 's', 'e' };
+static symbol s_8_14[4] = { 'a', 's', 't', 'e' };
+static symbol s_8_15[4] = { 'i', 's', 't', 'e' };
+static symbol s_8_16[2] = { 'a', 'n' };
+static symbol s_8_17[4] = { 'a', 'b', 'a', 'n' };
+static symbol s_8_18[4] = { 'a', 'r', 'a', 'n' };
+static symbol s_8_19[5] = { 'i', 'e', 'r', 'a', 'n' };
+static symbol s_8_20[4] = { 0xC3, 0xAD, 'a', 'n' };
+static symbol s_8_21[6] = { 'a', 'r', 0xC3, 0xAD, 'a', 'n' };
+static symbol s_8_22[6] = { 'e', 'r', 0xC3, 0xAD, 'a', 'n' };
+static symbol s_8_23[6] = { 'i', 'r', 0xC3, 0xAD, 'a', 'n' };
+static symbol s_8_24[2] = { 'e', 'n' };
+static symbol s_8_25[4] = { 'a', 's', 'e', 'n' };
+static symbol s_8_26[5] = { 'i', 'e', 's', 'e', 'n' };
+static symbol s_8_27[4] = { 'a', 'r', 'o', 'n' };
+static symbol s_8_28[5] = { 'i', 'e', 'r', 'o', 'n' };
+static symbol s_8_29[5] = { 'a', 'r', 0xC3, 0xA1, 'n' };
+static symbol s_8_30[5] = { 'e', 'r', 0xC3, 0xA1, 'n' };
+static symbol s_8_31[5] = { 'i', 'r', 0xC3, 0xA1, 'n' };
+static symbol s_8_32[3] = { 'a', 'd', 'o' };
+static symbol s_8_33[3] = { 'i', 'd', 'o' };
+static symbol s_8_34[4] = { 'a', 'n', 'd', 'o' };
+static symbol s_8_35[5] = { 'i', 'e', 'n', 'd', 'o' };
+static symbol s_8_36[2] = { 'a', 'r' };
+static symbol s_8_37[2] = { 'e', 'r' };
+static symbol s_8_38[2] = { 'i', 'r' };
+static symbol s_8_39[2] = { 'a', 's' };
+static symbol s_8_40[4] = { 'a', 'b', 'a', 's' };
+static symbol s_8_41[4] = { 'a', 'd', 'a', 's' };
+static symbol s_8_42[4] = { 'i', 'd', 'a', 's' };
+static symbol s_8_43[4] = { 'a', 'r', 'a', 's' };
+static symbol s_8_44[5] = { 'i', 'e', 'r', 'a', 's' };
+static symbol s_8_45[4] = { 0xC3, 0xAD, 'a', 's' };
+static symbol s_8_46[6] = { 'a', 'r', 0xC3, 0xAD, 'a', 's' };
+static symbol s_8_47[6] = { 'e', 'r', 0xC3, 0xAD, 'a', 's' };
+static symbol s_8_48[6] = { 'i', 'r', 0xC3, 0xAD, 'a', 's' };
+static symbol s_8_49[2] = { 'e', 's' };
+static symbol s_8_50[4] = { 'a', 's', 'e', 's' };
+static symbol s_8_51[5] = { 'i', 'e', 's', 'e', 's' };
+static symbol s_8_52[5] = { 'a', 'b', 'a', 'i', 's' };
+static symbol s_8_53[5] = { 'a', 'r', 'a', 'i', 's' };
+static symbol s_8_54[6] = { 'i', 'e', 'r', 'a', 'i', 's' };
+static symbol s_8_55[5] = { 0xC3, 0xAD, 'a', 'i', 's' };
+static symbol s_8_56[7] = { 'a', 'r', 0xC3, 0xAD, 'a', 'i', 's' };
+static symbol s_8_57[7] = { 'e', 'r', 0xC3, 0xAD, 'a', 'i', 's' };
+static symbol s_8_58[7] = { 'i', 'r', 0xC3, 0xAD, 'a', 'i', 's' };
+static symbol s_8_59[5] = { 'a', 's', 'e', 'i', 's' };
+static symbol s_8_60[6] = { 'i', 'e', 's', 'e', 'i', 's' };
+static symbol s_8_61[6] = { 'a', 's', 't', 'e', 'i', 's' };
+static symbol s_8_62[6] = { 'i', 's', 't', 'e', 'i', 's' };
+static symbol s_8_63[4] = { 0xC3, 0xA1, 'i', 's' };
+static symbol s_8_64[4] = { 0xC3, 0xA9, 'i', 's' };
+static symbol s_8_65[6] = { 'a', 'r', 0xC3, 0xA9, 'i', 's' };
+static symbol s_8_66[6] = { 'e', 'r', 0xC3, 0xA9, 'i', 's' };
+static symbol s_8_67[6] = { 'i', 'r', 0xC3, 0xA9, 'i', 's' };
+static symbol s_8_68[4] = { 'a', 'd', 'o', 's' };
+static symbol s_8_69[4] = { 'i', 'd', 'o', 's' };
+static symbol s_8_70[4] = { 'a', 'm', 'o', 's' };
+static symbol s_8_71[7] = { 0xC3, 0xA1, 'b', 'a', 'm', 'o', 's' };
+static symbol s_8_72[7] = { 0xC3, 0xA1, 'r', 'a', 'm', 'o', 's' };
+static symbol s_8_73[8] = { 'i', 0xC3, 0xA9, 'r', 'a', 'm', 'o', 's' };
+static symbol s_8_74[6] = { 0xC3, 0xAD, 'a', 'm', 'o', 's' };
+static symbol s_8_75[8] = { 'a', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' };
+static symbol s_8_76[8] = { 'e', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' };
+static symbol s_8_77[8] = { 'i', 'r', 0xC3, 0xAD, 'a', 'm', 'o', 's' };
+static symbol s_8_78[4] = { 'e', 'm', 'o', 's' };
+static symbol s_8_79[6] = { 'a', 'r', 'e', 'm', 'o', 's' };
+static symbol s_8_80[6] = { 'e', 'r', 'e', 'm', 'o', 's' };
+static symbol s_8_81[6] = { 'i', 'r', 'e', 'm', 'o', 's' };
+static symbol s_8_82[7] = { 0xC3, 0xA1, 's', 'e', 'm', 'o', 's' };
+static symbol s_8_83[8] = { 'i', 0xC3, 0xA9, 's', 'e', 'm', 'o', 's' };
+static symbol s_8_84[4] = { 'i', 'm', 'o', 's' };
+static symbol s_8_85[5] = { 'a', 'r', 0xC3, 0xA1, 's' };
+static symbol s_8_86[5] = { 'e', 'r', 0xC3, 0xA1, 's' };
+static symbol s_8_87[5] = { 'i', 'r', 0xC3, 0xA1, 's' };
+static symbol s_8_88[3] = { 0xC3, 0xAD, 's' };
+static symbol s_8_89[4] = { 'a', 'r', 0xC3, 0xA1 };
+static symbol s_8_90[4] = { 'e', 'r', 0xC3, 0xA1 };
+static symbol s_8_91[4] = { 'i', 'r', 0xC3, 0xA1 };
+static symbol s_8_92[4] = { 'a', 'r', 0xC3, 0xA9 };
+static symbol s_8_93[4] = { 'e', 'r', 0xC3, 0xA9 };
+static symbol s_8_94[4] = { 'i', 'r', 0xC3, 0xA9 };
+static symbol s_8_95[3] = { 'i', 0xC3, 0xB3 };
+
+static struct among a_8[96] =
+{
+/*  0 */ { 3, s_8_0, -1, 2, 0},
+/*  1 */ { 3, s_8_1, -1, 2, 0},
+/*  2 */ { 3, s_8_2, -1, 2, 0},
+/*  3 */ { 3, s_8_3, -1, 2, 0},
+/*  4 */ { 4, s_8_4, -1, 2, 0},
+/*  5 */ { 3, s_8_5, -1, 2, 0},
+/*  6 */ { 5, s_8_6, 5, 2, 0},
+/*  7 */ { 5, s_8_7, 5, 2, 0},
+/*  8 */ { 5, s_8_8, 5, 2, 0},
+/*  9 */ { 2, s_8_9, -1, 2, 0},
+/* 10 */ { 2, s_8_10, -1, 2, 0},
+/* 11 */ { 2, s_8_11, -1, 2, 0},
+/* 12 */ { 3, s_8_12, -1, 2, 0},
+/* 13 */ { 4, s_8_13, -1, 2, 0},
+/* 14 */ { 4, s_8_14, -1, 2, 0},
+/* 15 */ { 4, s_8_15, -1, 2, 0},
+/* 16 */ { 2, s_8_16, -1, 2, 0},
+/* 17 */ { 4, s_8_17, 16, 2, 0},
+/* 18 */ { 4, s_8_18, 16, 2, 0},
+/* 19 */ { 5, s_8_19, 16, 2, 0},
+/* 20 */ { 4, s_8_20, 16, 2, 0},
+/* 21 */ { 6, s_8_21, 20, 2, 0},
+/* 22 */ { 6, s_8_22, 20, 2, 0},
+/* 23 */ { 6, s_8_23, 20, 2, 0},
+/* 24 */ { 2, s_8_24, -1, 1, 0},
+/* 25 */ { 4, s_8_25, 24, 2, 0},
+/* 26 */ { 5, s_8_26, 24, 2, 0},
+/* 27 */ { 4, s_8_27, -1, 2, 0},
+/* 28 */ { 5, s_8_28, -1, 2, 0},
+/* 29 */ { 5, s_8_29, -1, 2, 0},
+/* 30 */ { 5, s_8_30, -1, 2, 0},
+/* 31 */ { 5, s_8_31, -1, 2, 0},
+/* 32 */ { 3, s_8_32, -1, 2, 0},
+/* 33 */ { 3, s_8_33, -1, 2, 0},
+/* 34 */ { 4, s_8_34, -1, 2, 0},
+/* 35 */ { 5, s_8_35, -1, 2, 0},
+/* 36 */ { 2, s_8_36, -1, 2, 0},
+/* 37 */ { 2, s_8_37, -1, 2, 0},
+/* 38 */ { 2, s_8_38, -1, 2, 0},
+/* 39 */ { 2, s_8_39, -1, 2, 0},
+/* 40 */ { 4, s_8_40, 39, 2, 0},
+/* 41 */ { 4, s_8_41, 39, 2, 0},
+/* 42 */ { 4, s_8_42, 39, 2, 0},
+/* 43 */ { 4, s_8_43, 39, 2, 0},
+/* 44 */ { 5, s_8_44, 39, 2, 0},
+/* 45 */ { 4, s_8_45, 39, 2, 0},
+/* 46 */ { 6, s_8_46, 45, 2, 0},
+/* 47 */ { 6, s_8_47, 45, 2, 0},
+/* 48 */ { 6, s_8_48, 45, 2, 0},
+/* 49 */ { 2, s_8_49, -1, 1, 0},
+/* 50 */ { 4, s_8_50, 49, 2, 0},
+/* 51 */ { 5, s_8_51, 49, 2, 0},
+/* 52 */ { 5, s_8_52, -1, 2, 0},
+/* 53 */ { 5, s_8_53, -1, 2, 0},
+/* 54 */ { 6, s_8_54, -1, 2, 0},
+/* 55 */ { 5, s_8_55, -1, 2, 0},
+/* 56 */ { 7, s_8_56, 55, 2, 0},
+/* 57 */ { 7, s_8_57, 55, 2, 0},
+/* 58 */ { 7, s_8_58, 55, 2, 0},
+/* 59 */ { 5, s_8_59, -1, 2, 0},
+/* 60 */ { 6, s_8_60, -1, 2, 0},
+/* 61 */ { 6, s_8_61, -1, 2, 0},
+/* 62 */ { 6, s_8_62, -1, 2, 0},
+/* 63 */ { 4, s_8_63, -1, 2, 0},
+/* 64 */ { 4, s_8_64, -1, 1, 0},
+/* 65 */ { 6, s_8_65, 64, 2, 0},
+/* 66 */ { 6, s_8_66, 64, 2, 0},
+/* 67 */ { 6, s_8_67, 64, 2, 0},
+/* 68 */ { 4, s_8_68, -1, 2, 0},
+/* 69 */ { 4, s_8_69, -1, 2, 0},
+/* 70 */ { 4, s_8_70, -1, 2, 0},
+/* 71 */ { 7, s_8_71, 70, 2, 0},
+/* 72 */ { 7, s_8_72, 70, 2, 0},
+/* 73 */ { 8, s_8_73, 70, 2, 0},
+/* 74 */ { 6, s_8_74, 70, 2, 0},
+/* 75 */ { 8, s_8_75, 74, 2, 0},
+/* 76 */ { 8, s_8_76, 74, 2, 0},
+/* 77 */ { 8, s_8_77, 74, 2, 0},
+/* 78 */ { 4, s_8_78, -1, 1, 0},
+/* 79 */ { 6, s_8_79, 78, 2, 0},
+/* 80 */ { 6, s_8_80, 78, 2, 0},
+/* 81 */ { 6, s_8_81, 78, 2, 0},
+/* 82 */ { 7, s_8_82, 78, 2, 0},
+/* 83 */ { 8, s_8_83, 78, 2, 0},
+/* 84 */ { 4, s_8_84, -1, 2, 0},
+/* 85 */ { 5, s_8_85, -1, 2, 0},
+/* 86 */ { 5, s_8_86, -1, 2, 0},
+/* 87 */ { 5, s_8_87, -1, 2, 0},
+/* 88 */ { 3, s_8_88, -1, 2, 0},
+/* 89 */ { 4, s_8_89, -1, 2, 0},
+/* 90 */ { 4, s_8_90, -1, 2, 0},
+/* 91 */ { 4, s_8_91, -1, 2, 0},
+/* 92 */ { 4, s_8_92, -1, 2, 0},
+/* 93 */ { 4, s_8_93, -1, 2, 0},
+/* 94 */ { 4, s_8_94, -1, 2, 0},
+/* 95 */ { 3, s_8_95, -1, 2, 0}
+};
+
+static symbol s_9_0[1] = { 'a' };
+static symbol s_9_1[1] = { 'e' };
+static symbol s_9_2[1] = { 'o' };
+static symbol s_9_3[2] = { 'o', 's' };
+static symbol s_9_4[2] = { 0xC3, 0xA1 };
+static symbol s_9_5[2] = { 0xC3, 0xA9 };
+static symbol s_9_6[2] = { 0xC3, 0xAD };
+static symbol s_9_7[2] = { 0xC3, 0xB3 };
+
+static struct among a_9[8] =
+{
+/*  0 */ { 1, s_9_0, -1, 1, 0},
+/*  1 */ { 1, s_9_1, -1, 2, 0},
+/*  2 */ { 1, s_9_2, -1, 1, 0},
+/*  3 */ { 2, s_9_3, -1, 1, 0},
+/*  4 */ { 2, s_9_4, -1, 1, 0},
+/*  5 */ { 2, s_9_5, -1, 2, 0},
+/*  6 */ { 2, s_9_6, -1, 1, 0},
+/*  7 */ { 2, s_9_7, -1, 1, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 4, 10 };
+
+static symbol s_0[] = { 'a' };
+static symbol s_1[] = { 'e' };
+static symbol s_2[] = { 'i' };
+static symbol s_3[] = { 'o' };
+static symbol s_4[] = { 'u' };
+static symbol s_5[] = { 'i', 'e', 'n', 'd', 'o' };
+static symbol s_6[] = { 'a', 'n', 'd', 'o' };
+static symbol s_7[] = { 'a', 'r' };
+static symbol s_8[] = { 'e', 'r' };
+static symbol s_9[] = { 'i', 'r' };
+static symbol s_10[] = { 'u' };
+static symbol s_11[] = { 'i', 'c' };
+static symbol s_12[] = { 'l', 'o', 'g' };
+static symbol s_13[] = { 'u' };
+static symbol s_14[] = { 'e', 'n', 't', 'e' };
+static symbol s_15[] = { 'a', 't' };
+static symbol s_16[] = { 'a', 't' };
+static symbol s_17[] = { 'u' };
+static symbol s_18[] = { 'u' };
+static symbol s_19[] = { 'g' };
+static symbol s_20[] = { 'u' };
+static symbol s_21[] = { 'g' };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    z->I[1] = z->l;
+    z->I[2] = z->l;
+    {   int c = z->c; /* do, line 37 */
+        {   int c = z->c; /* or, line 39 */
+            if (!(in_grouping_U(z, g_v, 97, 252))) goto lab2;
+            {   int c = z->c; /* or, line 38 */
+                if (!(out_grouping_U(z, g_v, 97, 252))) goto lab4;
+                while(1) { /* gopast, line 38 */
+                    if (!(in_grouping_U(z, g_v, 97, 252))) goto lab5;
+                    break;
+                lab5:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab4;
+                        z->c = c; /* gopast, line 38 */
+                    }
+                }
+                goto lab3;
+            lab4:
+                z->c = c;
+                if (!(in_grouping_U(z, g_v, 97, 252))) goto lab2;
+                while(1) { /* gopast, line 38 */
+                    if (!(out_grouping_U(z, g_v, 97, 252))) goto lab6;
+                    break;
+                lab6:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab2;
+                        z->c = c; /* gopast, line 38 */
+                    }
+                }
+            }
+        lab3:
+            goto lab1;
+        lab2:
+            z->c = c;
+            if (!(out_grouping_U(z, g_v, 97, 252))) goto lab0;
+            {   int c = z->c; /* or, line 40 */
+                if (!(out_grouping_U(z, g_v, 97, 252))) goto lab8;
+                while(1) { /* gopast, line 40 */
+                    if (!(in_grouping_U(z, g_v, 97, 252))) goto lab9;
+                    break;
+                lab9:
+                    {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                        if (c < 0) goto lab8;
+                        z->c = c; /* gopast, line 40 */
+                    }
+                }
+                goto lab7;
+            lab8:
+                z->c = c;
+                if (!(in_grouping_U(z, g_v, 97, 252))) goto lab0;
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 40 */
+                }
+            }
+        lab7:
+            ;
+        }
+    lab1:
+        z->I[0] = z->c; /* setmark pV, line 41 */
+    lab0:
+        z->c = c;
+    }
+    {   int c = z->c; /* do, line 43 */
+        while(1) { /* gopast, line 44 */
+            if (!(in_grouping_U(z, g_v, 97, 252))) goto lab11;
+            break;
+        lab11:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 44 */
+            }
+        }
+        while(1) { /* gopast, line 44 */
+            if (!(out_grouping_U(z, g_v, 97, 252))) goto lab12;
+            break;
+        lab12:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 44 */
+            }
+        }
+        z->I[1] = z->c; /* setmark p1, line 44 */
+        while(1) { /* gopast, line 45 */
+            if (!(in_grouping_U(z, g_v, 97, 252))) goto lab13;
+            break;
+        lab13:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 45 */
+            }
+        }
+        while(1) { /* gopast, line 45 */
+            if (!(out_grouping_U(z, g_v, 97, 252))) goto lab14;
+            break;
+        lab14:
+            {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                if (c < 0) goto lab10;
+                z->c = c; /* gopast, line 45 */
+            }
+        }
+        z->I[2] = z->c; /* setmark p2, line 45 */
+    lab10:
+        z->c = c;
+    }
+    return 1;
+}
+
+static int r_postlude(struct SN_env * z) {
+    int among_var;
+    while(1) { /* repeat, line 49 */
+        int c = z->c;
+        z->bra = z->c; /* [, line 50 */
+        among_var = find_among(z, a_0, 6); /* substring, line 50 */
+        if (!(among_var)) goto lab0;
+        z->ket = z->c; /* ], line 50 */
+        switch(among_var) {
+            case 0: goto lab0;
+            case 1:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_0); /* <-, line 51 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_1); /* <-, line 52 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_2); /* <-, line 53 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 4:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_3); /* <-, line 54 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 5:
+                {   int ret;
+                    ret = slice_from_s(z, 1, s_4); /* <-, line 55 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 6:
+                {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (c < 0) goto lab0;
+                    z->c = c; /* next, line 57 */
+                }
+                break;
+        }
+        continue;
+    lab0:
+        z->c = c;
+        break;
+    }
+    return 1;
+}
+
+static int r_RV(struct SN_env * z) {
+    if (!(z->I[0] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) {
+    if (!(z->I[1] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_R2(struct SN_env * z) {
+    if (!(z->I[2] <= z->c)) return 0;
+    return 1;
+}
+
+static int r_attached_pronoun(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 68 */
+    if (!(find_among_b(z, a_1, 13))) return 0; /* substring, line 68 */
+    z->bra = z->c; /* ], line 68 */
+    among_var = find_among_b(z, a_2, 11); /* substring, line 72 */
+    if (!(among_var)) return 0;
+    {   int ret = r_RV(z);
+        if (ret == 0) return 0; /* call RV, line 72 */
+        if (ret < 0) return ret;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            z->bra = z->c; /* ], line 73 */
+            {   int ret;
+                ret = slice_from_s(z, 5, s_5); /* <-, line 73 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            z->bra = z->c; /* ], line 74 */
+            {   int ret;
+                ret = slice_from_s(z, 4, s_6); /* <-, line 74 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            z->bra = z->c; /* ], line 75 */
+            {   int ret;
+                ret = slice_from_s(z, 2, s_7); /* <-, line 75 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            z->bra = z->c; /* ], line 76 */
+            {   int ret;
+                ret = slice_from_s(z, 2, s_8); /* <-, line 76 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            z->bra = z->c; /* ], line 77 */
+            {   int ret;
+                ret = slice_from_s(z, 2, s_9); /* <-, line 77 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 81 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 7:
+            if (!(eq_s_b(z, 1, s_10))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 82 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_standard_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 87 */
+    among_var = find_among_b(z, a_6, 46); /* substring, line 87 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 87 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 99 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 99 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 105 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 105 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 106 */
+                z->ket = z->c; /* [, line 106 */
+                if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m; goto lab0; }
+                z->bra = z->c; /* ], line 106 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab0; } /* call R2, line 106 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 106 */
+                    if (ret < 0) return ret;
+                }
+            lab0:
+                ;
+            }
+            break;
+        case 3:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 111 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 3, s_12); /* <-, line 111 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 4:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 115 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 1, s_13); /* <-, line 115 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 5:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 119 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_from_s(z, 4, s_14); /* <-, line 119 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 6:
+            {   int ret = r_R1(z);
+                if (ret == 0) return 0; /* call R1, line 123 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 123 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 124 */
+                z->ket = z->c; /* [, line 125 */
+                among_var = find_among_b(z, a_3, 4); /* substring, line 125 */
+                if (!(among_var)) { z->c = z->l - m; goto lab1; }
+                z->bra = z->c; /* ], line 125 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 125 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 125 */
+                    if (ret < 0) return ret;
+                }
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab1; }
+                    case 1:
+                        z->ket = z->c; /* [, line 126 */
+                        if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m; goto lab1; }
+                        z->bra = z->c; /* ], line 126 */
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab1; } /* call R2, line 126 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 126 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab1:
+                ;
+            }
+            break;
+        case 7:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 135 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 135 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 136 */
+                z->ket = z->c; /* [, line 137 */
+                among_var = find_among_b(z, a_4, 3); /* substring, line 137 */
+                if (!(among_var)) { z->c = z->l - m; goto lab2; }
+                z->bra = z->c; /* ], line 137 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab2; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab2; } /* call R2, line 140 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 140 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab2:
+                ;
+            }
+            break;
+        case 8:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 147 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 147 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 148 */
+                z->ket = z->c; /* [, line 149 */
+                among_var = find_among_b(z, a_5, 3); /* substring, line 149 */
+                if (!(among_var)) { z->c = z->l - m; goto lab3; }
+                z->bra = z->c; /* ], line 149 */
+                switch(among_var) {
+                    case 0: { z->c = z->l - m; goto lab3; }
+                    case 1:
+                        {   int ret = r_R2(z);
+                            if (ret == 0) { z->c = z->l - m; goto lab3; } /* call R2, line 152 */
+                            if (ret < 0) return ret;
+                        }
+                        {   int ret;
+                            ret = slice_del(z); /* delete, line 152 */
+                            if (ret < 0) return ret;
+                        }
+                        break;
+                }
+            lab3:
+                ;
+            }
+            break;
+        case 9:
+            {   int ret = r_R2(z);
+                if (ret == 0) return 0; /* call R2, line 159 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 159 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 160 */
+                z->ket = z->c; /* [, line 161 */
+                if (!(eq_s_b(z, 2, s_16))) { z->c = z->l - m; goto lab4; }
+                z->bra = z->c; /* ], line 161 */
+                {   int ret = r_R2(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab4; } /* call R2, line 161 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 161 */
+                    if (ret < 0) return ret;
+                }
+            lab4:
+                ;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_y_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 168 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 168 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 168 */
+        among_var = find_among_b(z, a_7, 12); /* substring, line 168 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 168 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            if (!(eq_s_b(z, 1, s_17))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 171 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_verb_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 176 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 176 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 176 */
+        among_var = find_among_b(z, a_8, 96); /* substring, line 176 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 176 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int m = z->l - z->c; (void) m; /* try, line 179 */
+                if (!(eq_s_b(z, 1, s_18))) { z->c = z->l - m; goto lab0; }
+                {   int m_test = z->l - z->c; /* test, line 179 */
+                    if (!(eq_s_b(z, 1, s_19))) { z->c = z->l - m; goto lab0; }
+                    z->c = z->l - m_test;
+                }
+            lab0:
+                ;
+            }
+            z->bra = z->c; /* ], line 179 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 179 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 200 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_residual_suffix(struct SN_env * z) {
+    int among_var;
+    z->ket = z->c; /* [, line 205 */
+    among_var = find_among_b(z, a_9, 8); /* substring, line 205 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 205 */
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 208 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 208 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = r_RV(z);
+                if (ret == 0) return 0; /* call RV, line 210 */
+                if (ret < 0) return ret;
+            }
+            {   int ret;
+                ret = slice_del(z); /* delete, line 210 */
+                if (ret < 0) return ret;
+            }
+            {   int m = z->l - z->c; (void) m; /* try, line 210 */
+                z->ket = z->c; /* [, line 210 */
+                if (!(eq_s_b(z, 1, s_20))) { z->c = z->l - m; goto lab0; }
+                z->bra = z->c; /* ], line 210 */
+                {   int m_test = z->l - z->c; /* test, line 210 */
+                    if (!(eq_s_b(z, 1, s_21))) { z->c = z->l - m; goto lab0; }
+                    z->c = z->l - m_test;
+                }
+                {   int ret = r_RV(z);
+                    if (ret == 0) { z->c = z->l - m; goto lab0; } /* call RV, line 210 */
+                    if (ret < 0) return ret;
+                }
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 210 */
+                    if (ret < 0) return ret;
+                }
+            lab0:
+                ;
+            }
+            break;
+    }
+    return 1;
+}
+
+extern int spanish_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 216 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 216 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 217 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 218 */
+        {   int ret = r_attached_pronoun(z);
+            if (ret == 0) goto lab1; /* call attached_pronoun, line 218 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 219 */
+        {   int m = z->l - z->c; (void) m; /* or, line 219 */
+            {   int ret = r_standard_suffix(z);
+                if (ret == 0) goto lab4; /* call standard_suffix, line 219 */
+                if (ret < 0) return ret;
+            }
+            goto lab3;
+        lab4:
+            z->c = z->l - m;
+            {   int ret = r_y_verb_suffix(z);
+                if (ret == 0) goto lab5; /* call y_verb_suffix, line 220 */
+                if (ret < 0) return ret;
+            }
+            goto lab3;
+        lab5:
+            z->c = z->l - m;
+            {   int ret = r_verb_suffix(z);
+                if (ret == 0) goto lab2; /* call verb_suffix, line 221 */
+                if (ret < 0) return ret;
+            }
+        }
+    lab3:
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 223 */
+        {   int ret = r_residual_suffix(z);
+            if (ret == 0) goto lab6; /* call residual_suffix, line 223 */
+            if (ret < 0) return ret;
+        }
+    lab6:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    {   int c = z->c; /* do, line 225 */
+        {   int ret = r_postlude(z);
+            if (ret == 0) goto lab7; /* call postlude, line 225 */
+            if (ret < 0) return ret;
+        }
+    lab7:
+        z->c = c;
+    }
+    return 1;
+}
+
+extern struct SN_env * spanish_UTF_8_create_env(void) { return SN_create_env(0, 3, 0); }
+
+extern void spanish_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_spanish.h b/libstemmer_c/src_c/stem_UTF_8_spanish.h
new file mode 100644
index 0000000..10572ec
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_spanish.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * spanish_UTF_8_create_env(void);
+extern void spanish_UTF_8_close_env(struct SN_env * z);
+
+extern int spanish_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_swedish.c b/libstemmer_c/src_c/stem_UTF_8_swedish.c
new file mode 100644
index 0000000..af75551
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_swedish.c
@@ -0,0 +1,313 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#include "../runtime/header.h"
+
+extern int swedish_UTF_8_stem(struct SN_env * z);
+static int r_other_suffix(struct SN_env * z);
+static int r_consonant_pair(struct SN_env * z);
+static int r_main_suffix(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+
+extern struct SN_env * swedish_UTF_8_create_env(void);
+extern void swedish_UTF_8_close_env(struct SN_env * z);
+
+static symbol s_0_0[1] = { 'a' };
+static symbol s_0_1[4] = { 'a', 'r', 'n', 'a' };
+static symbol s_0_2[4] = { 'e', 'r', 'n', 'a' };
+static symbol s_0_3[7] = { 'h', 'e', 't', 'e', 'r', 'n', 'a' };
+static symbol s_0_4[4] = { 'o', 'r', 'n', 'a' };
+static symbol s_0_5[2] = { 'a', 'd' };
+static symbol s_0_6[1] = { 'e' };
+static symbol s_0_7[3] = { 'a', 'd', 'e' };
+static symbol s_0_8[4] = { 'a', 'n', 'd', 'e' };
+static symbol s_0_9[4] = { 'a', 'r', 'n', 'e' };
+static symbol s_0_10[3] = { 'a', 'r', 'e' };
+static symbol s_0_11[4] = { 'a', 's', 't', 'e' };
+static symbol s_0_12[2] = { 'e', 'n' };
+static symbol s_0_13[5] = { 'a', 'n', 'd', 'e', 'n' };
+static symbol s_0_14[4] = { 'a', 'r', 'e', 'n' };
+static symbol s_0_15[5] = { 'h', 'e', 't', 'e', 'n' };
+static symbol s_0_16[3] = { 'e', 'r', 'n' };
+static symbol s_0_17[2] = { 'a', 'r' };
+static symbol s_0_18[2] = { 'e', 'r' };
+static symbol s_0_19[5] = { 'h', 'e', 't', 'e', 'r' };
+static symbol s_0_20[2] = { 'o', 'r' };
+static symbol s_0_21[1] = { 's' };
+static symbol s_0_22[2] = { 'a', 's' };
+static symbol s_0_23[5] = { 'a', 'r', 'n', 'a', 's' };
+static symbol s_0_24[5] = { 'e', 'r', 'n', 'a', 's' };
+static symbol s_0_25[5] = { 'o', 'r', 'n', 'a', 's' };
+static symbol s_0_26[2] = { 'e', 's' };
+static symbol s_0_27[4] = { 'a', 'd', 'e', 's' };
+static symbol s_0_28[5] = { 'a', 'n', 'd', 'e', 's' };
+static symbol s_0_29[3] = { 'e', 'n', 's' };
+static symbol s_0_30[5] = { 'a', 'r', 'e', 'n', 's' };
+static symbol s_0_31[6] = { 'h', 'e', 't', 'e', 'n', 's' };
+static symbol s_0_32[4] = { 'e', 'r', 'n', 's' };
+static symbol s_0_33[2] = { 'a', 't' };
+static symbol s_0_34[5] = { 'a', 'n', 'd', 'e', 't' };
+static symbol s_0_35[3] = { 'h', 'e', 't' };
+static symbol s_0_36[3] = { 'a', 's', 't' };
+
+static struct among a_0[37] =
+{
+/*  0 */ { 1, s_0_0, -1, 1, 0},
+/*  1 */ { 4, s_0_1, 0, 1, 0},
+/*  2 */ { 4, s_0_2, 0, 1, 0},
+/*  3 */ { 7, s_0_3, 2, 1, 0},
+/*  4 */ { 4, s_0_4, 0, 1, 0},
+/*  5 */ { 2, s_0_5, -1, 1, 0},
+/*  6 */ { 1, s_0_6, -1, 1, 0},
+/*  7 */ { 3, s_0_7, 6, 1, 0},
+/*  8 */ { 4, s_0_8, 6, 1, 0},
+/*  9 */ { 4, s_0_9, 6, 1, 0},
+/* 10 */ { 3, s_0_10, 6, 1, 0},
+/* 11 */ { 4, s_0_11, 6, 1, 0},
+/* 12 */ { 2, s_0_12, -1, 1, 0},
+/* 13 */ { 5, s_0_13, 12, 1, 0},
+/* 14 */ { 4, s_0_14, 12, 1, 0},
+/* 15 */ { 5, s_0_15, 12, 1, 0},
+/* 16 */ { 3, s_0_16, -1, 1, 0},
+/* 17 */ { 2, s_0_17, -1, 1, 0},
+/* 18 */ { 2, s_0_18, -1, 1, 0},
+/* 19 */ { 5, s_0_19, 18, 1, 0},
+/* 20 */ { 2, s_0_20, -1, 1, 0},
+/* 21 */ { 1, s_0_21, -1, 2, 0},
+/* 22 */ { 2, s_0_22, 21, 1, 0},
+/* 23 */ { 5, s_0_23, 22, 1, 0},
+/* 24 */ { 5, s_0_24, 22, 1, 0},
+/* 25 */ { 5, s_0_25, 22, 1, 0},
+/* 26 */ { 2, s_0_26, 21, 1, 0},
+/* 27 */ { 4, s_0_27, 26, 1, 0},
+/* 28 */ { 5, s_0_28, 26, 1, 0},
+/* 29 */ { 3, s_0_29, 21, 1, 0},
+/* 30 */ { 5, s_0_30, 29, 1, 0},
+/* 31 */ { 6, s_0_31, 29, 1, 0},
+/* 32 */ { 4, s_0_32, 21, 1, 0},
+/* 33 */ { 2, s_0_33, -1, 1, 0},
+/* 34 */ { 5, s_0_34, -1, 1, 0},
+/* 35 */ { 3, s_0_35, -1, 1, 0},
+/* 36 */ { 3, s_0_36, -1, 1, 0}
+};
+
+static symbol s_1_0[2] = { 'd', 'd' };
+static symbol s_1_1[2] = { 'g', 'd' };
+static symbol s_1_2[2] = { 'n', 'n' };
+static symbol s_1_3[2] = { 'd', 't' };
+static symbol s_1_4[2] = { 'g', 't' };
+static symbol s_1_5[2] = { 'k', 't' };
+static symbol s_1_6[2] = { 't', 't' };
+
+static struct among a_1[7] =
+{
+/*  0 */ { 2, s_1_0, -1, -1, 0},
+/*  1 */ { 2, s_1_1, -1, -1, 0},
+/*  2 */ { 2, s_1_2, -1, -1, 0},
+/*  3 */ { 2, s_1_3, -1, -1, 0},
+/*  4 */ { 2, s_1_4, -1, -1, 0},
+/*  5 */ { 2, s_1_5, -1, -1, 0},
+/*  6 */ { 2, s_1_6, -1, -1, 0}
+};
+
+static symbol s_2_0[2] = { 'i', 'g' };
+static symbol s_2_1[3] = { 'l', 'i', 'g' };
+static symbol s_2_2[3] = { 'e', 'l', 's' };
+static symbol s_2_3[5] = { 'f', 'u', 'l', 'l', 't' };
+static symbol s_2_4[5] = { 'l', 0xC3, 0xB6, 's', 't' };
+
+static struct among a_2[5] =
+{
+/*  0 */ { 2, s_2_0, -1, 1, 0},
+/*  1 */ { 3, s_2_1, 0, 1, 0},
+/*  2 */ { 3, s_2_2, -1, 1, 0},
+/*  3 */ { 5, s_2_3, -1, 3, 0},
+/*  4 */ { 5, s_2_4, -1, 2, 0}
+};
+
+static unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 32 };
+
+static unsigned char g_s_ending[] = { 119, 127, 149 };
+
+static symbol s_0[] = { 'l', 0xC3, 0xB6, 's' };
+static symbol s_1[] = { 'f', 'u', 'l', 'l' };
+
+static int r_mark_regions(struct SN_env * z) {
+    z->I[0] = z->l;
+    {   int c_test = z->c; /* test, line 29 */
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, + 3);
+            if (c < 0) return 0;
+            z->c = c; /* hop, line 29 */
+        }
+        z->I[1] = z->c; /* setmark x, line 29 */
+        z->c = c_test;
+    }
+    while(1) { /* goto, line 30 */
+        int c = z->c;
+        if (!(in_grouping_U(z, g_v, 97, 246))) goto lab0;
+        z->c = c;
+        break;
+    lab0:
+        z->c = c;
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* goto, line 30 */
+        }
+    }
+    while(1) { /* gopast, line 30 */
+        if (!(out_grouping_U(z, g_v, 97, 246))) goto lab1;
+        break;
+    lab1:
+        {   int c = skip_utf8(z->p, z->c, 0, z->l, 1);
+            if (c < 0) return 0;
+            z->c = c; /* gopast, line 30 */
+        }
+    }
+    z->I[0] = z->c; /* setmark p1, line 30 */
+     /* try, line 31 */
+    if (!(z->I[0] < z->I[1])) goto lab2;
+    z->I[0] = z->I[1];
+lab2:
+    return 1;
+}
+
+static int r_main_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 37 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 37 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 37 */
+        among_var = find_among_b(z, a_0, 37); /* substring, line 37 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 37 */
+        z->lb = m3;
+    }
+    switch(among_var) {
+        case 0: return 0;
+        case 1:
+            {   int ret;
+                ret = slice_del(z); /* delete, line 44 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            if (!(in_grouping_b_U(z, g_s_ending, 98, 121))) return 0;
+            {   int ret;
+                ret = slice_del(z); /* delete, line 46 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_consonant_pair(struct SN_env * z) {
+    {   int m3; /* setlimit, line 50 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 50 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        {   int m = z->l - z->c; (void) m; /* and, line 52 */
+            if (!(find_among_b(z, a_1, 7))) { z->lb = m3; return 0; } /* among, line 51 */
+            z->c = z->l - m;
+            z->ket = z->c; /* [, line 52 */
+            {   int c = skip_utf8(z->p, z->c, z->lb, 0, -1);
+                if (c < 0) { z->lb = m3; return 0; }
+                z->c = c; /* next, line 52 */
+            }
+            z->bra = z->c; /* ], line 52 */
+            {   int ret;
+                ret = slice_del(z); /* delete, line 52 */
+                if (ret < 0) return ret;
+            }
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+static int r_other_suffix(struct SN_env * z) {
+    int among_var;
+    {   int m3; /* setlimit, line 55 */
+        int m = z->l - z->c; (void) m;
+        if (z->c < z->I[0]) return 0;
+        z->c = z->I[0]; /* tomark, line 55 */
+        m3 = z->lb; z->lb = z->c;
+        z->c = z->l - m;
+        z->ket = z->c; /* [, line 56 */
+        among_var = find_among_b(z, a_2, 5); /* substring, line 56 */
+        if (!(among_var)) { z->lb = m3; return 0; }
+        z->bra = z->c; /* ], line 56 */
+        switch(among_var) {
+            case 0: { z->lb = m3; return 0; }
+            case 1:
+                {   int ret;
+                    ret = slice_del(z); /* delete, line 57 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 2:
+                {   int ret;
+                    ret = slice_from_s(z, 4, s_0); /* <-, line 58 */
+                    if (ret < 0) return ret;
+                }
+                break;
+            case 3:
+                {   int ret;
+                    ret = slice_from_s(z, 4, s_1); /* <-, line 59 */
+                    if (ret < 0) return ret;
+                }
+                break;
+        }
+        z->lb = m3;
+    }
+    return 1;
+}
+
+extern int swedish_UTF_8_stem(struct SN_env * z) {
+    {   int c = z->c; /* do, line 66 */
+        {   int ret = r_mark_regions(z);
+            if (ret == 0) goto lab0; /* call mark_regions, line 66 */
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 67 */
+
+    {   int m = z->l - z->c; (void) m; /* do, line 68 */
+        {   int ret = r_main_suffix(z);
+            if (ret == 0) goto lab1; /* call main_suffix, line 68 */
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 69 */
+        {   int ret = r_consonant_pair(z);
+            if (ret == 0) goto lab2; /* call consonant_pair, line 69 */
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m;
+    }
+    {   int m = z->l - z->c; (void) m; /* do, line 70 */
+        {   int ret = r_other_suffix(z);
+            if (ret == 0) goto lab3; /* call other_suffix, line 70 */
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = z->l - m;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * swedish_UTF_8_create_env(void) { return SN_create_env(0, 2, 0); }
+
+extern void swedish_UTF_8_close_env(struct SN_env * z) { SN_close_env(z); }
+
diff --git a/libstemmer_c/src_c/stem_UTF_8_swedish.h b/libstemmer_c/src_c/stem_UTF_8_swedish.h
new file mode 100644
index 0000000..1444ebb
--- /dev/null
+++ b/libstemmer_c/src_c/stem_UTF_8_swedish.h
@@ -0,0 +1,16 @@
+
+/* This file was generated automatically by the Snowball to ANSI C compiler */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * swedish_UTF_8_create_env(void);
+extern void swedish_UTF_8_close_env(struct SN_env * z);
+
+extern int swedish_UTF_8_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/ppport.h b/ppport.h
new file mode 100644
index 0000000..dbc1227
--- /dev/null
+++ b/ppport.h
@@ -0,0 +1,5820 @@
+#if 0
+<<'SKIP';
+#endif
+/*
+----------------------------------------------------------------------
+
+    ppport.h -- Perl/Pollution/Portability Version 3.10
+
+    Automatically created by Devel::PPPort running under perl 5.008007.
+
+    Do NOT edit this file directly! -- Edit PPPort_pm.PL and the
+    includes in parts/inc/ instead.
+
+    Use 'perldoc ppport.h' to view the documentation below.
+
+----------------------------------------------------------------------
+
+SKIP
+
+=pod
+
+=head1 NAME
+
+ppport.h - Perl/Pollution/Portability version 3.10
+
+=head1 SYNOPSIS
+
+  perl ppport.h [options] [source files]
+
+  Searches current directory for files if no [source files] are given
+
+  --help                      show short help
+
+  --version                   show version
+
+  --patch=file                write one patch file with changes
+  --copy=suffix               write changed copies with suffix
+  --diff=program              use diff program and options
+
+  --compat-version=version    provide compatibility with Perl version
+  --cplusplus                 accept C++ comments
+
+  --quiet                     don't output anything except fatal errors
+  --nodiag                    don't show diagnostics
+  --nohints                   don't show hints
+  --nochanges                 don't suggest changes
+  --nofilter                  don't filter input files
+
+  --strip                     strip all script and doc functionality from
+                              ppport.h
+
+  --list-provided             list provided API
+  --list-unsupported          list unsupported API
+  --api-info=name             show Perl API portability information
+
+=head1 COMPATIBILITY
+
+This version of F<ppport.h> is designed to support operation with Perl
+installations back to 5.003, and has been tested up to 5.9.4.
+
+=head1 OPTIONS
+
+=head2 --help
+
+Display a brief usage summary.
+
+=head2 --version
+
+Display the version of F<ppport.h>.
+
+=head2 --patch=I<file>
+
+If this option is given, a single patch file will be created if
+any changes are suggested. This requires a working diff program
+to be installed on your system.
+
+=head2 --copy=I<suffix>
+
+If this option is given, a copy of each file will be saved with
+the given suffix that contains the suggested changes. This does
+not require any external programs.
+
+If neither C<--patch> or C<--copy> are given, the default is to
+simply print the diffs for each file. This requires either
+C<Text::Diff> or a C<diff> program to be installed.
+
+=head2 --diff=I<program>
+
+Manually set the diff program and options to use. The default
+is to use C<Text::Diff>, when installed, and output unified
+context diffs.
+
+=head2 --compat-version=I<version>
+
+Tell F<ppport.h> to check for compatibility with the given
+Perl version. The default is to check for compatibility with Perl
+version 5.003. You can use this option to reduce the output
+of F<ppport.h> if you intend to be backward compatible only
+down to a certain Perl version.
+
+=head2 --cplusplus
+
+Usually, F<ppport.h> will detect C++ style comments and
+replace them with C style comments for portability reasons.
+Using this option instructs F<ppport.h> to leave C++
+comments untouched.
+
+=head2 --quiet
+
+Be quiet. Don't print anything except fatal errors.
+
+=head2 --nodiag
+
+Don't output any diagnostic messages. Only portability
+alerts will be printed.
+
+=head2 --nohints
+
+Don't output any hints. Hints often contain useful portability
+notes.
+
+=head2 --nochanges
+
+Don't suggest any changes. Only give diagnostic output and hints
+unless these are also deactivated.
+
+=head2 --nofilter
+
+Don't filter the list of input files. By default, files not looking
+like source code (i.e. not *.xs, *.c, *.cc, *.cpp or *.h) are skipped.
+
+=head2 --strip
+
+Strip all script and documentation functionality from F<ppport.h>.
+This reduces the size of F<ppport.h> dramatically and may be useful
+if you want to include F<ppport.h> in smaller modules without
+increasing their distribution size too much.
+
+The stripped F<ppport.h> will have a C<--unstrip> option that allows
+you to undo the stripping, but only if an appropriate C<Devel::PPPort>
+module is installed.
+
+=head2 --list-provided
+
+Lists the API elements for which compatibility is provided by
+F<ppport.h>. Also lists if it must be explicitly requested,
+if it has dependencies, and if there are hints for it.
+
+=head2 --list-unsupported
+
+Lists the API elements that are known not to be supported by
+F<ppport.h> and below which version of Perl they probably
+won't be available or work.
+
+=head2 --api-info=I<name>
+
+Show portability information for API elements matching I<name>.
+If I<name> is surrounded by slashes, it is interpreted as a regular
+expression.
+
+=head1 DESCRIPTION
+
+In order for a Perl extension (XS) module to be as portable as possible
+across differing versions of Perl itself, certain steps need to be taken.
+
+=over 4
+
+=item *
+
+Including this header is the first major one. This alone will give you
+access to a large part of the Perl API that hasn't been available in
+earlier Perl releases. Use
+
+    perl ppport.h --list-provided
+
+to see which API elements are provided by ppport.h.
+
+=item *
+
+You should avoid using deprecated parts of the API. For example, using
+global Perl variables without the C<PL_> prefix is deprecated. Also,
+some API functions used to have a C<perl_> prefix. Using this form is
+also deprecated. You can safely use the supported API, as F<ppport.h>
+will provide wrappers for older Perl versions.
+
+=item *
+
+If you use one of a few functions or variables that were not present in
+earlier versions of Perl, and that can't be provided using a macro, you
+have to explicitly request support for these functions by adding one or
+more C<#define>s in your source code before the inclusion of F<ppport.h>.
+
+These functions or variables will be marked C<explicit> in the list shown
+by C<--list-provided>.
+
+Depending on whether you module has a single or multiple files that
+use such functions or variables, you want either C<static> or global
+variants.
+
+For a C<static> function or variable (used only in a single source
+file), use:
+
+    #define NEED_function
+    #define NEED_variable
+
+For a global function or variable (used in multiple source files),
+use:
+
+    #define NEED_function_GLOBAL
+    #define NEED_variable_GLOBAL
+
+Note that you mustn't have more than one global request for the
+same function or variable in your project.
+
+    Function / Variable       Static Request               Global Request
+    -----------------------------------------------------------------------------------------
+    PL_signals                NEED_PL_signals              NEED_PL_signals_GLOBAL
+    eval_pv()                 NEED_eval_pv                 NEED_eval_pv_GLOBAL
+    grok_bin()                NEED_grok_bin                NEED_grok_bin_GLOBAL
+    grok_hex()                NEED_grok_hex                NEED_grok_hex_GLOBAL
+    grok_number()             NEED_grok_number             NEED_grok_number_GLOBAL
+    grok_numeric_radix()      NEED_grok_numeric_radix      NEED_grok_numeric_radix_GLOBAL
+    grok_oct()                NEED_grok_oct                NEED_grok_oct_GLOBAL
+    my_snprintf()             NEED_my_snprintf             NEED_my_snprintf_GLOBAL
+    my_strlcat()              NEED_my_strlcat              NEED_my_strlcat_GLOBAL
+    my_strlcpy()              NEED_my_strlcpy              NEED_my_strlcpy_GLOBAL
+    newCONSTSUB()             NEED_newCONSTSUB             NEED_newCONSTSUB_GLOBAL
+    newRV_noinc()             NEED_newRV_noinc             NEED_newRV_noinc_GLOBAL
+    sv_2pv_nolen()            NEED_sv_2pv_nolen            NEED_sv_2pv_nolen_GLOBAL
+    sv_2pvbyte()              NEED_sv_2pvbyte              NEED_sv_2pvbyte_GLOBAL
+    sv_catpvf_mg()            NEED_sv_catpvf_mg            NEED_sv_catpvf_mg_GLOBAL
+    sv_catpvf_mg_nocontext()  NEED_sv_catpvf_mg_nocontext  NEED_sv_catpvf_mg_nocontext_GLOBAL
+    sv_setpvf_mg()            NEED_sv_setpvf_mg            NEED_sv_setpvf_mg_GLOBAL
+    sv_setpvf_mg_nocontext()  NEED_sv_setpvf_mg_nocontext  NEED_sv_setpvf_mg_nocontext_GLOBAL
+    vnewSVpvf()               NEED_vnewSVpvf               NEED_vnewSVpvf_GLOBAL
+    warner()                  NEED_warner                  NEED_warner_GLOBAL
+
+To avoid namespace conflicts, you can change the namespace of the
+explicitly exported functions / variables using the C<DPPP_NAMESPACE>
+macro. Just C<#define> the macro before including C<ppport.h>:
+
+    #define DPPP_NAMESPACE MyOwnNamespace_
+    #include "ppport.h"
+
+The default namespace is C<DPPP_>.
+
+=back
+
+The good thing is that most of the above can be checked by running
+F<ppport.h> on your source code. See the next section for
+details.
+
+=head1 EXAMPLES
+
+To verify whether F<ppport.h> is needed for your module, whether you
+should make any changes to your code, and whether any special defines
+should be used, F<ppport.h> can be run as a Perl script to check your
+source code. Simply say:
+
+    perl ppport.h
+
+The result will usually be a list of patches suggesting changes
+that should at least be acceptable, if not necessarily the most
+efficient solution, or a fix for all possible problems.
+
+If you know that your XS module uses features only available in
+newer Perl releases, if you're aware that it uses C++ comments,
+and if you want all suggestions as a single patch file, you could
+use something like this:
+
+    perl ppport.h --compat-version=5.6.0 --cplusplus --patch=test.diff
+
+If you only want your code to be scanned without any suggestions
+for changes, use:
+
+    perl ppport.h --nochanges
+
+You can specify a different C<diff> program or options, using
+the C<--diff> option:
+
+    perl ppport.h --diff='diff -C 10'
+
+This would output context diffs with 10 lines of context.
+
+To display portability information for the C<newSVpvn> function,
+use:
+
+    perl ppport.h --api-info=newSVpvn
+
+Since the argument to C<--api-info> can be a regular expression,
+you can use
+
+    perl ppport.h --api-info=/_nomg$/
+
+to display portability information for all C<_nomg> functions or
+
+    perl ppport.h --api-info=/./
+
+to display information for all known API elements.
+
+=head1 BUGS
+
+If this version of F<ppport.h> is causing failure during
+the compilation of this module, please check if newer versions
+of either this module or C<Devel::PPPort> are available on CPAN
+before sending a bug report.
+
+If F<ppport.h> was generated using the latest version of
+C<Devel::PPPort> and is causing failure of this module, please
+file a bug report using the CPAN Request Tracker at L<http://rt.cpan.org/>.
+
+Please include the following information:
+
+=over 4
+
+=item 1.
+
+The complete output from running "perl -V"
+
+=item 2.
+
+This file.
+
+=item 3.
+
+The name and version of the module you were trying to build.
+
+=item 4.
+
+A full log of the build that failed.
+
+=item 5.
+
+Any other information that you think could be relevant.
+
+=back
+
+For the latest version of this code, please get the C<Devel::PPPort>
+module from CPAN.
+
+=head1 COPYRIGHT
+
+Version 3.x, Copyright (c) 2004-2006, Marcus Holland-Moritz.
+
+Version 2.x, Copyright (C) 2001, Paul Marquess.
+
+Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+See L<Devel::PPPort>.
+
+=cut
+
+use strict;
+
+my $VERSION = 3.10;
+
+my %opt = (
+  quiet     => 0,
+  diag      => 1,
+  hints     => 1,
+  changes   => 1,
+  cplusplus => 0,
+  filter    => 1,
+  strip     => 0,
+  version   => 0,
+);
+
+my($ppport) = $0 =~ /([\w.]+)$/;
+my $LF = '(?:\r\n|[\r\n])';   # line feed
+my $HS = "[ \t]";             # horizontal whitespace
+
+eval {
+  require Getopt::Long;
+  Getopt::Long::GetOptions(\%opt, qw(
+    help quiet diag! filter! hints! changes! cplusplus strip version
+    patch=s copy=s diff=s compat-version=s
+    list-provided list-unsupported api-info=s
+  )) or usage();
+};
+
+if ($@ and grep /^-/, @ARGV) {
+  usage() if "@ARGV" =~ /^--?h(?:elp)?$/;
+  die "Getopt::Long not found. Please don't use any options.\n";
+}
+
+if ($opt{version}) {
+  print "This is $0 $VERSION.\n";
+  exit 0;
+}
+
+usage() if $opt{help};
+strip() if $opt{strip};
+
+if (exists $opt{'compat-version'}) {
+  my($r,$v,$s) = eval { parse_version($opt{'compat-version'}) };
+  if ($@) {
+    die "Invalid version number format: '$opt{'compat-version'}'\n";
+  }
+  die "Only Perl 5 is supported\n" if $r != 5;
+  die "Invalid version number: $opt{'compat-version'}\n" if $v >= 1000 || $s >= 1000;
+  $opt{'compat-version'} = sprintf "%d.%03d%03d", $r, $v, $s;
+}
+else {
+  $opt{'compat-version'} = 5;
+}
+
+# Never use C comments in this file!!!!!
+my $ccs  = '/'.'*';
+my $cce  = '*'.'/';
+my $rccs = quotemeta $ccs;
+my $rcce = quotemeta $cce;
+
+my %API = map { /^(\w+)\|([^|]*)\|([^|]*)\|(\w*)$/
+                ? ( $1 => {
+                      ($2                  ? ( base     => $2 ) : ()),
+                      ($3                  ? ( todo     => $3 ) : ()),
+                      (index($4, 'v') >= 0 ? ( varargs  => 1  ) : ()),
+                      (index($4, 'p') >= 0 ? ( provided => 1  ) : ()),
+                      (index($4, 'n') >= 0 ? ( nothxarg => 1  ) : ()),
+                    } )
+                : die "invalid spec: $_" } qw(
+AvFILLp|5.004050||p
+AvFILL|||
+CLASS|||n
+CX_CURPAD_SAVE|||
+CX_CURPAD_SV|||
+CopFILEAV|5.006000||p
+CopFILEGV_set|5.006000||p
+CopFILEGV|5.006000||p
+CopFILESV|5.006000||p
+CopFILE_set|5.006000||p
+CopFILE|5.006000||p
+CopSTASHPV_set|5.006000||p
+CopSTASHPV|5.006000||p
+CopSTASH_eq|5.006000||p
+CopSTASH_set|5.006000||p
+CopSTASH|5.006000||p
+CopyD|5.009002||p
+Copy|||
+CvPADLIST|||
+CvSTASH|||
+CvWEAKOUTSIDE|||
+DEFSV|5.004050||p
+END_EXTERN_C|5.005000||p
+ENTER|||
+ERRSV|5.004050||p
+EXTEND|||
+EXTERN_C|5.005000||p
+F0convert|||n
+FREETMPS|||
+GIMME_V||5.004000|n
+GIMME|||n
+GROK_NUMERIC_RADIX|5.007002||p
+G_ARRAY|||
+G_DISCARD|||
+G_EVAL|||
+G_NOARGS|||
+G_SCALAR|||
+G_VOID||5.004000|
+GetVars|||
+GvSV|||
+Gv_AMupdate|||
+HEf_SVKEY||5.004000|
+HeHASH||5.004000|
+HeKEY||5.004000|
+HeKLEN||5.004000|
+HePV||5.004000|
+HeSVKEY_force||5.004000|
+HeSVKEY_set||5.004000|
+HeSVKEY||5.004000|
+HeVAL||5.004000|
+HvNAME|||
+INT2PTR|5.006000||p
+IN_LOCALE_COMPILETIME|5.007002||p
+IN_LOCALE_RUNTIME|5.007002||p
+IN_LOCALE|5.007002||p
+IN_PERL_COMPILETIME|5.008001||p
+IS_NUMBER_GREATER_THAN_UV_MAX|5.007002||p
+IS_NUMBER_INFINITY|5.007002||p
+IS_NUMBER_IN_UV|5.007002||p
+IS_NUMBER_NAN|5.007003||p
+IS_NUMBER_NEG|5.007002||p
+IS_NUMBER_NOT_INT|5.007002||p
+IVSIZE|5.006000||p
+IVTYPE|5.006000||p
+IVdf|5.006000||p
+LEAVE|||
+LVRET|||
+MARK|||
+MULTICALL||5.009004|
+MY_CXT_CLONE|5.009002||p
+MY_CXT_INIT|5.007003||p
+MY_CXT|5.007003||p
+MoveD|5.009002||p
+Move|||
+NOOP|5.005000||p
+NUM2PTR|5.006000||p
+NVTYPE|5.006000||p
+NVef|5.006001||p
+NVff|5.006001||p
+NVgf|5.006001||p
+Newxc|5.009003||p
+Newxz|5.009003||p
+Newx|5.009003||p
+Nullav|||
+Nullch|||
+Nullcv|||
+Nullhv|||
+Nullsv|||
+ORIGMARK|||
+PAD_BASE_SV|||
+PAD_CLONE_VARS|||
+PAD_COMPNAME_FLAGS|||
+PAD_COMPNAME_GEN_set|||
+PAD_COMPNAME_GEN|||
+PAD_COMPNAME_OURSTASH|||
+PAD_COMPNAME_PV|||
+PAD_COMPNAME_TYPE|||
+PAD_RESTORE_LOCAL|||
+PAD_SAVE_LOCAL|||
+PAD_SAVE_SETNULLPAD|||
+PAD_SETSV|||
+PAD_SET_CUR_NOSAVE|||
+PAD_SET_CUR|||
+PAD_SVl|||
+PAD_SV|||
+PERL_ABS|5.008001||p
+PERL_BCDVERSION|5.009004||p
+PERL_GCC_BRACE_GROUPS_FORBIDDEN|5.008001||p
+PERL_INT_MAX|5.004000||p
+PERL_INT_MIN|5.004000||p
+PERL_LONG_MAX|5.004000||p
+PERL_LONG_MIN|5.004000||p
+PERL_MAGIC_arylen|5.007002||p
+PERL_MAGIC_backref|5.007002||p
+PERL_MAGIC_bm|5.007002||p
+PERL_MAGIC_collxfrm|5.007002||p
+PERL_MAGIC_dbfile|5.007002||p
+PERL_MAGIC_dbline|5.007002||p
+PERL_MAGIC_defelem|5.007002||p
+PERL_MAGIC_envelem|5.007002||p
+PERL_MAGIC_env|5.007002||p
+PERL_MAGIC_ext|5.007002||p
+PERL_MAGIC_fm|5.007002||p
+PERL_MAGIC_glob|5.007002||p
+PERL_MAGIC_isaelem|5.007002||p
+PERL_MAGIC_isa|5.007002||p
+PERL_MAGIC_mutex|5.007002||p
+PERL_MAGIC_nkeys|5.007002||p
+PERL_MAGIC_overload_elem|5.007002||p
+PERL_MAGIC_overload_table|5.007002||p
+PERL_MAGIC_overload|5.007002||p
+PERL_MAGIC_pos|5.007002||p
+PERL_MAGIC_qr|5.007002||p
+PERL_MAGIC_regdata|5.007002||p
+PERL_MAGIC_regdatum|5.007002||p
+PERL_MAGIC_regex_global|5.007002||p
+PERL_MAGIC_shared_scalar|5.007003||p
+PERL_MAGIC_shared|5.007003||p
+PERL_MAGIC_sigelem|5.007002||p
+PERL_MAGIC_sig|5.007002||p
+PERL_MAGIC_substr|5.007002||p
+PERL_MAGIC_sv|5.007002||p
+PERL_MAGIC_taint|5.007002||p
+PERL_MAGIC_tiedelem|5.007002||p
+PERL_MAGIC_tiedscalar|5.007002||p
+PERL_MAGIC_tied|5.007002||p
+PERL_MAGIC_utf8|5.008001||p
+PERL_MAGIC_uvar_elem|5.007003||p
+PERL_MAGIC_uvar|5.007002||p
+PERL_MAGIC_vec|5.007002||p
+PERL_MAGIC_vstring|5.008001||p
+PERL_QUAD_MAX|5.004000||p
+PERL_QUAD_MIN|5.004000||p
+PERL_REVISION|5.006000||p
+PERL_SCAN_ALLOW_UNDERSCORES|5.007003||p
+PERL_SCAN_DISALLOW_PREFIX|5.007003||p
+PERL_SCAN_GREATER_THAN_UV_MAX|5.007003||p
+PERL_SCAN_SILENT_ILLDIGIT|5.008001||p
+PERL_SHORT_MAX|5.004000||p
+PERL_SHORT_MIN|5.004000||p
+PERL_SIGNALS_UNSAFE_FLAG|5.008001||p
+PERL_SUBVERSION|5.006000||p
+PERL_UCHAR_MAX|5.004000||p
+PERL_UCHAR_MIN|5.004000||p
+PERL_UINT_MAX|5.004000||p
+PERL_UINT_MIN|5.004000||p
+PERL_ULONG_MAX|5.004000||p
+PERL_ULONG_MIN|5.004000||p
+PERL_UNUSED_ARG|5.009003||p
+PERL_UNUSED_CONTEXT|5.009004||p
+PERL_UNUSED_DECL|5.007002||p
+PERL_UNUSED_VAR|5.007002||p
+PERL_UQUAD_MAX|5.004000||p
+PERL_UQUAD_MIN|5.004000||p
+PERL_USE_GCC_BRACE_GROUPS|5.009004||p
+PERL_USHORT_MAX|5.004000||p
+PERL_USHORT_MIN|5.004000||p
+PERL_VERSION|5.006000||p
+PL_DBsingle|||pn
+PL_DBsub|||pn
+PL_DBtrace|||n
+PL_Sv|5.005000||p
+PL_compiling|5.004050||p
+PL_copline|5.005000||p
+PL_curcop|5.004050||p
+PL_curstash|5.004050||p
+PL_debstash|5.004050||p
+PL_defgv|5.004050||p
+PL_diehook|5.004050||p
+PL_dirty|5.004050||p
+PL_dowarn|||pn
+PL_errgv|5.004050||p
+PL_hexdigit|5.005000||p
+PL_hints|5.005000||p
+PL_last_in_gv|||n
+PL_modglobal||5.005000|n
+PL_na|5.004050||pn
+PL_no_modify|5.006000||p
+PL_ofs_sv|||n
+PL_perl_destruct_level|5.004050||p
+PL_perldb|5.004050||p
+PL_ppaddr|5.006000||p
+PL_rsfp_filters|5.004050||p
+PL_rsfp|5.004050||p
+PL_rs|||n
+PL_signals|5.008001||p
+PL_stack_base|5.004050||p
+PL_stack_sp|5.004050||p
+PL_stdingv|5.004050||p
+PL_sv_arenaroot|5.004050||p
+PL_sv_no|5.004050||pn
+PL_sv_undef|5.004050||pn
+PL_sv_yes|5.004050||pn
+PL_tainted|5.004050||p
+PL_tainting|5.004050||p
+POP_MULTICALL||5.009004|
+POPi|||n
+POPl|||n
+POPn|||n
+POPpbytex||5.007001|n
+POPpx||5.005030|n
+POPp|||n
+POPs|||n
+PTR2IV|5.006000||p
+PTR2NV|5.006000||p
+PTR2UV|5.006000||p
+PTR2ul|5.007001||p
+PTRV|5.006000||p
+PUSHMARK|||
+PUSH_MULTICALL||5.009004|
+PUSHi|||
+PUSHmortal|5.009002||p
+PUSHn|||
+PUSHp|||
+PUSHs|||
+PUSHu|5.004000||p
+PUTBACK|||
+PerlIO_clearerr||5.007003|
+PerlIO_close||5.007003|
+PerlIO_context_layers||5.009004|
+PerlIO_eof||5.007003|
+PerlIO_error||5.007003|
+PerlIO_fileno||5.007003|
+PerlIO_fill||5.007003|
+PerlIO_flush||5.007003|
+PerlIO_get_base||5.007003|
+PerlIO_get_bufsiz||5.007003|
+PerlIO_get_cnt||5.007003|
+PerlIO_get_ptr||5.007003|
+PerlIO_read||5.007003|
+PerlIO_seek||5.007003|
+PerlIO_set_cnt||5.007003|
+PerlIO_set_ptrcnt||5.007003|
+PerlIO_setlinebuf||5.007003|
+PerlIO_stderr||5.007003|
+PerlIO_stdin||5.007003|
+PerlIO_stdout||5.007003|
+PerlIO_tell||5.007003|
+PerlIO_unread||5.007003|
+PerlIO_write||5.007003|
+Perl_warner_nocontext|5.006000||p
+Perl_warner|5.006000||p
+PoisonFree|5.009004||p
+PoisonNew|5.009004||p
+PoisonWith|5.009004||p
+Poison|5.008000||p
+RETVAL|||n
+Renewc|||
+Renew|||
+SAVECLEARSV|||
+SAVECOMPPAD|||
+SAVEPADSV|||
+SAVETMPS|||
+SAVE_DEFSV|5.004050||p
+SPAGAIN|||
+SP|||
+START_EXTERN_C|5.005000||p
+START_MY_CXT|5.007003||p
+STMT_END|||p
+STMT_START|||p
+STR_WITH_LEN|5.009003||p
+ST|||
+SVf|5.006000||p
+SVt_IV|||
+SVt_NV|||
+SVt_PVAV|||
+SVt_PVCV|||
+SVt_PVHV|||
+SVt_PVMG|||
+SVt_PV|||
+Safefree|||
+Slab_Alloc|||
+Slab_Free|||
+StructCopy|||
+SvCUR_set|||
+SvCUR|||
+SvEND|||
+SvGAMAGIC||5.006001|
+SvGETMAGIC|5.004050||p
+SvGROW|||
+SvIOK_UV||5.006000|
+SvIOK_notUV||5.006000|
+SvIOK_off|||
+SvIOK_only_UV||5.006000|
+SvIOK_only|||
+SvIOK_on|||
+SvIOKp|||
+SvIOK|||
+SvIVX|||
+SvIV_nomg|5.009001||p
+SvIV_set|||
+SvIVx|||
+SvIV|||
+SvIsCOW_shared_hash||5.008003|
+SvIsCOW||5.008003|
+SvLEN_set|||
+SvLEN|||
+SvLOCK||5.007003|
+SvMAGIC_set|5.009003||p
+SvNIOK_off|||
+SvNIOKp|||
+SvNIOK|||
+SvNOK_off|||
+SvNOK_only|||
+SvNOK_on|||
+SvNOKp|||
+SvNOK|||
+SvNVX|||
+SvNV_set|||
+SvNVx|||
+SvNV|||
+SvOK|||
+SvOOK|||
+SvPOK_off|||
+SvPOK_only_UTF8||5.006000|
+SvPOK_only|||
+SvPOK_on|||
+SvPOKp|||
+SvPOK|||
+SvPVX_const|5.009003||p
+SvPVX_mutable|5.009003||p
+SvPVX|||
+SvPV_force_nomg|5.007002||p
+SvPV_force|||
+SvPV_nolen|5.006000||p
+SvPV_nomg|5.007002||p
+SvPV_set|||
+SvPVbyte_force||5.009002|
+SvPVbyte_nolen||5.006000|
+SvPVbytex_force||5.006000|
+SvPVbytex||5.006000|
+SvPVbyte|5.006000||p
+SvPVutf8_force||5.006000|
+SvPVutf8_nolen||5.006000|
+SvPVutf8x_force||5.006000|
+SvPVutf8x||5.006000|
+SvPVutf8||5.006000|
+SvPVx|||
+SvPV|||
+SvREFCNT_dec|||
+SvREFCNT_inc_NN|5.009004||p
+SvREFCNT_inc_simple_NN|5.009004||p
+SvREFCNT_inc_simple_void_NN|5.009004||p
+SvREFCNT_inc_simple_void|5.009004||p
+SvREFCNT_inc_simple|5.009004||p
+SvREFCNT_inc_void_NN|5.009004||p
+SvREFCNT_inc_void|5.009004||p
+SvREFCNT_inc|||p
+SvREFCNT|||
+SvROK_off|||
+SvROK_on|||
+SvROK|||
+SvRV_set|5.009003||p
+SvRV|||
+SvSETMAGIC|||
+SvSHARE||5.007003|
+SvSTASH_set|5.009003||p
+SvSTASH|||
+SvSetMagicSV_nosteal||5.004000|
+SvSetMagicSV||5.004000|
+SvSetSV_nosteal||5.004000|
+SvSetSV|||
+SvTAINTED_off||5.004000|
+SvTAINTED_on||5.004000|
+SvTAINTED||5.004000|
+SvTAINT|||
+SvTRUE|||
+SvTYPE|||
+SvUNLOCK||5.007003|
+SvUOK||5.007001|
+SvUPGRADE|||
+SvUTF8_off||5.006000|
+SvUTF8_on||5.006000|
+SvUTF8||5.006000|
+SvUVXx|5.004000||p
+SvUVX|5.004000||p
+SvUV_nomg|5.009001||p
+SvUV_set|5.009003||p
+SvUVx|5.004000||p
+SvUV|5.004000||p
+SvVOK||5.008001|
+SvVSTRING_mg|5.009004||p
+THIS|||n
+UNDERBAR|5.009002||p
+UVSIZE|5.006000||p
+UVTYPE|5.006000||p
+UVXf|5.007001||p
+UVof|5.006000||p
+UVuf|5.006000||p
+UVxf|5.006000||p
+WARN_ALL|5.006000||p
+WARN_AMBIGUOUS|5.006000||p
+WARN_ASSERTIONS|5.009000||p
+WARN_BAREWORD|5.006000||p
+WARN_CLOSED|5.006000||p
+WARN_CLOSURE|5.006000||p
+WARN_DEBUGGING|5.006000||p
+WARN_DEPRECATED|5.006000||p
+WARN_DIGIT|5.006000||p
+WARN_EXEC|5.006000||p
+WARN_EXITING|5.006000||p
+WARN_GLOB|5.006000||p
+WARN_INPLACE|5.006000||p
+WARN_INTERNAL|5.006000||p
+WARN_IO|5.006000||p
+WARN_LAYER|5.008000||p
+WARN_MALLOC|5.006000||p
+WARN_MISC|5.006000||p
+WARN_NEWLINE|5.006000||p
+WARN_NUMERIC|5.006000||p
+WARN_ONCE|5.006000||p
+WARN_OVERFLOW|5.006000||p
+WARN_PACK|5.006000||p
+WARN_PARENTHESIS|5.006000||p
+WARN_PIPE|5.006000||p
+WARN_PORTABLE|5.006000||p
+WARN_PRECEDENCE|5.006000||p
+WARN_PRINTF|5.006000||p
+WARN_PROTOTYPE|5.006000||p
+WARN_QW|5.006000||p
+WARN_RECURSION|5.006000||p
+WARN_REDEFINE|5.006000||p
+WARN_REGEXP|5.006000||p
+WARN_RESERVED|5.006000||p
+WARN_SEMICOLON|5.006000||p
+WARN_SEVERE|5.006000||p
+WARN_SIGNAL|5.006000||p
+WARN_SUBSTR|5.006000||p
+WARN_SYNTAX|5.006000||p
+WARN_TAINT|5.006000||p
+WARN_THREADS|5.008000||p
+WARN_UNINITIALIZED|5.006000||p
+WARN_UNOPENED|5.006000||p
+WARN_UNPACK|5.006000||p
+WARN_UNTIE|5.006000||p
+WARN_UTF8|5.006000||p
+WARN_VOID|5.006000||p
+XCPT_CATCH|5.009002||p
+XCPT_RETHROW|5.009002||p
+XCPT_TRY_END|5.009002||p
+XCPT_TRY_START|5.009002||p
+XPUSHi|||
+XPUSHmortal|5.009002||p
+XPUSHn|||
+XPUSHp|||
+XPUSHs|||
+XPUSHu|5.004000||p
+XSRETURN_EMPTY|||
+XSRETURN_IV|||
+XSRETURN_NO|||
+XSRETURN_NV|||
+XSRETURN_PV|||
+XSRETURN_UNDEF|||
+XSRETURN_UV|5.008001||p
+XSRETURN_YES|||
+XSRETURN|||p
+XST_mIV|||
+XST_mNO|||
+XST_mNV|||
+XST_mPV|||
+XST_mUNDEF|||
+XST_mUV|5.008001||p
+XST_mYES|||
+XS_VERSION_BOOTCHECK|||
+XS_VERSION|||
+XSprePUSH|5.006000||p
+XS|||
+ZeroD|5.009002||p
+Zero|||
+_aMY_CXT|5.007003||p
+_pMY_CXT|5.007003||p
+aMY_CXT_|5.007003||p
+aMY_CXT|5.007003||p
+aTHX_|5.006000||p
+aTHX|5.006000||p
+add_data|||n
+addmad|||
+allocmy|||
+amagic_call|||
+amagic_cmp_locale|||
+amagic_cmp|||
+amagic_i_ncmp|||
+amagic_ncmp|||
+any_dup|||
+ao|||
+append_elem|||
+append_list|||
+append_madprops|||
+apply_attrs_my|||
+apply_attrs_string||5.006001|
+apply_attrs|||
+apply|||
+atfork_lock||5.007003|n
+atfork_unlock||5.007003|n
+av_arylen_p||5.009003|
+av_clear|||
+av_delete||5.006000|
+av_exists||5.006000|
+av_extend|||
+av_fake|||
+av_fetch|||
+av_fill|||
+av_len|||
+av_make|||
+av_pop|||
+av_push|||
+av_reify|||
+av_shift|||
+av_store|||
+av_undef|||
+av_unshift|||
+ax|||n
+bad_type|||
+bind_match|||
+block_end|||
+block_gimme||5.004000|
+block_start|||
+boolSV|5.004000||p
+boot_core_PerlIO|||
+boot_core_UNIVERSAL|||
+boot_core_xsutils|||
+bytes_from_utf8||5.007001|
+bytes_to_uni|||n
+bytes_to_utf8||5.006001|
+call_argv|5.006000||p
+call_atexit||5.006000|
+call_list||5.004000|
+call_method|5.006000||p
+call_pv|5.006000||p
+call_sv|5.006000||p
+calloc||5.007002|n
+cando|||
+cast_i32||5.006000|
+cast_iv||5.006000|
+cast_ulong||5.006000|
+cast_uv||5.006000|
+check_type_and_open|||
+check_uni|||
+checkcomma|||
+checkposixcc|||
+ckWARN|5.006000||p
+ck_anoncode|||
+ck_bitop|||
+ck_concat|||
+ck_defined|||
+ck_delete|||
+ck_die|||
+ck_eof|||
+ck_eval|||
+ck_exec|||
+ck_exists|||
+ck_exit|||
+ck_ftst|||
+ck_fun|||
+ck_glob|||
+ck_grep|||
+ck_index|||
+ck_join|||
+ck_lengthconst|||
+ck_lfun|||
+ck_listiob|||
+ck_match|||
+ck_method|||
+ck_null|||
+ck_open|||
+ck_repeat|||
+ck_require|||
+ck_retarget|||
+ck_return|||
+ck_rfun|||
+ck_rvconst|||
+ck_sassign|||
+ck_say|||
+ck_select|||
+ck_shift|||
+ck_sort|||
+ck_spair|||
+ck_split|||
+ck_subr|||
+ck_substr|||
+ck_svconst|||
+ck_trunc|||
+ck_unpack|||
+ckwarn_d||5.009003|
+ckwarn||5.009003|
+cl_and|||n
+cl_anything|||n
+cl_init_zero|||n
+cl_init|||n
+cl_is_anything|||n
+cl_or|||n
+clear_placeholders|||
+closest_cop|||
+convert|||
+cop_free|||
+cr_textfilter|||
+create_eval_scope|||
+croak_nocontext|||vn
+croak|||v
+csighandler||5.009003|n
+curmad|||
+custom_op_desc||5.007003|
+custom_op_name||5.007003|
+cv_ckproto_len|||
+cv_ckproto|||
+cv_clone|||
+cv_const_sv||5.004000|
+cv_dump|||
+cv_undef|||
+cx_dump||5.005000|
+cx_dup|||
+cxinc|||
+dAXMARK|5.009003||p
+dAX|5.007002||p
+dITEMS|5.007002||p
+dMARK|||
+dMULTICALL||5.009003|
+dMY_CXT_SV|5.007003||p
+dMY_CXT|5.007003||p
+dNOOP|5.006000||p
+dORIGMARK|||
+dSP|||
+dTHR|5.004050||p
+dTHXa|5.006000||p
+dTHXoa|5.006000||p
+dTHX|5.006000||p
+dUNDERBAR|5.009002||p
+dVAR|5.009003||p
+dXCPT|5.009002||p
+dXSARGS|||
+dXSI32|||
+dXSTARG|5.006000||p
+deb_curcv|||
+deb_nocontext|||vn
+deb_stack_all|||
+deb_stack_n|||
+debop||5.005000|
+debprofdump||5.005000|
+debprof|||
+debstackptrs||5.007003|
+debstack||5.007003|
+debug_start_match|||
+deb||5.007003|v
+del_sv|||
+delete_eval_scope|||
+delimcpy||5.004000|
+deprecate_old|||
+deprecate|||
+despatch_signals||5.007001|
+destroy_matcher|||
+die_nocontext|||vn
+die_where|||
+die|||v
+dirp_dup|||
+div128|||
+djSP|||
+do_aexec5|||
+do_aexec|||
+do_aspawn|||
+do_binmode||5.004050|
+do_chomp|||
+do_chop|||
+do_close|||
+do_dump_pad|||
+do_eof|||
+do_exec3|||
+do_execfree|||
+do_exec|||
+do_gv_dump||5.006000|
+do_gvgv_dump||5.006000|
+do_hv_dump||5.006000|
+do_ipcctl|||
+do_ipcget|||
+do_join|||
+do_kv|||
+do_magic_dump||5.006000|
+do_msgrcv|||
+do_msgsnd|||
+do_oddball|||
+do_op_dump||5.006000|
+do_op_xmldump|||
+do_open9||5.006000|
+do_openn||5.007001|
+do_open||5.004000|
+do_pipe|||
+do_pmop_dump||5.006000|
+do_pmop_xmldump|||
+do_print|||
+do_readline|||
+do_seek|||
+do_semop|||
+do_shmio|||
+do_smartmatch|||
+do_spawn_nowait|||
+do_spawn|||
+do_sprintf|||
+do_sv_dump||5.006000|
+do_sysseek|||
+do_tell|||
+do_trans_complex_utf8|||
+do_trans_complex|||
+do_trans_count_utf8|||
+do_trans_count|||
+do_trans_simple_utf8|||
+do_trans_simple|||
+do_trans|||
+do_vecget|||
+do_vecset|||
+do_vop|||
+docatch_body|||
+docatch|||
+doeval|||
+dofile|||
+dofindlabel|||
+doform|||
+doing_taint||5.008001|n
+dooneliner|||
+doopen_pm|||
+doparseform|||
+dopoptoeval|||
+dopoptogiven|||
+dopoptolabel|||
+dopoptoloop|||
+dopoptosub_at|||
+dopoptosub|||
+dopoptowhen|||
+doref||5.009003|
+dounwind|||
+dowantarray|||
+dump_all||5.006000|
+dump_eval||5.006000|
+dump_exec_pos|||
+dump_fds|||
+dump_form||5.006000|
+dump_indent||5.006000|v
+dump_mstats|||
+dump_packsubs||5.006000|
+dump_sub||5.006000|
+dump_sv_child|||
+dump_trie_interim_list|||
+dump_trie_interim_table|||
+dump_trie|||
+dump_vindent||5.006000|
+dumpuntil|||
+dup_attrlist|||
+emulate_eaccess|||
+eval_pv|5.006000||p
+eval_sv|5.006000||p
+exec_failed|||
+expect_number|||
+fbm_compile||5.005000|
+fbm_instr||5.005000|
+fd_on_nosuid_fs|||
+feature_is_enabled|||
+filter_add|||
+filter_del|||
+filter_gets|||
+filter_read|||
+find_array_subscript|||
+find_beginning|||
+find_byclass|||
+find_hash_subscript|||
+find_in_my_stash|||
+find_runcv|||
+find_rundefsvoffset||5.009002|
+find_script|||
+find_uninit_var|||
+first_symbol|||n
+fold_constants|||
+forbid_setid|||
+force_ident|||
+force_list|||
+force_next|||
+force_version|||
+force_word|||
+form_nocontext|||vn
+form||5.004000|v
+fp_dup|||
+fprintf_nocontext|||vn
+free_global_struct|||
+free_tied_hv_pool|||
+free_tmps|||
+gen_constant_list|||
+get_arena|||
+get_av|5.006000||p
+get_context||5.006000|n
+get_cv|5.006000||p
+get_db_sub|||
+get_debug_opts|||
+get_hash_seed|||
+get_hv|5.006000||p
+get_mstats|||
+get_no_modify|||
+get_num|||
+get_op_descs||5.005000|
+get_op_names||5.005000|
+get_opargs|||
+get_ppaddr||5.006000|
+get_sv|5.006000||p
+get_vtbl||5.005030|
+getcwd_sv||5.007002|
+getenv_len|||
+glob_2number|||
+glob_2pv|||
+glob_assign_glob|||
+glob_assign_ref|||
+gp_dup|||
+gp_free|||
+gp_ref|||
+grok_bin|5.007003||p
+grok_hex|5.007003||p
+grok_number|5.007002||p
+grok_numeric_radix|5.007002||p
+grok_oct|5.007003||p
+group_end|||
+gv_AVadd|||
+gv_HVadd|||
+gv_IOadd|||
+gv_SVadd|||
+gv_autoload4||5.004000|
+gv_check|||
+gv_const_sv||5.009003|
+gv_dump||5.006000|
+gv_efullname3||5.004000|
+gv_efullname4||5.006001|
+gv_efullname|||
+gv_ename|||
+gv_fetchfile|||
+gv_fetchmeth_autoload||5.007003|
+gv_fetchmethod_autoload||5.004000|
+gv_fetchmethod|||
+gv_fetchmeth|||
+gv_fetchpvn_flags||5.009002|
+gv_fetchpv|||
+gv_fetchsv||5.009002|
+gv_fullname3||5.004000|
+gv_fullname4||5.006001|
+gv_fullname|||
+gv_handler||5.007001|
+gv_init_sv|||
+gv_init|||
+gv_name_set||5.009004|
+gv_stashpvn|5.004000||p
+gv_stashpvs||5.009003|
+gv_stashpv|||
+gv_stashsv|||
+he_dup|||
+hek_dup|||
+hfreeentries|||
+hsplit|||
+hv_assert||5.009001|
+hv_auxinit|||n
+hv_backreferences_p|||
+hv_clear_placeholders||5.009001|
+hv_clear|||
+hv_copy_hints_hv|||
+hv_delayfree_ent||5.004000|
+hv_delete_common|||
+hv_delete_ent||5.004000|
+hv_delete|||
+hv_eiter_p||5.009003|
+hv_eiter_set||5.009003|
+hv_exists_ent||5.004000|
+hv_exists|||
+hv_fetch_common|||
+hv_fetch_ent||5.004000|
+hv_fetchs|5.009003||p
+hv_fetch|||
+hv_free_ent||5.004000|
+hv_iterinit|||
+hv_iterkeysv||5.004000|
+hv_iterkey|||
+hv_iternext_flags||5.008000|
+hv_iternextsv|||
+hv_iternext|||
+hv_iterval|||
+hv_kill_backrefs|||
+hv_ksplit||5.004000|
+hv_magic_check|||n
+hv_magic_uvar_xkey|||
+hv_magic|||
+hv_name_set||5.009003|
+hv_notallowed|||
+hv_placeholders_get||5.009003|
+hv_placeholders_p||5.009003|
+hv_placeholders_set||5.009003|
+hv_riter_p||5.009003|
+hv_riter_set||5.009003|
+hv_scalar||5.009001|
+hv_store_ent||5.004000|
+hv_store_flags||5.008000|
+hv_stores|5.009004||p
+hv_store|||
+hv_undef|||
+ibcmp_locale||5.004000|
+ibcmp_utf8||5.007003|
+ibcmp|||
+incl_perldb|||
+incline|||
+incpush_if_exists|||
+incpush|||
+ingroup|||
+init_argv_symbols|||
+init_debugger|||
+init_global_struct|||
+init_i18nl10n||5.006000|
+init_i18nl14n||5.006000|
+init_ids|||
+init_interp|||
+init_lexer|||
+init_main_stash|||
+init_perllib|||
+init_postdump_symbols|||
+init_predump_symbols|||
+init_stacks||5.005000|
+init_tm||5.007002|
+instr|||
+intro_my|||
+intuit_method|||
+intuit_more|||
+invert|||
+io_close|||
+isALNUM|||
+isALPHA|||
+isDIGIT|||
+isLOWER|||
+isSPACE|||
+isUPPER|||
+is_an_int|||
+is_gv_magical_sv|||
+is_gv_magical|||
+is_handle_constructor|||n
+is_list_assignment|||
+is_lvalue_sub||5.007001|
+is_uni_alnum_lc||5.006000|
+is_uni_alnumc_lc||5.006000|
+is_uni_alnumc||5.006000|
+is_uni_alnum||5.006000|
+is_uni_alpha_lc||5.006000|
+is_uni_alpha||5.006000|
+is_uni_ascii_lc||5.006000|
+is_uni_ascii||5.006000|
+is_uni_cntrl_lc||5.006000|
+is_uni_cntrl||5.006000|
+is_uni_digit_lc||5.006000|
+is_uni_digit||5.006000|
+is_uni_graph_lc||5.006000|
+is_uni_graph||5.006000|
+is_uni_idfirst_lc||5.006000|
+is_uni_idfirst||5.006000|
+is_uni_lower_lc||5.006000|
+is_uni_lower||5.006000|
+is_uni_print_lc||5.006000|
+is_uni_print||5.006000|
+is_uni_punct_lc||5.006000|
+is_uni_punct||5.006000|
+is_uni_space_lc||5.006000|
+is_uni_space||5.006000|
+is_uni_upper_lc||5.006000|
+is_uni_upper||5.006000|
+is_uni_xdigit_lc||5.006000|
+is_uni_xdigit||5.006000|
+is_utf8_alnumc||5.006000|
+is_utf8_alnum||5.006000|
+is_utf8_alpha||5.006000|
+is_utf8_ascii||5.006000|
+is_utf8_char_slow|||n
+is_utf8_char||5.006000|
+is_utf8_cntrl||5.006000|
+is_utf8_common|||
+is_utf8_digit||5.006000|
+is_utf8_graph||5.006000|
+is_utf8_idcont||5.008000|
+is_utf8_idfirst||5.006000|
+is_utf8_lower||5.006000|
+is_utf8_mark||5.006000|
+is_utf8_print||5.006000|
+is_utf8_punct||5.006000|
+is_utf8_space||5.006000|
+is_utf8_string_loclen||5.009003|
+is_utf8_string_loc||5.008001|
+is_utf8_string||5.006001|
+is_utf8_upper||5.006000|
+is_utf8_xdigit||5.006000|
+isa_lookup|||
+items|||n
+ix|||n
+jmaybe|||
+join_exact|||
+keyword|||
+leave_scope|||
+lex_end|||
+lex_start|||
+linklist|||
+listkids|||
+list|||
+load_module_nocontext|||vn
+load_module||5.006000|v
+localize|||
+looks_like_bool|||
+looks_like_number|||
+lop|||
+mPUSHi|5.009002||p
+mPUSHn|5.009002||p
+mPUSHp|5.009002||p
+mPUSHu|5.009002||p
+mXPUSHi|5.009002||p
+mXPUSHn|5.009002||p
+mXPUSHp|5.009002||p
+mXPUSHu|5.009002||p
+mad_free|||
+madlex|||
+madparse|||
+magic_clear_all_env|||
+magic_clearenv|||
+magic_clearhint|||
+magic_clearpack|||
+magic_clearsig|||
+magic_dump||5.006000|
+magic_existspack|||
+magic_freearylen_p|||
+magic_freeovrld|||
+magic_freeregexp|||
+magic_getarylen|||
+magic_getdefelem|||
+magic_getnkeys|||
+magic_getpack|||
+magic_getpos|||
+magic_getsig|||
+magic_getsubstr|||
+magic_gettaint|||
+magic_getuvar|||
+magic_getvec|||
+magic_get|||
+magic_killbackrefs|||
+magic_len|||
+magic_methcall|||
+magic_methpack|||
+magic_nextpack|||
+magic_regdata_cnt|||
+magic_regdatum_get|||
+magic_regdatum_set|||
+magic_scalarpack|||
+magic_set_all_env|||
+magic_setamagic|||
+magic_setarylen|||
+magic_setbm|||
+magic_setcollxfrm|||
+magic_setdbline|||
+magic_setdefelem|||
+magic_setenv|||
+magic_setfm|||
+magic_setglob|||
+magic_sethint|||
+magic_setisa|||
+magic_setmglob|||
+magic_setnkeys|||
+magic_setpack|||
+magic_setpos|||
+magic_setregexp|||
+magic_setsig|||
+magic_setsubstr|||
+magic_settaint|||
+magic_setutf8|||
+magic_setuvar|||
+magic_setvec|||
+magic_set|||
+magic_sizepack|||
+magic_wipepack|||
+magicname|||
+make_matcher|||
+make_trie_failtable|||
+make_trie|||
+malloced_size|||n
+malloc||5.007002|n
+markstack_grow|||
+matcher_matches_sv|||
+measure_struct|||
+memEQ|5.004000||p
+memNE|5.004000||p
+mem_collxfrm|||
+mess_alloc|||
+mess_nocontext|||vn
+mess||5.006000|v
+method_common|||
+mfree||5.007002|n
+mg_clear|||
+mg_copy|||
+mg_dup|||
+mg_find|||
+mg_free|||
+mg_get|||
+mg_length||5.005000|
+mg_localize|||
+mg_magical|||
+mg_set|||
+mg_size||5.005000|
+mini_mktime||5.007002|
+missingterm|||
+mode_from_discipline|||
+modkids|||
+mod|||
+more_bodies|||
+more_sv|||
+moreswitches|||
+mul128|||
+mulexp10|||n
+my_atof2||5.007002|
+my_atof||5.006000|
+my_attrs|||
+my_bcopy|||n
+my_betoh16|||n
+my_betoh32|||n
+my_betoh64|||n
+my_betohi|||n
+my_betohl|||n
+my_betohs|||n
+my_bzero|||n
+my_chsize|||
+my_clearenv|||
+my_cxt_init|||
+my_exit_jump|||
+my_exit|||
+my_failure_exit||5.004000|
+my_fflush_all||5.006000|
+my_fork||5.007003|n
+my_htobe16|||n
+my_htobe32|||n
+my_htobe64|||n
+my_htobei|||n
+my_htobel|||n
+my_htobes|||n
+my_htole16|||n
+my_htole32|||n
+my_htole64|||n
+my_htolei|||n
+my_htolel|||n
+my_htoles|||n
+my_htonl|||
+my_kid|||
+my_letoh16|||n
+my_letoh32|||n
+my_letoh64|||n
+my_letohi|||n
+my_letohl|||n
+my_letohs|||n
+my_lstat|||
+my_memcmp||5.004000|n
+my_memset|||n
+my_ntohl|||
+my_pclose||5.004000|
+my_popen_list||5.007001|
+my_popen||5.004000|
+my_setenv|||
+my_snprintf|5.009004||pvn
+my_socketpair||5.007003|n
+my_sprintf||5.009003|vn
+my_stat|||
+my_strftime||5.007002|
+my_strlcat|5.009004||pn
+my_strlcpy|5.009004||pn
+my_swabn|||n
+my_swap|||
+my_unexec|||
+my_vsnprintf||5.009004|n
+my|||
+need_utf8|||n
+newANONATTRSUB||5.006000|
+newANONHASH|||
+newANONLIST|||
+newANONSUB|||
+newASSIGNOP|||
+newATTRSUB||5.006000|
+newAVREF|||
+newAV|||
+newBINOP|||
+newCONDOP|||
+newCONSTSUB|5.004050||p
+newCVREF|||
+newDEFSVOP|||
+newFORM|||
+newFOROP|||
+newGIVENOP||5.009003|
+newGIVWHENOP|||
+newGP|||
+newGVOP|||
+newGVREF|||
+newGVgen|||
+newHVREF|||
+newHVhv||5.005000|
+newHV|||
+newIO|||
+newLISTOP|||
+newLOGOP|||
+newLOOPEX|||
+newLOOPOP|||
+newMADPROP|||
+newMADsv|||
+newMYSUB|||
+newNULLLIST|||
+newOP|||
+newPADOP||5.006000|
+newPMOP|||
+newPROG|||
+newPVOP|||
+newRANGE|||
+newRV_inc|5.004000||p
+newRV_noinc|5.004000||p
+newRV|||
+newSLICEOP|||
+newSTATEOP|||
+newSUB|||
+newSVOP|||
+newSVREF|||
+newSVhek||5.009003|
+newSViv|||
+newSVnv|||
+newSVpvf_nocontext|||vn
+newSVpvf||5.004000|v
+newSVpvn_share||5.007001|
+newSVpvn|5.004050||p
+newSVpvs_share||5.009003|
+newSVpvs|5.009003||p
+newSVpv|||
+newSVrv|||
+newSVsv|||
+newSVuv|5.006000||p
+newSV|||
+newTOKEN|||
+newUNOP|||
+newWHENOP||5.009003|
+newWHILEOP||5.009003|
+newXS_flags||5.009004|
+newXSproto||5.006000|
+newXS||5.006000|
+new_collate||5.006000|
+new_constant|||
+new_ctype||5.006000|
+new_he|||
+new_logop|||
+new_numeric||5.006000|
+new_stackinfo||5.005000|
+new_version||5.009000|
+new_warnings_bitfield|||
+next_symbol|||
+nextargv|||
+nextchar|||
+ninstr|||
+no_bareword_allowed|||
+no_fh_allowed|||
+no_op|||
+not_a_number|||
+nothreadhook||5.008000|
+nuke_stacks|||
+num_overflow|||n
+offer_nice_chunk|||
+oopsAV|||
+oopsCV|||
+oopsHV|||
+op_clear|||
+op_const_sv|||
+op_dump||5.006000|
+op_free|||
+op_getmad_weak|||
+op_getmad|||
+op_null||5.007002|
+op_refcnt_lock||5.009002|
+op_refcnt_unlock||5.009002|
+op_xmldump|||
+open_script|||
+pMY_CXT_|5.007003||p
+pMY_CXT|5.007003||p
+pTHX_|5.006000||p
+pTHX|5.006000||p
+packWARN|5.007003||p
+pack_cat||5.007003|
+pack_rec|||
+package|||
+packlist||5.008001|
+pad_add_anon|||
+pad_add_name|||
+pad_alloc|||
+pad_block_start|||
+pad_check_dup|||
+pad_compname_type|||
+pad_findlex|||
+pad_findmy|||
+pad_fixup_inner_anons|||
+pad_free|||
+pad_leavemy|||
+pad_new|||
+pad_peg|||n
+pad_push|||
+pad_reset|||
+pad_setsv|||
+pad_sv||5.009004|
+pad_swipe|||
+pad_tidy|||
+pad_undef|||
+parse_body|||
+parse_unicode_opts|||
+path_is_absolute|||n
+peep|||
+pending_ident|||
+perl_alloc_using|||n
+perl_alloc|||n
+perl_clone_using|||n
+perl_clone|||n
+perl_construct|||n
+perl_destruct||5.007003|n
+perl_free|||n
+perl_parse||5.006000|n
+perl_run|||n
+pidgone|||
+pm_description|||
+pmflag|||
+pmop_dump||5.006000|
+pmop_xmldump|||
+pmruntime|||
+pmtrans|||
+pop_scope|||
+pregcomp|||
+pregexec|||
+pregfree|||
+prepend_elem|||
+prepend_madprops|||
+printbuf|||
+printf_nocontext|||vn
+ptr_table_clear|||
+ptr_table_fetch|||
+ptr_table_find|||n
+ptr_table_free|||
+ptr_table_new|||
+ptr_table_split|||
+ptr_table_store|||
+push_scope|||
+put_byte|||
+pv_display||5.006000|
+pv_escape||5.009004|
+pv_pretty||5.009004|
+pv_uni_display||5.007003|
+qerror|||
+qsortsvu|||
+re_croak2|||
+re_dup|||
+re_intuit_start||5.006000|
+re_intuit_string||5.006000|
+realloc||5.007002|n
+reentrant_free|||
+reentrant_init|||
+reentrant_retry|||vn
+reentrant_size|||
+ref_array_or_hash|||
+refcounted_he_chain_2hv|||
+refcounted_he_fetch|||
+refcounted_he_free|||
+refcounted_he_new|||
+refcounted_he_value|||
+refkids|||
+refto|||
+ref||5.009003|
+reg_node|||
+reganode|||
+regatom|||
+regbranch|||
+regclass_swash||5.009004|
+regclass|||
+regcppop|||
+regcppush|||
+regcurly|||n
+regdump||5.005000|
+regexec_flags||5.005000|
+reghop3|||n
+reghopmaybe3|||n
+reginclass|||
+reginitcolors||5.006000|
+reginsert|||
+regmatch|||
+regnext||5.005000|
+regpiece|||
+regpposixcc|||
+regprop|||
+regrepeat|||
+regtail_study|||
+regtail|||
+regtry|||
+reguni|||
+regwhite|||n
+reg|||
+repeatcpy|||
+report_evil_fh|||
+report_uninit|||
+require_errno|||
+require_pv||5.006000|
+restore_magic|||
+rninstr|||
+rsignal_restore|||
+rsignal_save|||
+rsignal_state||5.004000|
+rsignal||5.004000|
+run_body|||
+run_user_filter|||
+runops_debug||5.005000|
+runops_standard||5.005000|
+rvpv_dup|||
+rxres_free|||
+rxres_restore|||
+rxres_save|||
+safesyscalloc||5.006000|n
+safesysfree||5.006000|n
+safesysmalloc||5.006000|n
+safesysrealloc||5.006000|n
+same_dirent|||
+save_I16||5.004000|
+save_I32|||
+save_I8||5.006000|
+save_aelem||5.004050|
+save_alloc||5.006000|
+save_aptr|||
+save_ary|||
+save_bool||5.008001|
+save_clearsv|||
+save_delete|||
+save_destructor_x||5.006000|
+save_destructor||5.006000|
+save_freeop|||
+save_freepv|||
+save_freesv|||
+save_generic_pvref||5.006001|
+save_generic_svref||5.005030|
+save_gp||5.004000|
+save_hash|||
+save_hek_flags|||n
+save_helem||5.004050|
+save_hints||5.005000|
+save_hptr|||
+save_int|||
+save_item|||
+save_iv||5.005000|
+save_lines|||
+save_list|||
+save_long|||
+save_magic|||
+save_mortalizesv||5.007001|
+save_nogv|||
+save_op|||
+save_padsv||5.007001|
+save_pptr|||
+save_re_context||5.006000|
+save_scalar_at|||
+save_scalar|||
+save_set_svflags||5.009000|
+save_shared_pvref||5.007003|
+save_sptr|||
+save_svref|||
+save_vptr||5.006000|
+savepvn|||
+savepvs||5.009003|
+savepv|||
+savesharedpv||5.007003|
+savestack_grow_cnt||5.008001|
+savestack_grow|||
+savesvpv||5.009002|
+sawparens|||
+scalar_mod_type|||n
+scalarboolean|||
+scalarkids|||
+scalarseq|||
+scalarvoid|||
+scalar|||
+scan_bin||5.006000|
+scan_commit|||
+scan_const|||
+scan_formline|||
+scan_heredoc|||
+scan_hex|||
+scan_ident|||
+scan_inputsymbol|||
+scan_num||5.007001|
+scan_oct|||
+scan_pat|||
+scan_str|||
+scan_subst|||
+scan_trans|||
+scan_version||5.009001|
+scan_vstring||5.008001|
+scan_word|||
+scope|||
+screaminstr||5.005000|
+seed||5.008001|
+sequence_num|||
+sequence_tail|||
+sequence|||
+set_context||5.006000|n
+set_csh|||
+set_numeric_local||5.006000|
+set_numeric_radix||5.006000|
+set_numeric_standard||5.006000|
+setdefout|||
+setenv_getix|||
+share_hek_flags|||
+share_hek||5.004000|
+si_dup|||
+sighandler|||n
+simplify_sort|||
+skipspace0|||
+skipspace1|||
+skipspace2|||
+skipspace|||
+sortcv_stacked|||
+sortcv_xsub|||
+sortcv|||
+sortsv_flags||5.009003|
+sortsv||5.007003|
+space_join_names_mortal|||
+ss_dup|||
+stack_grow|||
+start_force|||
+start_glob|||
+start_subparse||5.004000|
+stashpv_hvname_match||5.009004|
+stdize_locale|||
+strEQ|||
+strGE|||
+strGT|||
+strLE|||
+strLT|||
+strNE|||
+str_to_version||5.006000|
+stringify_regexp|||
+strip_return|||
+strnEQ|||
+strnNE|||
+study_chunk|||
+sub_crush_depth|||
+sublex_done|||
+sublex_push|||
+sublex_start|||
+sv_2bool|||
+sv_2cv|||
+sv_2io|||
+sv_2iuv_common|||
+sv_2iuv_non_preserve|||
+sv_2iv_flags||5.009001|
+sv_2iv|||
+sv_2mortal|||
+sv_2nv|||
+sv_2pv_flags||5.007002|
+sv_2pv_nolen|5.006000||p
+sv_2pvbyte_nolen|||
+sv_2pvbyte|5.006000||p
+sv_2pvutf8_nolen||5.006000|
+sv_2pvutf8||5.006000|
+sv_2pv|||
+sv_2uv_flags||5.009001|
+sv_2uv|5.004000||p
+sv_add_arena|||
+sv_add_backref|||
+sv_backoff|||
+sv_bless|||
+sv_cat_decode||5.008001|
+sv_catpv_mg|5.004050||p
+sv_catpvf_mg_nocontext|||pvn
+sv_catpvf_mg|5.006000|5.004000|pv
+sv_catpvf_nocontext|||vn
+sv_catpvf||5.004000|v
+sv_catpvn_flags||5.007002|
+sv_catpvn_mg|5.004050||p
+sv_catpvn_nomg|5.007002||p
+sv_catpvn|||
+sv_catpvs|5.009003||p
+sv_catpv|||
+sv_catsv_flags||5.007002|
+sv_catsv_mg|5.004050||p
+sv_catsv_nomg|5.007002||p
+sv_catsv|||
+sv_catxmlpvn|||
+sv_catxmlsv|||
+sv_chop|||
+sv_clean_all|||
+sv_clean_objs|||
+sv_clear|||
+sv_cmp_locale||5.004000|
+sv_cmp|||
+sv_collxfrm|||
+sv_compile_2op||5.008001|
+sv_copypv||5.007003|
+sv_dec|||
+sv_del_backref|||
+sv_derived_from||5.004000|
+sv_does||5.009004|
+sv_dump|||
+sv_dup|||
+sv_eq|||
+sv_exp_grow|||
+sv_force_normal_flags||5.007001|
+sv_force_normal||5.006000|
+sv_free2|||
+sv_free_arenas|||
+sv_free|||
+sv_gets||5.004000|
+sv_grow|||
+sv_i_ncmp|||
+sv_inc|||
+sv_insert|||
+sv_isa|||
+sv_isobject|||
+sv_iv||5.005000|
+sv_kill_backrefs|||
+sv_len_utf8||5.006000|
+sv_len|||
+sv_magicext||5.007003|
+sv_magic|||
+sv_mortalcopy|||
+sv_ncmp|||
+sv_newmortal|||
+sv_newref|||
+sv_nolocking||5.007003|
+sv_nosharing||5.007003|
+sv_nounlocking|||
+sv_nv||5.005000|
+sv_peek||5.005000|
+sv_pos_b2u_forwards|||
+sv_pos_b2u_midway|||
+sv_pos_b2u||5.006000|
+sv_pos_u2b_cached|||
+sv_pos_u2b_forwards|||n
+sv_pos_u2b_midway|||n
+sv_pos_u2b||5.006000|
+sv_pvbyten_force||5.006000|
+sv_pvbyten||5.006000|
+sv_pvbyte||5.006000|
+sv_pvn_force_flags||5.007002|
+sv_pvn_force|||p
+sv_pvn_nomg|5.007003||p
+sv_pvn|5.005000||p
+sv_pvutf8n_force||5.006000|
+sv_pvutf8n||5.006000|
+sv_pvutf8||5.006000|
+sv_pv||5.006000|
+sv_recode_to_utf8||5.007003|
+sv_reftype|||
+sv_release_COW|||
+sv_release_IVX|||
+sv_replace|||
+sv_report_used|||
+sv_reset|||
+sv_rvweaken||5.006000|
+sv_setiv_mg|5.004050||p
+sv_setiv|||
+sv_setnv_mg|5.006000||p
+sv_setnv|||
+sv_setpv_mg|5.004050||p
+sv_setpvf_mg_nocontext|||pvn
+sv_setpvf_mg|5.006000|5.004000|pv
+sv_setpvf_nocontext|||vn
+sv_setpvf||5.004000|v
+sv_setpviv_mg||5.008001|
+sv_setpviv||5.008001|
+sv_setpvn_mg|5.004050||p
+sv_setpvn|||
+sv_setpvs|5.009004||p
+sv_setpv|||
+sv_setref_iv|||
+sv_setref_nv|||
+sv_setref_pvn|||
+sv_setref_pv|||
+sv_setref_uv||5.007001|
+sv_setsv_cow|||
+sv_setsv_flags||5.007002|
+sv_setsv_mg|5.004050||p
+sv_setsv_nomg|5.007002||p
+sv_setsv|||
+sv_setuv_mg|5.004050||p
+sv_setuv|5.004000||p
+sv_tainted||5.004000|
+sv_taint||5.004000|
+sv_true||5.005000|
+sv_unglob|||
+sv_uni_display||5.007003|
+sv_unmagic|||
+sv_unref_flags||5.007001|
+sv_unref|||
+sv_untaint||5.004000|
+sv_upgrade|||
+sv_usepvn_flags||5.009004|
+sv_usepvn_mg|5.004050||p
+sv_usepvn|||
+sv_utf8_decode||5.006000|
+sv_utf8_downgrade||5.006000|
+sv_utf8_encode||5.006000|
+sv_utf8_upgrade_flags||5.007002|
+sv_utf8_upgrade||5.007001|
+sv_uv|5.005000||p
+sv_vcatpvf_mg|5.006000|5.004000|p
+sv_vcatpvfn||5.004000|
+sv_vcatpvf|5.006000|5.004000|p
+sv_vsetpvf_mg|5.006000|5.004000|p
+sv_vsetpvfn||5.004000|
+sv_vsetpvf|5.006000|5.004000|p
+sv_xmlpeek|||
+svtype|||
+swallow_bom|||
+swash_fetch||5.007002|
+swash_get|||
+swash_init||5.006000|
+sys_intern_clear|||
+sys_intern_dup|||
+sys_intern_init|||
+taint_env|||
+taint_proper|||
+tmps_grow||5.006000|
+toLOWER|||
+toUPPER|||
+to_byte_substr|||
+to_uni_fold||5.007003|
+to_uni_lower_lc||5.006000|
+to_uni_lower||5.007003|
+to_uni_title_lc||5.006000|
+to_uni_title||5.007003|
+to_uni_upper_lc||5.006000|
+to_uni_upper||5.007003|
+to_utf8_case||5.007003|
+to_utf8_fold||5.007003|
+to_utf8_lower||5.007003|
+to_utf8_substr|||
+to_utf8_title||5.007003|
+to_utf8_upper||5.007003|
+token_free|||
+token_getmad|||
+tokenize_use|||
+tokeq|||
+tokereport|||
+too_few_arguments|||
+too_many_arguments|||
+uiv_2buf|||n
+unlnk|||
+unpack_rec|||
+unpack_str||5.007003|
+unpackstring||5.008001|
+unshare_hek_or_pvn|||
+unshare_hek|||
+unsharepvn||5.004000|
+unwind_handler_stack|||
+upg_version||5.009000|
+usage|||
+utf16_to_utf8_reversed||5.006001|
+utf16_to_utf8||5.006001|
+utf8_distance||5.006000|
+utf8_hop||5.006000|
+utf8_length||5.007001|
+utf8_mg_pos_cache_update|||
+utf8_to_bytes||5.006001|
+utf8_to_uvchr||5.007001|
+utf8_to_uvuni||5.007001|
+utf8n_to_uvchr|||
+utf8n_to_uvuni||5.007001|
+utilize|||
+uvchr_to_utf8_flags||5.007003|
+uvchr_to_utf8|||
+uvuni_to_utf8_flags||5.007003|
+uvuni_to_utf8||5.007001|
+validate_suid|||
+varname|||
+vcmp||5.009000|
+vcroak||5.006000|
+vdeb||5.007003|
+vdie_common|||
+vdie_croak_common|||
+vdie|||
+vform||5.006000|
+visit|||
+vivify_defelem|||
+vivify_ref|||
+vload_module||5.006000|
+vmess||5.006000|
+vnewSVpvf|5.006000|5.004000|p
+vnormal||5.009002|
+vnumify||5.009000|
+vstringify||5.009000|
+vverify||5.009003|
+vwarner||5.006000|
+vwarn||5.006000|
+wait4pid|||
+warn_nocontext|||vn
+warner_nocontext|||vn
+warner|5.006000|5.004000|pv
+warn|||v
+watch|||
+whichsig|||
+write_no_mem|||
+write_to_stderr|||
+xmldump_all|||
+xmldump_attr|||
+xmldump_eval|||
+xmldump_form|||
+xmldump_indent|||v
+xmldump_packsubs|||
+xmldump_sub|||
+xmldump_vindent|||
+yyerror|||
+yylex|||
+yyparse|||
+yywarn|||
+);
+
+if (exists $opt{'list-unsupported'}) {
+  my $f;
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $API{$f}{todo};
+    print "$f ", '.'x(40-length($f)), " ", format_version($API{$f}{todo}), "\n";
+  }
+  exit 0;
+}
+
+# Scan for possible replacement candidates
+
+my(%replace, %need, %hints, %depends);
+my $replace = 0;
+my $hint = '';
+
+while (<DATA>) {
+  if ($hint) {
+    if (m{^\s*\*\s(.*?)\s*$}) {
+      $hints{$hint} ||= '';  # suppress warning with older perls
+      $hints{$hint} .= "$1\n";
+    }
+    else {
+      $hint = '';
+    }
+  }
+  $hint = $1 if m{^\s*$rccs\sHint:\s+(\w+)\s*$};
+
+  $replace     = $1 if m{^\s*$rccs\s+Replace:\s+(\d+)\s+$rcce\s*$};
+  $replace{$2} = $1 if $replace and m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+)};
+  $replace{$2} = $1 if m{^\s*#\s*define\s+(\w+)(?:\([^)]*\))?\s+(\w+).*$rccs\s+Replace\s+$rcce};
+  $replace{$1} = $2 if m{^\s*$rccs\s+Replace (\w+) with (\w+)\s+$rcce\s*$};
+
+  if (m{^\s*$rccs\s+(\w+)\s+depends\s+on\s+(\w+(\s*,\s*\w+)*)\s+$rcce\s*$}) {
+    push @{$depends{$1}}, map { s/\s+//g; $_ } split /,/, $2;
+  }
+
+  $need{$1} = 1 if m{^#if\s+defined\(NEED_(\w+)(?:_GLOBAL)?\)};
+}
+
+if (exists $opt{'api-info'}) {
+  my $f;
+  my $count = 0;
+  my $match = $opt{'api-info'} =~ m!^/(.*)/$! ? $1 : "^\Q$opt{'api-info'}\E\$";
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $f =~ /$match/;
+    print "\n=== $f ===\n\n";
+    my $info = 0;
+    if ($API{$f}{base} || $API{$f}{todo}) {
+      my $base = format_version($API{$f}{base} || $API{$f}{todo});
+      print "Supported at least starting from perl-$base.\n";
+      $info++;
+    }
+    if ($API{$f}{provided}) {
+      my $todo = $API{$f}{todo} ? format_version($API{$f}{todo}) : "5.003";
+      print "Support by $ppport provided back to perl-$todo.\n";
+      print "Support needs to be explicitly requested by NEED_$f.\n" if exists $need{$f};
+      print "Depends on: ", join(', ', @{$depends{$f}}), ".\n" if exists $depends{$f};
+      print "$hints{$f}" if exists $hints{$f};
+      $info++;
+    }
+    unless ($info) {
+      print "No portability information available.\n";
+    }
+    $count++;
+  }
+  if ($count > 0) {
+    print "\n";
+  }
+  else {
+    print "Found no API matching '$opt{'api-info'}'.\n";
+  }
+  exit 0;
+}
+
+if (exists $opt{'list-provided'}) {
+  my $f;
+  for $f (sort { lc $a cmp lc $b } keys %API) {
+    next unless $API{$f}{provided};
+    my @flags;
+    push @flags, 'explicit' if exists $need{$f};
+    push @flags, 'depend'   if exists $depends{$f};
+    push @flags, 'hint'     if exists $hints{$f};
+    my $flags = @flags ? '  ['.join(', ', @flags).']' : '';
+    print "$f$flags\n";
+  }
+  exit 0;
+}
+
+my @files;
+my @srcext = qw( xs c h cc cpp );
+my $srcext = join '|', @srcext;
+
+if (@ARGV) {
+  my %seen;
+  @files = grep { -f && !exists $seen{$_} } map { glob $_ } @ARGV;
+}
+else {
+  eval {
+    require File::Find;
+    File::Find::find(sub {
+      $File::Find::name =~ /\.($srcext)$/i
+          and push @files, $File::Find::name;
+    }, '.');
+  };
+  if ($@) {
+    @files = map { glob "*.$_" } @srcext;
+  }
+}
+
+if (!@ARGV || $opt{filter}) {
+  my(@in, @out);
+  my %xsc = map { /(.*)\.xs$/ ? ("$1.c" => 1, "$1.cc" => 1) : () } @files;
+  for (@files) {
+    my $out = exists $xsc{$_} || /\b\Q$ppport\E$/i || !/\.($srcext)$/i;
+    push @{ $out ? \@out : \@in }, $_;
+  }
+  if (@ARGV && @out) {
+    warning("Skipping the following files (use --nofilter to avoid this):\n| ", join "\n| ", @out);
+  }
+  @files = @in;
+}
+
+unless (@files) {
+  die "No input files given!\n";
+}
+
+my(%files, %global, %revreplace);
+%revreplace = reverse %replace;
+my $filename;
+my $patch_opened = 0;
+
+for $filename (@files) {
+  unless (open IN, "<$filename") {
+    warn "Unable to read from $filename: $!\n";
+    next;
+  }
+
+  info("Scanning $filename ...");
+
+  my $c = do { local $/; <IN> };
+  close IN;
+
+  my %file = (orig => $c, changes => 0);
+
+  # temporarily remove C comments from the code
+  my @ccom;
+  $c =~ s{
+    (
+        [^"'/]+
+      |
+        (?:"[^"\\]*(?:\\.[^"\\]*)*" [^"'/]*)+
+      |
+        (?:'[^'\\]*(?:\\.[^'\\]*)*' [^"'/]*)+
+    )
+  |
+    (/ (?:
+        \*[^*]*\*+(?:[^$ccs][^*]*\*+)* /
+        |
+        /[^\r\n]*
+      ))
+  }{
+    defined $2 and push @ccom, $2;
+    defined $1 ? $1 : "$ccs$#ccom$cce";
+  }egsx;
+
+  $file{ccom} = \@ccom;
+  $file{code} = $c;
+  $file{has_inc_ppport} = ($c =~ /#.*include.*\Q$ppport\E/);
+
+  my $func;
+
+  for $func (keys %API) {
+    my $match = $func;
+    $match .= "|$revreplace{$func}" if exists $revreplace{$func};
+    if ($c =~ /\b(?:Perl_)?($match)\b/) {
+      $file{uses_replace}{$1}++ if exists $revreplace{$func} && $1 eq $revreplace{$func};
+      $file{uses_Perl}{$func}++ if $c =~ /\bPerl_$func\b/;
+      if (exists $API{$func}{provided}) {
+        if (!exists $API{$func}{base} || $API{$func}{base} > $opt{'compat-version'}) {
+          $file{uses}{$func}++;
+          my @deps = rec_depend($func);
+          if (@deps) {
+            $file{uses_deps}{$func} = \@deps;
+            for (@deps) {
+              $file{uses}{$_} = 0 unless exists $file{uses}{$_};
+            }
+          }
+          for ($func, @deps) {
+            if (exists $need{$_}) {
+              $file{needs}{$_} = 'static';
+            }
+          }
+        }
+      }
+      if (exists $API{$func}{todo} && $API{$func}{todo} > $opt{'compat-version'}) {
+        if ($c =~ /\b$func\b/) {
+          $file{uses_todo}{$func}++;
+        }
+      }
+    }
+  }
+
+  while ($c =~ /^$HS*#$HS*define$HS+(NEED_(\w+?)(_GLOBAL)?)\b/mg) {
+    if (exists $need{$2}) {
+      $file{defined $3 ? 'needed_global' : 'needed_static'}{$2}++;
+    }
+    else {
+      warning("Possibly wrong #define $1 in $filename");
+    }
+  }
+
+  for (qw(uses needs uses_todo needed_global needed_static)) {
+    for $func (keys %{$file{$_}}) {
+      push @{$global{$_}{$func}}, $filename;
+    }
+  }
+
+  $files{$filename} = \%file;
+}
+
+# Globally resolve NEED_'s
+my $need;
+for $need (keys %{$global{needs}}) {
+  if (@{$global{needs}{$need}} > 1) {
+    my @targets = @{$global{needs}{$need}};
+    my @t = grep $files{$_}{needed_global}{$need}, @targets;
+    @targets = @t if @t;
+    @t = grep /\.xs$/i, @targets;
+    @targets = @t if @t;
+    my $target = shift @targets;
+    $files{$target}{needs}{$need} = 'global';
+    for (@{$global{needs}{$need}}) {
+      $files{$_}{needs}{$need} = 'extern' if $_ ne $target;
+    }
+  }
+}
+
+for $filename (@files) {
+  exists $files{$filename} or next;
+
+  info("=== Analyzing $filename ===");
+
+  my %file = %{$files{$filename}};
+  my $func;
+  my $c = $file{code};
+
+  for $func (sort keys %{$file{uses_Perl}}) {
+    if ($API{$func}{varargs}) {
+      my $changes = ($c =~ s{\b(Perl_$func\s*\(\s*)(?!aTHX_?)(\)|[^\s)]*\))}
+                            { $1 . ($2 eq ')' ? 'aTHX' : 'aTHX_ ') . $2 }ge);
+      if ($changes) {
+        warning("Doesn't pass interpreter argument aTHX to Perl_$func");
+        $file{changes} += $changes;
+      }
+    }
+    else {
+      warning("Uses Perl_$func instead of $func");
+      $file{changes} += ($c =~ s{\bPerl_$func(\s*)\((\s*aTHX_?)?\s*}
+                                {$func$1(}g);
+    }
+  }
+
+  for $func (sort keys %{$file{uses_replace}}) {
+    warning("Uses $func instead of $replace{$func}");
+    $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+  }
+
+  for $func (sort keys %{$file{uses}}) {
+    next unless $file{uses}{$func};   # if it's only a dependency
+    if (exists $file{uses_deps}{$func}) {
+      diag("Uses $func, which depends on ", join(', ', @{$file{uses_deps}{$func}}));
+    }
+    elsif (exists $replace{$func}) {
+      warning("Uses $func instead of $replace{$func}");
+      $file{changes} += ($c =~ s/\b$func\b/$replace{$func}/g);
+    }
+    else {
+      diag("Uses $func");
+    }
+    hint($func);
+  }
+
+  for $func (sort keys %{$file{uses_todo}}) {
+    warning("Uses $func, which may not be portable below perl ",
+            format_version($API{$func}{todo}));
+  }
+
+  for $func (sort keys %{$file{needed_static}}) {
+    my $message = '';
+    if (not exists $file{uses}{$func}) {
+      $message = "No need to define NEED_$func if $func is never used";
+    }
+    elsif (exists $file{needs}{$func} && $file{needs}{$func} ne 'static') {
+      $message = "No need to define NEED_$func when already needed globally";
+    }
+    if ($message) {
+      diag($message);
+      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_$func\b.*$LF//mg);
+    }
+  }
+
+  for $func (sort keys %{$file{needed_global}}) {
+    my $message = '';
+    if (not exists $global{uses}{$func}) {
+      $message = "No need to define NEED_${func}_GLOBAL if $func is never used";
+    }
+    elsif (exists $file{needs}{$func}) {
+      if ($file{needs}{$func} eq 'extern') {
+        $message = "No need to define NEED_${func}_GLOBAL when already needed globally";
+      }
+      elsif ($file{needs}{$func} eq 'static') {
+        $message = "No need to define NEED_${func}_GLOBAL when only used in this file";
+      }
+    }
+    if ($message) {
+      diag($message);
+      $file{changes} += ($c =~ s/^$HS*#$HS*define$HS+NEED_${func}_GLOBAL\b.*$LF//mg);
+    }
+  }
+
+  $file{needs_inc_ppport} = keys %{$file{uses}};
+
+  if ($file{needs_inc_ppport}) {
+    my $pp = '';
+
+    for $func (sort keys %{$file{needs}}) {
+      my $type = $file{needs}{$func};
+      next if $type eq 'extern';
+      my $suffix = $type eq 'global' ? '_GLOBAL' : '';
+      unless (exists $file{"needed_$type"}{$func}) {
+        if ($type eq 'global') {
+          diag("Files [@{$global{needs}{$func}}] need $func, adding global request");
+        }
+        else {
+          diag("File needs $func, adding static request");
+        }
+        $pp .= "#define NEED_$func$suffix\n";
+      }
+    }
+
+    if ($pp && ($c =~ s/^(?=$HS*#$HS*define$HS+NEED_\w+)/$pp/m)) {
+      $pp = '';
+      $file{changes}++;
+    }
+
+    unless ($file{has_inc_ppport}) {
+      diag("Needs to include '$ppport'");
+      $pp .= qq(#include "$ppport"\n)
+    }
+
+    if ($pp) {
+      $file{changes} += ($c =~ s/^($HS*#$HS*define$HS+NEED_\w+.*?)^/$1$pp/ms)
+                     || ($c =~ s/^(?=$HS*#$HS*include.*\Q$ppport\E)/$pp/m)
+                     || ($c =~ s/^($HS*#$HS*include.*XSUB.*\s*?)^/$1$pp/m)
+                     || ($c =~ s/^/$pp/);
+    }
+  }
+  else {
+    if ($file{has_inc_ppport}) {
+      diag("No need to include '$ppport'");
+      $file{changes} += ($c =~ s/^$HS*?#$HS*include.*\Q$ppport\E.*?$LF//m);
+    }
+  }
+
+  # put back in our C comments
+  my $ix;
+  my $cppc = 0;
+  my @ccom = @{$file{ccom}};
+  for $ix (0 .. $#ccom) {
+    if (!$opt{cplusplus} && $ccom[$ix] =~ s!^//!!) {
+      $cppc++;
+      $file{changes} += $c =~ s/$rccs$ix$rcce/$ccs$ccom[$ix] $cce/;
+    }
+    else {
+      $c =~ s/$rccs$ix$rcce/$ccom[$ix]/;
+    }
+  }
+
+  if ($cppc) {
+    my $s = $cppc != 1 ? 's' : '';
+    warning("Uses $cppc C++ style comment$s, which is not portable");
+  }
+
+  if ($file{changes}) {
+    if (exists $opt{copy}) {
+      my $newfile = "$filename$opt{copy}";
+      if (-e $newfile) {
+        error("'$newfile' already exists, refusing to write copy of '$filename'");
+      }
+      else {
+        local *F;
+        if (open F, ">$newfile") {
+          info("Writing copy of '$filename' with changes to '$newfile'");
+          print F $c;
+          close F;
+        }
+        else {
+          error("Cannot open '$newfile' for writing: $!");
+        }
+      }
+    }
+    elsif (exists $opt{patch} || $opt{changes}) {
+      if (exists $opt{patch}) {
+        unless ($patch_opened) {
+          if (open PATCH, ">$opt{patch}") {
+            $patch_opened = 1;
+          }
+          else {
+            error("Cannot open '$opt{patch}' for writing: $!");
+            delete $opt{patch};
+            $opt{changes} = 1;
+            goto fallback;
+          }
+        }
+        mydiff(\*PATCH, $filename, $c);
+      }
+      else {
+fallback:
+        info("Suggested changes:");
+        mydiff(\*STDOUT, $filename, $c);
+      }
+    }
+    else {
+      my $s = $file{changes} == 1 ? '' : 's';
+      info("$file{changes} potentially required change$s detected");
+    }
+  }
+  else {
+    info("Looks good");
+  }
+}
+
+close PATCH if $patch_opened;
+
+exit 0;
+
+
+sub mydiff
+{
+  local *F = shift;
+  my($file, $str) = @_;
+  my $diff;
+
+  if (exists $opt{diff}) {
+    $diff = run_diff($opt{diff}, $file, $str);
+  }
+
+  if (!defined $diff and can_use('Text::Diff')) {
+    $diff = Text::Diff::diff($file, \$str, { STYLE => 'Unified' });
+    $diff = <<HEADER . $diff;
+--- $file
++++ $file.patched
+HEADER
+  }
+
+  if (!defined $diff) {
+    $diff = run_diff('diff -u', $file, $str);
+  }
+
+  if (!defined $diff) {
+    $diff = run_diff('diff', $file, $str);
+  }
+
+  if (!defined $diff) {
+    error("Cannot generate a diff. Please install Text::Diff or use --copy.");
+    return;
+  }
+
+  print F $diff;
+
+}
+
+sub run_diff
+{
+  my($prog, $file, $str) = @_;
+  my $tmp = 'dppptemp';
+  my $suf = 'aaa';
+  my $diff = '';
+  local *F;
+
+  while (-e "$tmp.$suf") { $suf++ }
+  $tmp = "$tmp.$suf";
+
+  if (open F, ">$tmp") {
+    print F $str;
+    close F;
+
+    if (open F, "$prog $file $tmp |") {
+      while (<F>) {
+        s/\Q$tmp\E/$file.patched/;
+        $diff .= $_;
+      }
+      close F;
+      unlink $tmp;
+      return $diff;
+    }
+
+    unlink $tmp;
+  }
+  else {
+    error("Cannot open '$tmp' for writing: $!");
+  }
+
+  return undef;
+}
+
+sub can_use
+{
+  eval "use @_;";
+  return $@ eq '';
+}
+
+sub rec_depend
+{
+  my $func = shift;
+  my %seen;
+  return () unless exists $depends{$func};
+  grep !$seen{$_}++, map { ($_, rec_depend($_)) } @{$depends{$func}};
+}
+
+sub parse_version
+{
+  my $ver = shift;
+
+  if ($ver =~ /^(\d+)\.(\d+)\.(\d+)$/) {
+    return ($1, $2, $3);
+  }
+  elsif ($ver !~ /^\d+\.[\d_]+$/) {
+    die "cannot parse version '$ver'\n";
+  }
+
+  $ver =~ s/_//g;
+  $ver =~ s/$/000000/;
+
+  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+  $v = int $v;
+  $s = int $s;
+
+  if ($r < 5 || ($r == 5 && $v < 6)) {
+    if ($s % 10) {
+      die "cannot parse version '$ver'\n";
+    }
+  }
+
+  return ($r, $v, $s);
+}
+
+sub format_version
+{
+  my $ver = shift;
+
+  $ver =~ s/$/000000/;
+  my($r,$v,$s) = $ver =~ /(\d+)\.(\d{3})(\d{3})/;
+
+  $v = int $v;
+  $s = int $s;
+
+  if ($r < 5 || ($r == 5 && $v < 6)) {
+    if ($s % 10) {
+      die "invalid version '$ver'\n";
+    }
+    $s /= 10;
+
+    $ver = sprintf "%d.%03d", $r, $v;
+    $s > 0 and $ver .= sprintf "_%02d", $s;
+
+    return $ver;
+  }
+
+  return sprintf "%d.%d.%d", $r, $v, $s;
+}
+
+sub info
+{
+  $opt{quiet} and return;
+  print @_, "\n";
+}
+
+sub diag
+{
+  $opt{quiet} and return;
+  $opt{diag} and print @_, "\n";
+}
+
+sub warning
+{
+  $opt{quiet} and return;
+  print "*** ", @_, "\n";
+}
+
+sub error
+{
+  print "*** ERROR: ", @_, "\n";
+}
+
+my %given_hints;
+sub hint
+{
+  $opt{quiet} and return;
+  $opt{hints} or return;
+  my $func = shift;
+  exists $hints{$func} or return;
+  $given_hints{$func}++ and return;
+  my $hint = $hints{$func};
+  $hint =~ s/^/   /mg;
+  print "   --- hint for $func ---\n", $hint;
+}
+
+sub usage
+{
+  my($usage) = do { local(@ARGV,$/)=($0); <> } =~ /^=head\d$HS+SYNOPSIS\s*^(.*?)\s*^=/ms;
+  my %M = ( 'I' => '*' );
+  $usage =~ s/^\s*perl\s+\S+/$^X $0/;
+  $usage =~ s/([A-Z])<([^>]+)>/$M{$1}$2$M{$1}/g;
+
+  print <<ENDUSAGE;
+
+Usage: $usage
+
+See perldoc $0 for details.
+
+ENDUSAGE
+
+  exit 2;
+}
+
+sub strip
+{
+  my $self = do { local(@ARGV,$/)=($0); <> };
+  my($copy) = $self =~ /^=head\d\s+COPYRIGHT\s*^(.*?)^=\w+/ms;
+  $copy =~ s/^(?=\S+)/    /gms;
+  $self =~ s/^$HS+Do NOT edit.*?(?=^-)/$copy/ms;
+  $self =~ s/^SKIP.*(?=^__DATA__)/SKIP
+if (\@ARGV && \$ARGV[0] eq '--unstrip') {
+  eval { require Devel::PPPort };
+  \$@ and die "Cannot require Devel::PPPort, please install.\\n";
+  if (\$Devel::PPPort::VERSION < $VERSION) {
+    die "$0 was originally generated with Devel::PPPort $VERSION.\\n"
+      . "Your Devel::PPPort is only version \$Devel::PPPort::VERSION.\\n"
+      . "Please install a newer version, or --unstrip will not work.\\n";
+  }
+  Devel::PPPort::WriteFile(\$0);
+  exit 0;
+}
+print <<END;
+
+Sorry, but this is a stripped version of \$0.
+
+To be able to use its original script and doc functionality,
+please try to regenerate this file using:
+
+  \$^X \$0 --unstrip
+
+END
+/ms;
+
+  open OUT, ">$0" or die "cannot strip $0: $!\n";
+  print OUT $self;
+
+  exit 0;
+}
+
+__DATA__
+*/
+
+#ifndef _P_P_PORTABILITY_H_
+#define _P_P_PORTABILITY_H_
+
+#ifndef DPPP_NAMESPACE
+#  define DPPP_NAMESPACE DPPP_
+#endif
+
+#define DPPP_CAT2(x,y) CAT2(x,y)
+#define DPPP_(name) DPPP_CAT2(DPPP_NAMESPACE, name)
+
+#ifndef PERL_REVISION
+#  if !defined(__PATCHLEVEL_H_INCLUDED__) && !(defined(PATCHLEVEL) && defined(SUBVERSION))
+#    define PERL_PATCHLEVEL_H_IMPLICIT
+#    include <patchlevel.h>
+#  endif
+#  if !(defined(PERL_VERSION) || (defined(SUBVERSION) && defined(PATCHLEVEL)))
+#    include <could_not_find_Perl_patchlevel.h>
+#  endif
+#  ifndef PERL_REVISION
+#    define PERL_REVISION       (5)
+     /* Replace: 1 */
+#    define PERL_VERSION        PATCHLEVEL
+#    define PERL_SUBVERSION     SUBVERSION
+     /* Replace PERL_PATCHLEVEL with PERL_VERSION */
+     /* Replace: 0 */
+#  endif
+#endif
+
+#define PERL_BCDVERSION ((PERL_REVISION * 0x1000000L) + (PERL_VERSION * 0x1000L) + PERL_SUBVERSION)
+
+/* It is very unlikely that anyone will try to use this with Perl 6
+   (or greater), but who knows.
+ */
+#if PERL_REVISION != 5
+#  error ppport.h only works with Perl version 5
+#endif /* PERL_REVISION != 5 */
+
+#ifdef I_LIMITS
+#  include <limits.h>
+#endif
+
+#ifndef PERL_UCHAR_MIN
+#  define PERL_UCHAR_MIN ((unsigned char)0)
+#endif
+
+#ifndef PERL_UCHAR_MAX
+#  ifdef UCHAR_MAX
+#    define PERL_UCHAR_MAX ((unsigned char)UCHAR_MAX)
+#  else
+#    ifdef MAXUCHAR
+#      define PERL_UCHAR_MAX ((unsigned char)MAXUCHAR)
+#    else
+#      define PERL_UCHAR_MAX ((unsigned char)~(unsigned)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_USHORT_MIN
+#  define PERL_USHORT_MIN ((unsigned short)0)
+#endif
+
+#ifndef PERL_USHORT_MAX
+#  ifdef USHORT_MAX
+#    define PERL_USHORT_MAX ((unsigned short)USHORT_MAX)
+#  else
+#    ifdef MAXUSHORT
+#      define PERL_USHORT_MAX ((unsigned short)MAXUSHORT)
+#    else
+#      ifdef USHRT_MAX
+#        define PERL_USHORT_MAX ((unsigned short)USHRT_MAX)
+#      else
+#        define PERL_USHORT_MAX ((unsigned short)~(unsigned)0)
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_SHORT_MAX
+#  ifdef SHORT_MAX
+#    define PERL_SHORT_MAX ((short)SHORT_MAX)
+#  else
+#    ifdef MAXSHORT    /* Often used in <values.h> */
+#      define PERL_SHORT_MAX ((short)MAXSHORT)
+#    else
+#      ifdef SHRT_MAX
+#        define PERL_SHORT_MAX ((short)SHRT_MAX)
+#      else
+#        define PERL_SHORT_MAX ((short) (PERL_USHORT_MAX >> 1))
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_SHORT_MIN
+#  ifdef SHORT_MIN
+#    define PERL_SHORT_MIN ((short)SHORT_MIN)
+#  else
+#    ifdef MINSHORT
+#      define PERL_SHORT_MIN ((short)MINSHORT)
+#    else
+#      ifdef SHRT_MIN
+#        define PERL_SHORT_MIN ((short)SHRT_MIN)
+#      else
+#        define PERL_SHORT_MIN (-PERL_SHORT_MAX - ((3 & -1) == 3))
+#      endif
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_UINT_MAX
+#  ifdef UINT_MAX
+#    define PERL_UINT_MAX ((unsigned int)UINT_MAX)
+#  else
+#    ifdef MAXUINT
+#      define PERL_UINT_MAX ((unsigned int)MAXUINT)
+#    else
+#      define PERL_UINT_MAX (~(unsigned int)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_UINT_MIN
+#  define PERL_UINT_MIN ((unsigned int)0)
+#endif
+
+#ifndef PERL_INT_MAX
+#  ifdef INT_MAX
+#    define PERL_INT_MAX ((int)INT_MAX)
+#  else
+#    ifdef MAXINT    /* Often used in <values.h> */
+#      define PERL_INT_MAX ((int)MAXINT)
+#    else
+#      define PERL_INT_MAX ((int)(PERL_UINT_MAX >> 1))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_INT_MIN
+#  ifdef INT_MIN
+#    define PERL_INT_MIN ((int)INT_MIN)
+#  else
+#    ifdef MININT
+#      define PERL_INT_MIN ((int)MININT)
+#    else
+#      define PERL_INT_MIN (-PERL_INT_MAX - ((3 & -1) == 3))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_ULONG_MAX
+#  ifdef ULONG_MAX
+#    define PERL_ULONG_MAX ((unsigned long)ULONG_MAX)
+#  else
+#    ifdef MAXULONG
+#      define PERL_ULONG_MAX ((unsigned long)MAXULONG)
+#    else
+#      define PERL_ULONG_MAX (~(unsigned long)0)
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_ULONG_MIN
+#  define PERL_ULONG_MIN ((unsigned long)0L)
+#endif
+
+#ifndef PERL_LONG_MAX
+#  ifdef LONG_MAX
+#    define PERL_LONG_MAX ((long)LONG_MAX)
+#  else
+#    ifdef MAXLONG
+#      define PERL_LONG_MAX ((long)MAXLONG)
+#    else
+#      define PERL_LONG_MAX ((long) (PERL_ULONG_MAX >> 1))
+#    endif
+#  endif
+#endif
+
+#ifndef PERL_LONG_MIN
+#  ifdef LONG_MIN
+#    define PERL_LONG_MIN ((long)LONG_MIN)
+#  else
+#    ifdef MINLONG
+#      define PERL_LONG_MIN ((long)MINLONG)
+#    else
+#      define PERL_LONG_MIN (-PERL_LONG_MAX - ((3 & -1) == 3))
+#    endif
+#  endif
+#endif
+
+#if defined(HAS_QUAD) && (defined(convex) || defined(uts))
+#  ifndef PERL_UQUAD_MAX
+#    ifdef ULONGLONG_MAX
+#      define PERL_UQUAD_MAX ((unsigned long long)ULONGLONG_MAX)
+#    else
+#      ifdef MAXULONGLONG
+#        define PERL_UQUAD_MAX ((unsigned long long)MAXULONGLONG)
+#      else
+#        define PERL_UQUAD_MAX (~(unsigned long long)0)
+#      endif
+#    endif
+#  endif
+
+#  ifndef PERL_UQUAD_MIN
+#    define PERL_UQUAD_MIN ((unsigned long long)0L)
+#  endif
+
+#  ifndef PERL_QUAD_MAX
+#    ifdef LONGLONG_MAX
+#      define PERL_QUAD_MAX ((long long)LONGLONG_MAX)
+#    else
+#      ifdef MAXLONGLONG
+#        define PERL_QUAD_MAX ((long long)MAXLONGLONG)
+#      else
+#        define PERL_QUAD_MAX ((long long) (PERL_UQUAD_MAX >> 1))
+#      endif
+#    endif
+#  endif
+
+#  ifndef PERL_QUAD_MIN
+#    ifdef LONGLONG_MIN
+#      define PERL_QUAD_MIN ((long long)LONGLONG_MIN)
+#    else
+#      ifdef MINLONGLONG
+#        define PERL_QUAD_MIN ((long long)MINLONGLONG)
+#      else
+#        define PERL_QUAD_MIN (-PERL_QUAD_MAX - ((3 & -1) == 3))
+#      endif
+#    endif
+#  endif
+#endif
+
+/* This is based on code from 5.003 perl.h */
+#ifdef HAS_QUAD
+#  ifdef cray
+#ifndef IVTYPE
+#  define IVTYPE                         int
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_INT_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_INT_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_UINT_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_UINT_MAX
+#endif
+
+#    ifdef INTSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         INTSIZE
+#endif
+
+#    endif
+#  else
+#    if defined(convex) || defined(uts)
+#ifndef IVTYPE
+#  define IVTYPE                         long long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_QUAD_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_QUAD_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_UQUAD_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_UQUAD_MAX
+#endif
+
+#      ifdef LONGLONGSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         LONGLONGSIZE
+#endif
+
+#      endif
+#    else
+#ifndef IVTYPE
+#  define IVTYPE                         long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_ULONG_MAX
+#endif
+
+#      ifdef LONGSIZE
+#ifndef IVSIZE
+#  define IVSIZE                         LONGSIZE
+#endif
+
+#      endif
+#    endif
+#  endif
+#ifndef IVSIZE
+#  define IVSIZE                         8
+#endif
+
+#ifndef PERL_QUAD_MIN
+#  define PERL_QUAD_MIN                  IV_MIN
+#endif
+
+#ifndef PERL_QUAD_MAX
+#  define PERL_QUAD_MAX                  IV_MAX
+#endif
+
+#ifndef PERL_UQUAD_MIN
+#  define PERL_UQUAD_MIN                 UV_MIN
+#endif
+
+#ifndef PERL_UQUAD_MAX
+#  define PERL_UQUAD_MAX                 UV_MAX
+#endif
+
+#else
+#ifndef IVTYPE
+#  define IVTYPE                         long
+#endif
+
+#ifndef IV_MIN
+#  define IV_MIN                         PERL_LONG_MIN
+#endif
+
+#ifndef IV_MAX
+#  define IV_MAX                         PERL_LONG_MAX
+#endif
+
+#ifndef UV_MIN
+#  define UV_MIN                         PERL_ULONG_MIN
+#endif
+
+#ifndef UV_MAX
+#  define UV_MAX                         PERL_ULONG_MAX
+#endif
+
+#endif
+
+#ifndef IVSIZE
+#  ifdef LONGSIZE
+#    define IVSIZE LONGSIZE
+#  else
+#    define IVSIZE 4 /* A bold guess, but the best we can make. */
+#  endif
+#endif
+#ifndef UVTYPE
+#  define UVTYPE                         unsigned IVTYPE
+#endif
+
+#ifndef UVSIZE
+#  define UVSIZE                         IVSIZE
+#endif
+#ifndef sv_setuv
+#  define sv_setuv(sv, uv)               \
+               STMT_START {                         \
+                 UV TeMpUv = uv;                    \
+                 if (TeMpUv <= IV_MAX)              \
+                   sv_setiv(sv, TeMpUv);            \
+                 else                               \
+                   sv_setnv(sv, (double)TeMpUv);    \
+               } STMT_END
+#endif
+#ifndef newSVuv
+#  define newSVuv(uv)                    ((uv) <= IV_MAX ? newSViv((IV)uv) : newSVnv((NV)uv))
+#endif
+#ifndef sv_2uv
+#  define sv_2uv(sv)                     ((PL_Sv = (sv)), (UV) (SvNOK(PL_Sv) ? SvNV(PL_Sv) : sv_2nv(PL_Sv)))
+#endif
+
+#ifndef SvUVX
+#  define SvUVX(sv)                      ((UV)SvIVX(sv))
+#endif
+
+#ifndef SvUVXx
+#  define SvUVXx(sv)                     SvUVX(sv)
+#endif
+
+#ifndef SvUV
+#  define SvUV(sv)                       (SvIOK(sv) ? SvUVX(sv) : sv_2uv(sv))
+#endif
+
+#ifndef SvUVx
+#  define SvUVx(sv)                      ((PL_Sv = (sv)), SvUV(PL_Sv))
+#endif
+
+/* Hint: sv_uv
+ * Always use the SvUVx() macro instead of sv_uv().
+ */
+#ifndef sv_uv
+#  define sv_uv(sv)                      SvUVx(sv)
+#endif
+#ifndef XST_mUV
+#  define XST_mUV(i,v)                   (ST(i) = sv_2mortal(newSVuv(v))  )
+#endif
+
+#ifndef XSRETURN_UV
+#  define XSRETURN_UV(v)                 STMT_START { XST_mUV(0,v);  XSRETURN(1); } STMT_END
+#endif
+#ifndef PUSHu
+#  define PUSHu(u)                       STMT_START { sv_setuv(TARG, (UV)(u)); PUSHTARG;  } STMT_END
+#endif
+
+#ifndef XPUSHu
+#  define XPUSHu(u)                      STMT_START { sv_setuv(TARG, (UV)(u)); XPUSHTARG; } STMT_END
+#endif
+
+#ifdef HAS_MEMCMP
+#ifndef memNE
+#  define memNE(s1,s2,l)                 (memcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+#  define memEQ(s1,s2,l)                 (!memcmp(s1,s2,l))
+#endif
+
+#else
+#ifndef memNE
+#  define memNE(s1,s2,l)                 (bcmp(s1,s2,l))
+#endif
+
+#ifndef memEQ
+#  define memEQ(s1,s2,l)                 (!bcmp(s1,s2,l))
+#endif
+
+#endif
+#ifndef MoveD
+#  define MoveD(s,d,n,t)                 memmove((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifndef CopyD
+#  define CopyD(s,d,n,t)                 memcpy((char*)(d),(char*)(s), (n) * sizeof(t))
+#endif
+
+#ifdef HAS_MEMSET
+#ifndef ZeroD
+#  define ZeroD(d,n,t)                   memzero((char*)(d), (n) * sizeof(t))
+#endif
+
+#else
+#ifndef ZeroD
+#  define ZeroD(d,n,t)                   ((void)memzero((char*)(d), (n) * sizeof(t)), d)
+#endif
+
+#endif
+#ifndef PoisonWith
+#  define PoisonWith(d,n,t,b)            (void)memset((char*)(d), (U8)(b), (n) * sizeof(t))
+#endif
+
+#ifndef PoisonNew
+#  define PoisonNew(d,n,t)               PoisonWith(d,n,t,0xAB)
+#endif
+
+#ifndef PoisonFree
+#  define PoisonFree(d,n,t)              PoisonWith(d,n,t,0xEF)
+#endif
+
+#ifndef Poison
+#  define Poison(d,n,t)                  PoisonFree(d,n,t)
+#endif
+#ifndef Newx
+#  define Newx(v,n,t)                    New(0,v,n,t)
+#endif
+
+#ifndef Newxc
+#  define Newxc(v,n,t,c)                 Newc(0,v,n,t,c)
+#endif
+
+#ifndef Newxz
+#  define Newxz(v,n,t)                   Newz(0,v,n,t)
+#endif
+
+#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION <= 5)))
+/* Replace: 1 */
+#  define PL_DBsingle               DBsingle
+#  define PL_DBsub                  DBsub
+#  define PL_Sv                     Sv
+#  define PL_compiling              compiling
+#  define PL_copline                copline
+#  define PL_curcop                 curcop
+#  define PL_curstash               curstash
+#  define PL_debstash               debstash
+#  define PL_defgv                  defgv
+#  define PL_diehook                diehook
+#  define PL_dirty                  dirty
+#  define PL_dowarn                 dowarn
+#  define PL_errgv                  errgv
+#  define PL_hexdigit               hexdigit
+#  define PL_hints                  hints
+#  define PL_na	                    na
+#  define PL_no_modify              no_modify
+#  define PL_perl_destruct_level    perl_destruct_level
+#  define PL_perldb                 perldb
+#  define PL_ppaddr                 ppaddr
+#  define PL_rsfp_filters           rsfp_filters
+#  define PL_rsfp                   rsfp
+#  define PL_stack_base             stack_base
+#  define PL_stack_sp               stack_sp
+#  define PL_stdingv                stdingv
+#  define PL_sv_arenaroot           sv_arenaroot
+#  define PL_sv_no                  sv_no
+#  define PL_sv_undef               sv_undef
+#  define PL_sv_yes                 sv_yes
+#  define PL_tainted                tainted
+#  define PL_tainting               tainting
+/* Replace: 0 */
+#endif
+
+#ifndef PERL_UNUSED_DECL
+#  ifdef HASATTRIBUTE
+#    if (defined(__GNUC__) && defined(__cplusplus)) || defined(__INTEL_COMPILER)
+#      define PERL_UNUSED_DECL
+#    else
+#      define PERL_UNUSED_DECL __attribute__((unused))
+#    endif
+#  else
+#    define PERL_UNUSED_DECL
+#  endif
+#endif
+
+#ifndef PERL_UNUSED_ARG
+#  if defined(lint) && defined(S_SPLINT_S) /* www.splint.org */
+#    include <note.h>
+#    define PERL_UNUSED_ARG(x) NOTE(ARGUNUSED(x))
+#  else
+#    define PERL_UNUSED_ARG(x) ((void)x)
+#  endif
+#endif
+
+#ifndef PERL_UNUSED_VAR
+#  define PERL_UNUSED_VAR(x) ((void)x)
+#endif
+
+#ifndef PERL_UNUSED_CONTEXT
+#  ifdef USE_ITHREADS
+#    define PERL_UNUSED_CONTEXT PERL_UNUSED_ARG(my_perl)
+#  else
+#    define PERL_UNUSED_CONTEXT
+#  endif
+#endif
+#ifndef NOOP
+#  define NOOP                           /*EMPTY*/(void)0
+#endif
+
+#ifndef dNOOP
+#  define dNOOP                          extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
+#endif
+
+#ifndef NVTYPE
+#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE)
+#    define NVTYPE long double
+#  else
+#    define NVTYPE double
+#  endif
+typedef NVTYPE NV;
+#endif
+
+#ifndef INT2PTR
+
+#  if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
+#    define PTRV                  UV
+#    define INT2PTR(any,d)        (any)(d)
+#  else
+#    if PTRSIZE == LONGSIZE
+#      define PTRV                unsigned long
+#    else
+#      define PTRV                unsigned
+#    endif
+#    define INT2PTR(any,d)        (any)(PTRV)(d)
+#  endif
+
+#  define NUM2PTR(any,d)  (any)(PTRV)(d)
+#  define PTR2IV(p)       INT2PTR(IV,p)
+#  define PTR2UV(p)       INT2PTR(UV,p)
+#  define PTR2NV(p)       NUM2PTR(NV,p)
+
+#  if PTRSIZE == LONGSIZE
+#    define PTR2ul(p)     (unsigned long)(p)
+#  else
+#    define PTR2ul(p)     INT2PTR(unsigned long,p)
+#  endif
+
+#endif /* !INT2PTR */
+
+#undef START_EXTERN_C
+#undef END_EXTERN_C
+#undef EXTERN_C
+#ifdef __cplusplus
+#  define START_EXTERN_C extern "C" {
+#  define END_EXTERN_C }
+#  define EXTERN_C extern "C"
+#else
+#  define START_EXTERN_C
+#  define END_EXTERN_C
+#  define EXTERN_C extern
+#endif
+
+#if defined(PERL_GCC_PEDANTIC)
+#  ifndef PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#    define PERL_GCC_BRACE_GROUPS_FORBIDDEN
+#  endif
+#endif
+
+#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN) && !defined(__cplusplus)
+#  ifndef PERL_USE_GCC_BRACE_GROUPS
+#    define PERL_USE_GCC_BRACE_GROUPS
+#  endif
+#endif
+
+#undef STMT_START
+#undef STMT_END
+#ifdef PERL_USE_GCC_BRACE_GROUPS
+#  define STMT_START	(void)(	/* gcc supports ``({ STATEMENTS; })'' */
+#  define STMT_END	)
+#else
+#  if defined(VOIDFLAGS) && (VOIDFLAGS) && (defined(sun) || defined(__sun__)) && !defined(__GNUC__)
+#    define STMT_START	if (1)
+#    define STMT_END	else (void)0
+#  else
+#    define STMT_START	do
+#    define STMT_END	while (0)
+#  endif
+#endif
+#ifndef boolSV
+#  define boolSV(b)                      ((b) ? &PL_sv_yes : &PL_sv_no)
+#endif
+
+/* DEFSV appears first in 5.004_56 */
+#ifndef DEFSV
+#  define DEFSV                          GvSV(PL_defgv)
+#endif
+
+#ifndef SAVE_DEFSV
+#  define SAVE_DEFSV                     SAVESPTR(GvSV(PL_defgv))
+#endif
+
+/* Older perls (<=5.003) lack AvFILLp */
+#ifndef AvFILLp
+#  define AvFILLp                        AvFILL
+#endif
+#ifndef ERRSV
+#  define ERRSV                          get_sv("@",FALSE)
+#endif
+#ifndef newSVpvn
+#  define newSVpvn(data,len)             ((data)                                              \
+                                    ? ((len) ? newSVpv((data), (len)) : newSVpv("", 0)) \
+                                    : newSV(0))
+#endif
+
+/* Hint: gv_stashpvn
+ * This function's backport doesn't support the length parameter, but
+ * rather ignores it. Portability can only be ensured if the length
+ * parameter is used for speed reasons, but the length can always be
+ * correctly computed from the string argument.
+ */
+#ifndef gv_stashpvn
+#  define gv_stashpvn(str,len,create)    gv_stashpv(str,create)
+#endif
+
+/* Replace: 1 */
+#ifndef get_cv
+#  define get_cv                         perl_get_cv
+#endif
+
+#ifndef get_sv
+#  define get_sv                         perl_get_sv
+#endif
+
+#ifndef get_av
+#  define get_av                         perl_get_av
+#endif
+
+#ifndef get_hv
+#  define get_hv                         perl_get_hv
+#endif
+
+/* Replace: 0 */
+#ifndef dUNDERBAR
+#  define dUNDERBAR                      dNOOP
+#endif
+
+#ifndef UNDERBAR
+#  define UNDERBAR                       DEFSV
+#endif
+#ifndef dAX
+#  define dAX                            I32 ax = MARK - PL_stack_base + 1
+#endif
+
+#ifndef dITEMS
+#  define dITEMS                         I32 items = SP - MARK
+#endif
+#ifndef dXSTARG
+#  define dXSTARG                        SV * targ = sv_newmortal()
+#endif
+#ifndef dAXMARK
+#  define dAXMARK                        I32 ax = POPMARK; \
+                               register SV ** const mark = PL_stack_base + ax++
+#endif
+#ifndef XSprePUSH
+#  define XSprePUSH                      (sp = PL_stack_base + ax - 1)
+#endif
+
+#if ((PERL_VERSION < 5) || ((PERL_VERSION == 5) && (PERL_SUBVERSION < 0)))
+#  undef XSRETURN
+#  define XSRETURN(off)                                   \
+      STMT_START {                                        \
+          PL_stack_sp = PL_stack_base + ax + ((off) - 1); \
+          return;                                         \
+      } STMT_END
+#endif
+#ifndef PERL_ABS
+#  define PERL_ABS(x)                    ((x) < 0 ? -(x) : (x))
+#endif
+#ifndef dVAR
+#  define dVAR                           dNOOP
+#endif
+#ifndef SVf
+#  define SVf                            "_"
+#endif
+
+#ifndef PERL_SIGNALS_UNSAFE_FLAG
+
+#define PERL_SIGNALS_UNSAFE_FLAG 0x0001
+
+#if defined(NEED_PL_signals)
+static U32 DPPP_(my_PL_signals) = PERL_SIGNALS_UNSAFE_FLAG;
+#elif defined(NEED_PL_signals_GLOBAL)
+U32 DPPP_(my_PL_signals) = PERL_SIGNALS_UNSAFE_FLAG;
+#else
+extern U32 DPPP_(my_PL_signals);
+#endif
+#define PL_signals DPPP_(my_PL_signals)
+
+#endif
+#ifndef dTHR
+#  define dTHR                           dNOOP
+#endif
+#ifndef dTHX
+#  define dTHX                           dNOOP
+#endif
+
+#ifndef dTHXa
+#  define dTHXa(x)                       dNOOP
+#endif
+#ifndef pTHX
+#  define pTHX                           void
+#endif
+
+#ifndef pTHX_
+#  define pTHX_
+#endif
+
+#ifndef aTHX
+#  define aTHX
+#endif
+
+#ifndef aTHX_
+#  define aTHX_
+#endif
+#ifndef dTHXoa
+#  define dTHXoa(x)                      dTHXa(x)
+#endif
+#ifndef PUSHmortal
+#  define PUSHmortal                     PUSHs(sv_newmortal())
+#endif
+
+#ifndef mPUSHp
+#  define mPUSHp(p,l)                    sv_setpvn_mg(PUSHmortal, (p), (l))
+#endif
+
+#ifndef mPUSHn
+#  define mPUSHn(n)                      sv_setnv_mg(PUSHmortal, (NV)(n))
+#endif
+
+#ifndef mPUSHi
+#  define mPUSHi(i)                      sv_setiv_mg(PUSHmortal, (IV)(i))
+#endif
+
+#ifndef mPUSHu
+#  define mPUSHu(u)                      sv_setuv_mg(PUSHmortal, (UV)(u))
+#endif
+#ifndef XPUSHmortal
+#  define XPUSHmortal                    XPUSHs(sv_newmortal())
+#endif
+
+#ifndef mXPUSHp
+#  define mXPUSHp(p,l)                   STMT_START { EXTEND(sp,1); sv_setpvn_mg(PUSHmortal, (p), (l)); } STMT_END
+#endif
+
+#ifndef mXPUSHn
+#  define mXPUSHn(n)                     STMT_START { EXTEND(sp,1); sv_setnv_mg(PUSHmortal, (NV)(n)); } STMT_END
+#endif
+
+#ifndef mXPUSHi
+#  define mXPUSHi(i)                     STMT_START { EXTEND(sp,1); sv_setiv_mg(PUSHmortal, (IV)(i)); } STMT_END
+#endif
+
+#ifndef mXPUSHu
+#  define mXPUSHu(u)                     STMT_START { EXTEND(sp,1); sv_setuv_mg(PUSHmortal, (UV)(u)); } STMT_END
+#endif
+
+/* Replace: 1 */
+#ifndef call_sv
+#  define call_sv                        perl_call_sv
+#endif
+
+#ifndef call_pv
+#  define call_pv                        perl_call_pv
+#endif
+
+#ifndef call_argv
+#  define call_argv                      perl_call_argv
+#endif
+
+#ifndef call_method
+#  define call_method                    perl_call_method
+#endif
+#ifndef eval_sv
+#  define eval_sv                        perl_eval_sv
+#endif
+
+/* Replace: 0 */
+
+/* Replace perl_eval_pv with eval_pv */
+/* eval_pv depends on eval_sv */
+
+#ifndef eval_pv
+#if defined(NEED_eval_pv)
+static SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+static
+#else
+extern SV* DPPP_(my_eval_pv)(char *p, I32 croak_on_error);
+#endif
+
+#ifdef eval_pv
+#  undef eval_pv
+#endif
+#define eval_pv(a,b) DPPP_(my_eval_pv)(aTHX_ a,b)
+#define Perl_eval_pv DPPP_(my_eval_pv)
+
+#if defined(NEED_eval_pv) || defined(NEED_eval_pv_GLOBAL)
+
+SV*
+DPPP_(my_eval_pv)(char *p, I32 croak_on_error)
+{
+    dSP;
+    SV* sv = newSVpv(p, 0);
+
+    PUSHMARK(sp);
+    eval_sv(sv, G_SCALAR);
+    SvREFCNT_dec(sv);
+
+    SPAGAIN;
+    sv = POPs;
+    PUTBACK;
+
+    if (croak_on_error && SvTRUE(GvSV(errgv)))
+	croak(SvPVx(GvSV(errgv), na));
+
+    return sv;
+}
+
+#endif
+#endif
+#ifndef newRV_inc
+#  define newRV_inc(sv)                  newRV(sv)   /* Replace */
+#endif
+
+#ifndef newRV_noinc
+#if defined(NEED_newRV_noinc)
+static SV * DPPP_(my_newRV_noinc)(SV *sv);
+static
+#else
+extern SV * DPPP_(my_newRV_noinc)(SV *sv);
+#endif
+
+#ifdef newRV_noinc
+#  undef newRV_noinc
+#endif
+#define newRV_noinc(a) DPPP_(my_newRV_noinc)(aTHX_ a)
+#define Perl_newRV_noinc DPPP_(my_newRV_noinc)
+
+#if defined(NEED_newRV_noinc) || defined(NEED_newRV_noinc_GLOBAL)
+SV *
+DPPP_(my_newRV_noinc)(SV *sv)
+{
+  SV *rv = (SV *)newRV(sv);
+  SvREFCNT_dec(sv);
+  return rv;
+}
+#endif
+#endif
+
+/* Hint: newCONSTSUB
+ * Returns a CV* as of perl-5.7.1. This return value is not supported
+ * by Devel::PPPort.
+ */
+
+/* newCONSTSUB from IO.xs is in the core starting with 5.004_63 */
+#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 63))) && ((PERL_VERSION != 4) || (PERL_SUBVERSION != 5))
+#if defined(NEED_newCONSTSUB)
+static void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
+static
+#else
+extern void DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv);
+#endif
+
+#ifdef newCONSTSUB
+#  undef newCONSTSUB
+#endif
+#define newCONSTSUB(a,b,c) DPPP_(my_newCONSTSUB)(aTHX_ a,b,c)
+#define Perl_newCONSTSUB DPPP_(my_newCONSTSUB)
+
+#if defined(NEED_newCONSTSUB) || defined(NEED_newCONSTSUB_GLOBAL)
+
+void
+DPPP_(my_newCONSTSUB)(HV *stash, char *name, SV *sv)
+{
+	U32 oldhints = PL_hints;
+	HV *old_cop_stash = PL_curcop->cop_stash;
+	HV *old_curstash = PL_curstash;
+	line_t oldline = PL_curcop->cop_line;
+	PL_curcop->cop_line = PL_copline;
+
+	PL_hints &= ~HINT_BLOCK_SCOPE;
+	if (stash)
+		PL_curstash = PL_curcop->cop_stash = stash;
+
+	newSUB(
+
+#if   ((PERL_VERSION < 3) || ((PERL_VERSION == 3) && (PERL_SUBVERSION < 22)))
+		start_subparse(),
+#elif ((PERL_VERSION == 3) && (PERL_SUBVERSION == 22))
+     		start_subparse(0),
+#else  /* 5.003_23  onwards */
+     		start_subparse(FALSE, 0),
+#endif
+
+		newSVOP(OP_CONST, 0, newSVpv(name,0)),
+		newSVOP(OP_CONST, 0, &PL_sv_no),   /* SvPV(&PL_sv_no) == "" -- GMB */
+		newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))
+	);
+
+	PL_hints = oldhints;
+	PL_curcop->cop_stash = old_cop_stash;
+	PL_curstash = old_curstash;
+	PL_curcop->cop_line = oldline;
+}
+#endif
+#endif
+
+/*
+ * Boilerplate macros for initializing and accessing interpreter-local
+ * data from C.  All statics in extensions should be reworked to use
+ * this, if you want to make the extension thread-safe.  See ext/re/re.xs
+ * for an example of the use of these macros.
+ *
+ * Code that uses these macros is responsible for the following:
+ * 1. #define MY_CXT_KEY to a unique string, e.g. "DynaLoader_guts"
+ * 2. Declare a typedef named my_cxt_t that is a structure that contains
+ *    all the data that needs to be interpreter-local.
+ * 3. Use the START_MY_CXT macro after the declaration of my_cxt_t.
+ * 4. Use the MY_CXT_INIT macro such that it is called exactly once
+ *    (typically put in the BOOT: section).
+ * 5. Use the members of the my_cxt_t structure everywhere as
+ *    MY_CXT.member.
+ * 6. Use the dMY_CXT macro (a declaration) in all the functions that
+ *    access MY_CXT.
+ */
+
+#if defined(MULTIPLICITY) || defined(PERL_OBJECT) || \
+    defined(PERL_CAPI)    || defined(PERL_IMPLICIT_CONTEXT)
+
+#ifndef START_MY_CXT
+
+/* This must appear in all extensions that define a my_cxt_t structure,
+ * right after the definition (i.e. at file scope).  The non-threads
+ * case below uses it to declare the data as static. */
+#define START_MY_CXT
+
+#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 68)))
+/* Fetches the SV that keeps the per-interpreter data. */
+#define dMY_CXT_SV \
+	SV *my_cxt_sv = get_sv(MY_CXT_KEY, FALSE)
+#else /* >= perl5.004_68 */
+#define dMY_CXT_SV \
+	SV *my_cxt_sv = *hv_fetch(PL_modglobal, MY_CXT_KEY,		\
+				  sizeof(MY_CXT_KEY)-1, TRUE)
+#endif /* < perl5.004_68 */
+
+/* This declaration should be used within all functions that use the
+ * interpreter-local data. */
+#define dMY_CXT	\
+	dMY_CXT_SV;							\
+	my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*,SvUV(my_cxt_sv))
+
+/* Creates and zeroes the per-interpreter data.
+ * (We allocate my_cxtp in a Perl SV so that it will be released when
+ * the interpreter goes away.) */
+#define MY_CXT_INIT \
+	dMY_CXT_SV;							\
+	/* newSV() allocates one more than needed */			\
+	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+	Zero(my_cxtp, 1, my_cxt_t);					\
+	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+
+/* This macro must be used to access members of the my_cxt_t structure.
+ * e.g. MYCXT.some_data */
+#define MY_CXT		(*my_cxtp)
+
+/* Judicious use of these macros can reduce the number of times dMY_CXT
+ * is used.  Use is similar to pTHX, aTHX etc. */
+#define pMY_CXT		my_cxt_t *my_cxtp
+#define pMY_CXT_	pMY_CXT,
+#define _pMY_CXT	,pMY_CXT
+#define aMY_CXT		my_cxtp
+#define aMY_CXT_	aMY_CXT,
+#define _aMY_CXT	,aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+/* Clones the per-interpreter data. */
+#define MY_CXT_CLONE \
+	dMY_CXT_SV;							\
+	my_cxt_t *my_cxtp = (my_cxt_t*)SvPVX(newSV(sizeof(my_cxt_t)-1));\
+	Copy(INT2PTR(my_cxt_t*, SvUV(my_cxt_sv)), my_cxtp, 1, my_cxt_t);\
+	sv_setuv(my_cxt_sv, PTR2UV(my_cxtp))
+#endif
+
+#else /* single interpreter */
+
+#ifndef START_MY_CXT
+
+#define START_MY_CXT	static my_cxt_t my_cxt;
+#define dMY_CXT_SV	dNOOP
+#define dMY_CXT		dNOOP
+#define MY_CXT_INIT	NOOP
+#define MY_CXT		my_cxt
+
+#define pMY_CXT		void
+#define pMY_CXT_
+#define _pMY_CXT
+#define aMY_CXT
+#define aMY_CXT_
+#define _aMY_CXT
+
+#endif /* START_MY_CXT */
+
+#ifndef MY_CXT_CLONE
+#define MY_CXT_CLONE	NOOP
+#endif
+
+#endif
+
+#ifndef IVdf
+#  if IVSIZE == LONGSIZE
+#    define	IVdf      "ld"
+#    define	UVuf      "lu"
+#    define	UVof      "lo"
+#    define	UVxf      "lx"
+#    define	UVXf      "lX"
+#  else
+#    if IVSIZE == INTSIZE
+#      define	IVdf      "d"
+#      define	UVuf      "u"
+#      define	UVof      "o"
+#      define	UVxf      "x"
+#      define	UVXf      "X"
+#    endif
+#  endif
+#endif
+
+#ifndef NVef
+#  if defined(USE_LONG_DOUBLE) && defined(HAS_LONG_DOUBLE) && \
+      defined(PERL_PRIfldbl) /* Not very likely, but let's try anyway. */
+#    define NVef          PERL_PRIeldbl
+#    define NVff          PERL_PRIfldbl
+#    define NVgf          PERL_PRIgldbl
+#  else
+#    define NVef          "e"
+#    define NVff          "f"
+#    define NVgf          "g"
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc(sv)		\
+      ({				\
+          SV * const _sv = (SV*)(sv);	\
+          if (_sv)			\
+               (SvREFCNT(_sv))++;	\
+          _sv;				\
+      })
+#  else
+#    define SvREFCNT_inc(sv)	\
+          ((PL_Sv=(SV*)(sv)) ? (++(SvREFCNT(PL_Sv)),PL_Sv) : NULL)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_simple
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_simple(sv)	\
+      ({					\
+          if (sv)				\
+               (SvREFCNT(sv))++;		\
+          (SV *)(sv);				\
+      })
+#  else
+#    define SvREFCNT_inc_simple(sv) \
+          ((sv) ? (SvREFCNT(sv)++,(SV*)(sv)) : NULL)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_NN
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_NN(sv)		\
+      ({					\
+          SV * const _sv = (SV*)(sv);	\
+          SvREFCNT(_sv)++;		\
+          _sv;				\
+      })
+#  else
+#    define SvREFCNT_inc_NN(sv) \
+          (PL_Sv=(SV*)(sv),++(SvREFCNT(PL_Sv)),PL_Sv)
+#  endif
+#endif
+
+#ifndef SvREFCNT_inc_void
+#  ifdef PERL_USE_GCC_BRACE_GROUPS
+#    define SvREFCNT_inc_void(sv)		\
+      ({					\
+          SV * const _sv = (SV*)(sv);	\
+          if (_sv)			\
+              (void)(SvREFCNT(_sv)++);	\
+      })
+#  else
+#    define SvREFCNT_inc_void(sv) \
+          (void)((PL_Sv=(SV*)(sv)) ? ++(SvREFCNT(PL_Sv)) : 0)
+#  endif
+#endif
+#ifndef SvREFCNT_inc_simple_void
+#  define SvREFCNT_inc_simple_void(sv)   STMT_START { if (sv) SvREFCNT(sv)++; } STMT_END
+#endif
+
+#ifndef SvREFCNT_inc_simple_NN
+#  define SvREFCNT_inc_simple_NN(sv)     (++SvREFCNT(sv), (SV*)(sv))
+#endif
+
+#ifndef SvREFCNT_inc_void_NN
+#  define SvREFCNT_inc_void_NN(sv)       (void)(++SvREFCNT((SV*)(sv)))
+#endif
+
+#ifndef SvREFCNT_inc_simple_void_NN
+#  define SvREFCNT_inc_simple_void_NN(sv) (void)(++SvREFCNT((SV*)(sv)))
+#endif
+
+#ifndef SvPV_nolen
+
+#if defined(NEED_sv_2pv_nolen)
+static char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
+static
+#else
+extern char * DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv);
+#endif
+
+#ifdef sv_2pv_nolen
+#  undef sv_2pv_nolen
+#endif
+#define sv_2pv_nolen(a) DPPP_(my_sv_2pv_nolen)(aTHX_ a)
+#define Perl_sv_2pv_nolen DPPP_(my_sv_2pv_nolen)
+
+#if defined(NEED_sv_2pv_nolen) || defined(NEED_sv_2pv_nolen_GLOBAL)
+
+char *
+DPPP_(my_sv_2pv_nolen)(pTHX_ register SV *sv)
+{
+  STRLEN n_a;
+  return sv_2pv(sv, &n_a);
+}
+
+#endif
+
+/* Hint: sv_2pv_nolen
+ * Use the SvPV_nolen() macro instead of sv_2pv_nolen().
+ */
+
+/* SvPV_nolen depends on sv_2pv_nolen */
+#define SvPV_nolen(sv) \
+          ((SvFLAGS(sv) & (SVf_POK)) == SVf_POK \
+           ? SvPVX(sv) : sv_2pv_nolen(sv))
+
+#endif
+
+#ifdef SvPVbyte
+
+/* Hint: SvPVbyte
+ * Does not work in perl-5.6.1, ppport.h implements a version
+ * borrowed from perl-5.7.3.
+ */
+
+#if ((PERL_VERSION < 7) || ((PERL_VERSION == 7) && (PERL_SUBVERSION < 0)))
+
+#if defined(NEED_sv_2pvbyte)
+static char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
+static
+#else
+extern char * DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp);
+#endif
+
+#ifdef sv_2pvbyte
+#  undef sv_2pvbyte
+#endif
+#define sv_2pvbyte(a,b) DPPP_(my_sv_2pvbyte)(aTHX_ a,b)
+#define Perl_sv_2pvbyte DPPP_(my_sv_2pvbyte)
+
+#if defined(NEED_sv_2pvbyte) || defined(NEED_sv_2pvbyte_GLOBAL)
+
+char *
+DPPP_(my_sv_2pvbyte)(pTHX_ register SV *sv, STRLEN *lp)
+{
+  sv_utf8_downgrade(sv,0);
+  return SvPV(sv,*lp);
+}
+
+#endif
+
+/* Hint: sv_2pvbyte
+ * Use the SvPVbyte() macro instead of sv_2pvbyte().
+ */
+
+#undef SvPVbyte
+
+/* SvPVbyte depends on sv_2pvbyte */
+#define SvPVbyte(sv, lp)                                                \
+        ((SvFLAGS(sv) & (SVf_POK|SVf_UTF8)) == (SVf_POK)                \
+         ? ((lp = SvCUR(sv)), SvPVX(sv)) : sv_2pvbyte(sv, &lp))
+
+#endif
+
+#else
+
+#  define SvPVbyte          SvPV
+#  define sv_2pvbyte        sv_2pv
+
+#endif
+
+/* sv_2pvbyte_nolen depends on sv_2pv_nolen */
+#ifndef sv_2pvbyte_nolen
+#  define sv_2pvbyte_nolen               sv_2pv_nolen
+#endif
+
+/* Hint: sv_pvn
+ * Always use the SvPV() macro instead of sv_pvn().
+ */
+#ifndef sv_pvn
+#  define sv_pvn(sv, len)                SvPV(sv, len)
+#endif
+
+/* Hint: sv_pvn_force
+ * Always use the SvPV_force() macro instead of sv_pvn_force().
+ */
+#ifndef sv_pvn_force
+#  define sv_pvn_force(sv, len)          SvPV_force(sv, len)
+#endif
+#ifndef SvMAGIC_set
+#  define SvMAGIC_set(sv, val)           \
+                STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+                (((XPVMG*) SvANY(sv))->xmg_magic = (val)); } STMT_END
+#endif
+
+#if ((PERL_VERSION < 9) || ((PERL_VERSION == 9) && (PERL_SUBVERSION < 3)))
+#ifndef SvPVX_const
+#  define SvPVX_const(sv)                ((const char*) (0 + SvPVX(sv)))
+#endif
+
+#ifndef SvPVX_mutable
+#  define SvPVX_mutable(sv)              (0 + SvPVX(sv))
+#endif
+#ifndef SvRV_set
+#  define SvRV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) >=  SVt_RV); \
+                (((XRV*) SvANY(sv))->xrv_rv = (val)); } STMT_END
+#endif
+
+#else
+#ifndef SvPVX_const
+#  define SvPVX_const(sv)                ((const char*)((sv)->sv_u.svu_pv))
+#endif
+
+#ifndef SvPVX_mutable
+#  define SvPVX_mutable(sv)              ((sv)->sv_u.svu_pv)
+#endif
+#ifndef SvRV_set
+#  define SvRV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) >=  SVt_RV); \
+                ((sv)->sv_u.svu_rv = (val)); } STMT_END
+#endif
+
+#endif
+#ifndef SvSTASH_set
+#  define SvSTASH_set(sv, val)           \
+                STMT_START { assert(SvTYPE(sv) >= SVt_PVMG); \
+                (((XPVMG*) SvANY(sv))->xmg_stash = (val)); } STMT_END
+#endif
+
+#if ((PERL_VERSION < 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION < 0)))
+#ifndef SvUV_set
+#  define SvUV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+                (((XPVIV*) SvANY(sv))->xiv_iv = (IV) (val)); } STMT_END
+#endif
+
+#else
+#ifndef SvUV_set
+#  define SvUV_set(sv, val)              \
+                STMT_START { assert(SvTYPE(sv) == SVt_IV || SvTYPE(sv) >= SVt_PVIV); \
+                (((XPVUV*) SvANY(sv))->xuv_uv = (val)); } STMT_END
+#endif
+
+#endif
+
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(vnewSVpvf)
+#if defined(NEED_vnewSVpvf)
+static SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
+static
+#else
+extern SV * DPPP_(my_vnewSVpvf)(pTHX_ const char * pat, va_list * args);
+#endif
+
+#ifdef vnewSVpvf
+#  undef vnewSVpvf
+#endif
+#define vnewSVpvf(a,b) DPPP_(my_vnewSVpvf)(aTHX_ a,b)
+#define Perl_vnewSVpvf DPPP_(my_vnewSVpvf)
+
+#if defined(NEED_vnewSVpvf) || defined(NEED_vnewSVpvf_GLOBAL)
+
+SV *
+DPPP_(my_vnewSVpvf)(pTHX_ const char *pat, va_list *args)
+{
+  register SV *sv = newSV(0);
+  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));
+  return sv;
+}
+
+#endif
+#endif
+
+/* sv_vcatpvf depends on sv_vcatpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf)
+#  define sv_vcatpvf(sv, pat, args)  sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+/* sv_vsetpvf depends on sv_vsetpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf)
+#  define sv_vsetpvf(sv, pat, args)  sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*))
+#endif
+
+/* sv_catpvf_mg depends on sv_vcatpvfn, sv_catpvf_mg_nocontext */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg)
+#if defined(NEED_sv_catpvf_mg)
+static void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+#endif
+
+#define Perl_sv_catpvf_mg DPPP_(my_sv_catpvf_mg)
+
+#if defined(NEED_sv_catpvf_mg) || defined(NEED_sv_catpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+  va_list args;
+  va_start(args, pat);
+  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+
+/* sv_catpvf_mg_nocontext depends on sv_vcatpvfn */
+#ifdef PERL_IMPLICIT_CONTEXT
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_catpvf_mg_nocontext)
+#if defined(NEED_sv_catpvf_mg_nocontext)
+static void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_catpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+#endif
+
+#define sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+#define Perl_sv_catpvf_mg_nocontext DPPP_(my_sv_catpvf_mg_nocontext)
+
+#if defined(NEED_sv_catpvf_mg_nocontext) || defined(NEED_sv_catpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_catpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+  dTHX;
+  va_list args;
+  va_start(args, pat);
+  sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+#ifndef sv_catpvf_mg
+#  ifdef PERL_IMPLICIT_CONTEXT
+#    define sv_catpvf_mg   Perl_sv_catpvf_mg_nocontext
+#  else
+#    define sv_catpvf_mg   Perl_sv_catpvf_mg
+#  endif
+#endif
+
+/* sv_vcatpvf_mg depends on sv_vcatpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vcatpvf_mg)
+#  define sv_vcatpvf_mg(sv, pat, args)                                     \
+   STMT_START {                                                            \
+     sv_vcatpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
+     SvSETMAGIC(sv);                                                       \
+   } STMT_END
+#endif
+
+/* sv_setpvf_mg depends on sv_vsetpvfn, sv_setpvf_mg_nocontext */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg)
+#if defined(NEED_sv_setpvf_mg)
+static void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg)(pTHX_ SV * sv, const char * pat, ...);
+#endif
+
+#define Perl_sv_setpvf_mg DPPP_(my_sv_setpvf_mg)
+
+#if defined(NEED_sv_setpvf_mg) || defined(NEED_sv_setpvf_mg_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg)(pTHX_ SV *sv, const char *pat, ...)
+{
+  va_list args;
+  va_start(args, pat);
+  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+
+/* sv_setpvf_mg_nocontext depends on sv_vsetpvfn */
+#ifdef PERL_IMPLICIT_CONTEXT
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_setpvf_mg_nocontext)
+#if defined(NEED_sv_setpvf_mg_nocontext)
+static void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+static
+#else
+extern void DPPP_(my_sv_setpvf_mg_nocontext)(SV * sv, const char * pat, ...);
+#endif
+
+#define sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+#define Perl_sv_setpvf_mg_nocontext DPPP_(my_sv_setpvf_mg_nocontext)
+
+#if defined(NEED_sv_setpvf_mg_nocontext) || defined(NEED_sv_setpvf_mg_nocontext_GLOBAL)
+
+void
+DPPP_(my_sv_setpvf_mg_nocontext)(SV *sv, const char *pat, ...)
+{
+  dTHX;
+  va_list args;
+  va_start(args, pat);
+  sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
+  SvSETMAGIC(sv);
+  va_end(args);
+}
+
+#endif
+#endif
+#endif
+
+#ifndef sv_setpvf_mg
+#  ifdef PERL_IMPLICIT_CONTEXT
+#    define sv_setpvf_mg   Perl_sv_setpvf_mg_nocontext
+#  else
+#    define sv_setpvf_mg   Perl_sv_setpvf_mg
+#  endif
+#endif
+
+/* sv_vsetpvf_mg depends on sv_vsetpvfn */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(sv_vsetpvf_mg)
+#  define sv_vsetpvf_mg(sv, pat, args)                                     \
+   STMT_START {                                                            \
+     sv_vsetpvfn(sv, pat, strlen(pat), args, Null(SV**), 0, Null(bool*));  \
+     SvSETMAGIC(sv);                                                       \
+   } STMT_END
+#endif
+#ifndef WARN_ALL
+#  define WARN_ALL                       0
+#endif
+
+#ifndef WARN_CLOSURE
+#  define WARN_CLOSURE                   1
+#endif
+
+#ifndef WARN_DEPRECATED
+#  define WARN_DEPRECATED                2
+#endif
+
+#ifndef WARN_EXITING
+#  define WARN_EXITING                   3
+#endif
+
+#ifndef WARN_GLOB
+#  define WARN_GLOB                      4
+#endif
+
+#ifndef WARN_IO
+#  define WARN_IO                        5
+#endif
+
+#ifndef WARN_CLOSED
+#  define WARN_CLOSED                    6
+#endif
+
+#ifndef WARN_EXEC
+#  define WARN_EXEC                      7
+#endif
+
+#ifndef WARN_LAYER
+#  define WARN_LAYER                     8
+#endif
+
+#ifndef WARN_NEWLINE
+#  define WARN_NEWLINE                   9
+#endif
+
+#ifndef WARN_PIPE
+#  define WARN_PIPE                      10
+#endif
+
+#ifndef WARN_UNOPENED
+#  define WARN_UNOPENED                  11
+#endif
+
+#ifndef WARN_MISC
+#  define WARN_MISC                      12
+#endif
+
+#ifndef WARN_NUMERIC
+#  define WARN_NUMERIC                   13
+#endif
+
+#ifndef WARN_ONCE
+#  define WARN_ONCE                      14
+#endif
+
+#ifndef WARN_OVERFLOW
+#  define WARN_OVERFLOW                  15
+#endif
+
+#ifndef WARN_PACK
+#  define WARN_PACK                      16
+#endif
+
+#ifndef WARN_PORTABLE
+#  define WARN_PORTABLE                  17
+#endif
+
+#ifndef WARN_RECURSION
+#  define WARN_RECURSION                 18
+#endif
+
+#ifndef WARN_REDEFINE
+#  define WARN_REDEFINE                  19
+#endif
+
+#ifndef WARN_REGEXP
+#  define WARN_REGEXP                    20
+#endif
+
+#ifndef WARN_SEVERE
+#  define WARN_SEVERE                    21
+#endif
+
+#ifndef WARN_DEBUGGING
+#  define WARN_DEBUGGING                 22
+#endif
+
+#ifndef WARN_INPLACE
+#  define WARN_INPLACE                   23
+#endif
+
+#ifndef WARN_INTERNAL
+#  define WARN_INTERNAL                  24
+#endif
+
+#ifndef WARN_MALLOC
+#  define WARN_MALLOC                    25
+#endif
+
+#ifndef WARN_SIGNAL
+#  define WARN_SIGNAL                    26
+#endif
+
+#ifndef WARN_SUBSTR
+#  define WARN_SUBSTR                    27
+#endif
+
+#ifndef WARN_SYNTAX
+#  define WARN_SYNTAX                    28
+#endif
+
+#ifndef WARN_AMBIGUOUS
+#  define WARN_AMBIGUOUS                 29
+#endif
+
+#ifndef WARN_BAREWORD
+#  define WARN_BAREWORD                  30
+#endif
+
+#ifndef WARN_DIGIT
+#  define WARN_DIGIT                     31
+#endif
+
+#ifndef WARN_PARENTHESIS
+#  define WARN_PARENTHESIS               32
+#endif
+
+#ifndef WARN_PRECEDENCE
+#  define WARN_PRECEDENCE                33
+#endif
+
+#ifndef WARN_PRINTF
+#  define WARN_PRINTF                    34
+#endif
+
+#ifndef WARN_PROTOTYPE
+#  define WARN_PROTOTYPE                 35
+#endif
+
+#ifndef WARN_QW
+#  define WARN_QW                        36
+#endif
+
+#ifndef WARN_RESERVED
+#  define WARN_RESERVED                  37
+#endif
+
+#ifndef WARN_SEMICOLON
+#  define WARN_SEMICOLON                 38
+#endif
+
+#ifndef WARN_TAINT
+#  define WARN_TAINT                     39
+#endif
+
+#ifndef WARN_THREADS
+#  define WARN_THREADS                   40
+#endif
+
+#ifndef WARN_UNINITIALIZED
+#  define WARN_UNINITIALIZED             41
+#endif
+
+#ifndef WARN_UNPACK
+#  define WARN_UNPACK                    42
+#endif
+
+#ifndef WARN_UNTIE
+#  define WARN_UNTIE                     43
+#endif
+
+#ifndef WARN_UTF8
+#  define WARN_UTF8                      44
+#endif
+
+#ifndef WARN_VOID
+#  define WARN_VOID                      45
+#endif
+
+#ifndef WARN_ASSERTIONS
+#  define WARN_ASSERTIONS                46
+#endif
+#ifndef packWARN
+#  define packWARN(a)                    (a)
+#endif
+
+#ifndef ckWARN
+#  ifdef G_WARN_ON
+#    define  ckWARN(a)                  (PL_dowarn & G_WARN_ON)
+#  else
+#    define  ckWARN(a)                  PL_dowarn
+#  endif
+#endif
+
+/* warner depends on vnewSVpvf */
+#if ((PERL_VERSION > 4) || ((PERL_VERSION == 4) && (PERL_SUBVERSION >= 0))) && !defined(warner)
+#if defined(NEED_warner)
+static void DPPP_(my_warner)(U32 err, const char *pat, ...);
+static
+#else
+extern void DPPP_(my_warner)(U32 err, const char *pat, ...);
+#endif
+
+#define Perl_warner DPPP_(my_warner)
+
+#if defined(NEED_warner) || defined(NEED_warner_GLOBAL)
+
+void
+DPPP_(my_warner)(U32 err, const char *pat, ...)
+{
+  SV *sv;
+  va_list args;
+
+  PERL_UNUSED_ARG(err);
+
+  va_start(args, pat);
+  sv = vnewSVpvf(pat, &args);
+  va_end(args);
+  sv_2mortal(sv);
+  warn("%s", SvPV_nolen(sv));
+}
+
+#define warner  Perl_warner
+
+/* Perl_warner_nocontext depends on warner */
+#define Perl_warner_nocontext  Perl_warner
+
+#endif
+#endif
+
+/* concatenating with "" ensures that only literal strings are accepted as argument
+ * note that STR_WITH_LEN() can't be used as argument to macros or functions that
+ * under some configurations might be macros
+ */
+#ifndef STR_WITH_LEN
+#  define STR_WITH_LEN(s)                (s ""), (sizeof(s)-1)
+#endif
+#ifndef newSVpvs
+#  define newSVpvs(str)                  newSVpvn(str "", sizeof(str) - 1)
+#endif
+
+#ifndef sv_catpvs
+#  define sv_catpvs(sv, str)             sv_catpvn(sv, str "", sizeof(str) - 1)
+#endif
+
+#ifndef sv_setpvs
+#  define sv_setpvs(sv, str)             sv_setpvn(sv, str "", sizeof(str) - 1)
+#endif
+
+#ifndef hv_fetchs
+#  define hv_fetchs(hv, key, lval)       hv_fetch(hv, key "", sizeof(key) - 1, lval)
+#endif
+
+#ifndef hv_stores
+#  define hv_stores(hv, key, val)        hv_store(hv, key "", sizeof(key) - 1, val, 0)
+#endif
+#ifndef SvGETMAGIC
+#  define SvGETMAGIC(x)                  STMT_START { if (SvGMAGICAL(x)) mg_get(x); } STMT_END
+#endif
+#ifndef PERL_MAGIC_sv
+#  define PERL_MAGIC_sv                  '\0'
+#endif
+
+#ifndef PERL_MAGIC_overload
+#  define PERL_MAGIC_overload            'A'
+#endif
+
+#ifndef PERL_MAGIC_overload_elem
+#  define PERL_MAGIC_overload_elem       'a'
+#endif
+
+#ifndef PERL_MAGIC_overload_table
+#  define PERL_MAGIC_overload_table      'c'
+#endif
+
+#ifndef PERL_MAGIC_bm
+#  define PERL_MAGIC_bm                  'B'
+#endif
+
+#ifndef PERL_MAGIC_regdata
+#  define PERL_MAGIC_regdata             'D'
+#endif
+
+#ifndef PERL_MAGIC_regdatum
+#  define PERL_MAGIC_regdatum            'd'
+#endif
+
+#ifndef PERL_MAGIC_env
+#  define PERL_MAGIC_env                 'E'
+#endif
+
+#ifndef PERL_MAGIC_envelem
+#  define PERL_MAGIC_envelem             'e'
+#endif
+
+#ifndef PERL_MAGIC_fm
+#  define PERL_MAGIC_fm                  'f'
+#endif
+
+#ifndef PERL_MAGIC_regex_global
+#  define PERL_MAGIC_regex_global        'g'
+#endif
+
+#ifndef PERL_MAGIC_isa
+#  define PERL_MAGIC_isa                 'I'
+#endif
+
+#ifndef PERL_MAGIC_isaelem
+#  define PERL_MAGIC_isaelem             'i'
+#endif
+
+#ifndef PERL_MAGIC_nkeys
+#  define PERL_MAGIC_nkeys               'k'
+#endif
+
+#ifndef PERL_MAGIC_dbfile
+#  define PERL_MAGIC_dbfile              'L'
+#endif
+
+#ifndef PERL_MAGIC_dbline
+#  define PERL_MAGIC_dbline              'l'
+#endif
+
+#ifndef PERL_MAGIC_mutex
+#  define PERL_MAGIC_mutex               'm'
+#endif
+
+#ifndef PERL_MAGIC_shared
+#  define PERL_MAGIC_shared              'N'
+#endif
+
+#ifndef PERL_MAGIC_shared_scalar
+#  define PERL_MAGIC_shared_scalar       'n'
+#endif
+
+#ifndef PERL_MAGIC_collxfrm
+#  define PERL_MAGIC_collxfrm            'o'
+#endif
+
+#ifndef PERL_MAGIC_tied
+#  define PERL_MAGIC_tied                'P'
+#endif
+
+#ifndef PERL_MAGIC_tiedelem
+#  define PERL_MAGIC_tiedelem            'p'
+#endif
+
+#ifndef PERL_MAGIC_tiedscalar
+#  define PERL_MAGIC_tiedscalar          'q'
+#endif
+
+#ifndef PERL_MAGIC_qr
+#  define PERL_MAGIC_qr                  'r'
+#endif
+
+#ifndef PERL_MAGIC_sig
+#  define PERL_MAGIC_sig                 'S'
+#endif
+
+#ifndef PERL_MAGIC_sigelem
+#  define PERL_MAGIC_sigelem             's'
+#endif
+
+#ifndef PERL_MAGIC_taint
+#  define PERL_MAGIC_taint               't'
+#endif
+
+#ifndef PERL_MAGIC_uvar
+#  define PERL_MAGIC_uvar                'U'
+#endif
+
+#ifndef PERL_MAGIC_uvar_elem
+#  define PERL_MAGIC_uvar_elem           'u'
+#endif
+
+#ifndef PERL_MAGIC_vstring
+#  define PERL_MAGIC_vstring             'V'
+#endif
+
+#ifndef PERL_MAGIC_vec
+#  define PERL_MAGIC_vec                 'v'
+#endif
+
+#ifndef PERL_MAGIC_utf8
+#  define PERL_MAGIC_utf8                'w'
+#endif
+
+#ifndef PERL_MAGIC_substr
+#  define PERL_MAGIC_substr              'x'
+#endif
+
+#ifndef PERL_MAGIC_defelem
+#  define PERL_MAGIC_defelem             'y'
+#endif
+
+#ifndef PERL_MAGIC_glob
+#  define PERL_MAGIC_glob                '*'
+#endif
+
+#ifndef PERL_MAGIC_arylen
+#  define PERL_MAGIC_arylen              '#'
+#endif
+
+#ifndef PERL_MAGIC_pos
+#  define PERL_MAGIC_pos                 '.'
+#endif
+
+#ifndef PERL_MAGIC_backref
+#  define PERL_MAGIC_backref             '<'
+#endif
+
+#ifndef PERL_MAGIC_ext
+#  define PERL_MAGIC_ext                 '~'
+#endif
+
+/* That's the best we can do... */
+#ifndef SvPV_force_nomg
+#  define SvPV_force_nomg                SvPV_force
+#endif
+
+#ifndef SvPV_nomg
+#  define SvPV_nomg                      SvPV
+#endif
+
+#ifndef sv_catpvn_nomg
+#  define sv_catpvn_nomg                 sv_catpvn
+#endif
+
+#ifndef sv_catsv_nomg
+#  define sv_catsv_nomg                  sv_catsv
+#endif
+
+#ifndef sv_setsv_nomg
+#  define sv_setsv_nomg                  sv_setsv
+#endif
+
+#ifndef sv_pvn_nomg
+#  define sv_pvn_nomg                    sv_pvn
+#endif
+
+#ifndef SvIV_nomg
+#  define SvIV_nomg                      SvIV
+#endif
+
+#ifndef SvUV_nomg
+#  define SvUV_nomg                      SvUV
+#endif
+
+#ifndef sv_catpv_mg
+#  define sv_catpv_mg(sv, ptr)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_catpv(TeMpSv,ptr);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_catpvn_mg
+#  define sv_catpvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_catpvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_catsv_mg
+#  define sv_catsv_mg(dsv, ssv)         \
+   STMT_START {                         \
+     SV *TeMpSv = dsv;                  \
+     sv_catsv(TeMpSv,ssv);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setiv_mg
+#  define sv_setiv_mg(sv, i)            \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setiv(TeMpSv,i);                \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setnv_mg
+#  define sv_setnv_mg(sv, num)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setnv(TeMpSv,num);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setpv_mg
+#  define sv_setpv_mg(sv, ptr)          \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setpv(TeMpSv,ptr);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setpvn_mg
+#  define sv_setpvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setpvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setsv_mg
+#  define sv_setsv_mg(dsv, ssv)         \
+   STMT_START {                         \
+     SV *TeMpSv = dsv;                  \
+     sv_setsv(TeMpSv,ssv);              \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_setuv_mg
+#  define sv_setuv_mg(sv, i)            \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_setuv(TeMpSv,i);                \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+
+#ifndef sv_usepvn_mg
+#  define sv_usepvn_mg(sv, ptr, len)    \
+   STMT_START {                         \
+     SV *TeMpSv = sv;                   \
+     sv_usepvn(TeMpSv,ptr,len);         \
+     SvSETMAGIC(TeMpSv);                \
+   } STMT_END
+#endif
+#ifndef SvVSTRING_mg
+#  define SvVSTRING_mg(sv)               (SvMAGICAL(sv) ? mg_find(sv, PERL_MAGIC_vstring) : NULL)
+#endif
+
+#ifdef USE_ITHREADS
+#ifndef CopFILE
+#  define CopFILE(c)                     ((c)->cop_file)
+#endif
+
+#ifndef CopFILEGV
+#  define CopFILEGV(c)                   (CopFILE(c) ? gv_fetchfile(CopFILE(c)) : Nullgv)
+#endif
+
+#ifndef CopFILE_set
+#  define CopFILE_set(c,pv)              ((c)->cop_file = savepv(pv))
+#endif
+
+#ifndef CopFILESV
+#  define CopFILESV(c)                   (CopFILE(c) ? GvSV(gv_fetchfile(CopFILE(c))) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+#  define CopFILEAV(c)                   (CopFILE(c) ? GvAV(gv_fetchfile(CopFILE(c))) : Nullav)
+#endif
+
+#ifndef CopSTASHPV
+#  define CopSTASHPV(c)                  ((c)->cop_stashpv)
+#endif
+
+#ifndef CopSTASHPV_set
+#  define CopSTASHPV_set(c,pv)           ((c)->cop_stashpv = ((pv) ? savepv(pv) : Nullch))
+#endif
+
+#ifndef CopSTASH
+#  define CopSTASH(c)                    (CopSTASHPV(c) ? gv_stashpv(CopSTASHPV(c),GV_ADD) : Nullhv)
+#endif
+
+#ifndef CopSTASH_set
+#  define CopSTASH_set(c,hv)             CopSTASHPV_set(c, (hv) ? HvNAME(hv) : Nullch)
+#endif
+
+#ifndef CopSTASH_eq
+#  define CopSTASH_eq(c,hv)              ((hv) && (CopSTASHPV(c) == HvNAME(hv) \
+					|| (CopSTASHPV(c) && HvNAME(hv) \
+					&& strEQ(CopSTASHPV(c), HvNAME(hv)))))
+#endif
+
+#else
+#ifndef CopFILEGV
+#  define CopFILEGV(c)                   ((c)->cop_filegv)
+#endif
+
+#ifndef CopFILEGV_set
+#  define CopFILEGV_set(c,gv)            ((c)->cop_filegv = (GV*)SvREFCNT_inc(gv))
+#endif
+
+#ifndef CopFILE_set
+#  define CopFILE_set(c,pv)              CopFILEGV_set((c), gv_fetchfile(pv))
+#endif
+
+#ifndef CopFILESV
+#  define CopFILESV(c)                   (CopFILEGV(c) ? GvSV(CopFILEGV(c)) : Nullsv)
+#endif
+
+#ifndef CopFILEAV
+#  define CopFILEAV(c)                   (CopFILEGV(c) ? GvAV(CopFILEGV(c)) : Nullav)
+#endif
+
+#ifndef CopFILE
+#  define CopFILE(c)                     (CopFILESV(c) ? SvPVX(CopFILESV(c)) : Nullch)
+#endif
+
+#ifndef CopSTASH
+#  define CopSTASH(c)                    ((c)->cop_stash)
+#endif
+
+#ifndef CopSTASH_set
+#  define CopSTASH_set(c,hv)             ((c)->cop_stash = (hv))
+#endif
+
+#ifndef CopSTASHPV
+#  define CopSTASHPV(c)                  (CopSTASH(c) ? HvNAME(CopSTASH(c)) : Nullch)
+#endif
+
+#ifndef CopSTASHPV_set
+#  define CopSTASHPV_set(c,pv)           CopSTASH_set((c), gv_stashpv(pv,GV_ADD))
+#endif
+
+#ifndef CopSTASH_eq
+#  define CopSTASH_eq(c,hv)              (CopSTASH(c) == (hv))
+#endif
+
+#endif /* USE_ITHREADS */
+#ifndef IN_PERL_COMPILETIME
+#  define IN_PERL_COMPILETIME            (PL_curcop == &PL_compiling)
+#endif
+
+#ifndef IN_LOCALE_RUNTIME
+#  define IN_LOCALE_RUNTIME              (PL_curcop->op_private & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE_COMPILETIME
+#  define IN_LOCALE_COMPILETIME          (PL_hints & HINT_LOCALE)
+#endif
+
+#ifndef IN_LOCALE
+#  define IN_LOCALE                      (IN_PERL_COMPILETIME ? IN_LOCALE_COMPILETIME : IN_LOCALE_RUNTIME)
+#endif
+#ifndef IS_NUMBER_IN_UV
+#  define IS_NUMBER_IN_UV                0x01
+#endif
+
+#ifndef IS_NUMBER_GREATER_THAN_UV_MAX
+#  define IS_NUMBER_GREATER_THAN_UV_MAX  0x02
+#endif
+
+#ifndef IS_NUMBER_NOT_INT
+#  define IS_NUMBER_NOT_INT              0x04
+#endif
+
+#ifndef IS_NUMBER_NEG
+#  define IS_NUMBER_NEG                  0x08
+#endif
+
+#ifndef IS_NUMBER_INFINITY
+#  define IS_NUMBER_INFINITY             0x10
+#endif
+
+#ifndef IS_NUMBER_NAN
+#  define IS_NUMBER_NAN                  0x20
+#endif
+
+/* GROK_NUMERIC_RADIX depends on grok_numeric_radix */
+#ifndef GROK_NUMERIC_RADIX
+#  define GROK_NUMERIC_RADIX(sp, send)   grok_numeric_radix(sp, send)
+#endif
+#ifndef PERL_SCAN_GREATER_THAN_UV_MAX
+#  define PERL_SCAN_GREATER_THAN_UV_MAX  0x02
+#endif
+
+#ifndef PERL_SCAN_SILENT_ILLDIGIT
+#  define PERL_SCAN_SILENT_ILLDIGIT      0x04
+#endif
+
+#ifndef PERL_SCAN_ALLOW_UNDERSCORES
+#  define PERL_SCAN_ALLOW_UNDERSCORES    0x01
+#endif
+
+#ifndef PERL_SCAN_DISALLOW_PREFIX
+#  define PERL_SCAN_DISALLOW_PREFIX      0x02
+#endif
+
+#ifndef grok_numeric_radix
+#if defined(NEED_grok_numeric_radix)
+static bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+static
+#else
+extern bool DPPP_(my_grok_numeric_radix)(pTHX_ const char ** sp, const char * send);
+#endif
+
+#ifdef grok_numeric_radix
+#  undef grok_numeric_radix
+#endif
+#define grok_numeric_radix(a,b) DPPP_(my_grok_numeric_radix)(aTHX_ a,b)
+#define Perl_grok_numeric_radix DPPP_(my_grok_numeric_radix)
+
+#if defined(NEED_grok_numeric_radix) || defined(NEED_grok_numeric_radix_GLOBAL)
+bool
+DPPP_(my_grok_numeric_radix)(pTHX_ const char **sp, const char *send)
+{
+#ifdef USE_LOCALE_NUMERIC
+#ifdef PL_numeric_radix_sv
+    if (PL_numeric_radix_sv && IN_LOCALE) {
+        STRLEN len;
+        char* radix = SvPV(PL_numeric_radix_sv, len);
+        if (*sp + len <= send && memEQ(*sp, radix, len)) {
+            *sp += len;
+            return TRUE;
+        }
+    }
+#else
+    /* older perls don't have PL_numeric_radix_sv so the radix
+     * must manually be requested from locale.h
+     */
+#include <locale.h>
+    dTHR;  /* needed for older threaded perls */
+    struct lconv *lc = localeconv();
+    char *radix = lc->decimal_point;
+    if (radix && IN_LOCALE) {
+        STRLEN len = strlen(radix);
+        if (*sp + len <= send && memEQ(*sp, radix, len)) {
+            *sp += len;
+            return TRUE;
+        }
+    }
+#endif
+#endif /* USE_LOCALE_NUMERIC */
+    /* always try "." if numeric radix didn't match because
+     * we may have data from different locales mixed */
+    if (*sp < send && **sp == '.') {
+        ++*sp;
+        return TRUE;
+    }
+    return FALSE;
+}
+#endif
+#endif
+
+/* grok_number depends on grok_numeric_radix */
+
+#ifndef grok_number
+#if defined(NEED_grok_number)
+static int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+static
+#else
+extern int DPPP_(my_grok_number)(pTHX_ const char * pv, STRLEN len, UV * valuep);
+#endif
+
+#ifdef grok_number
+#  undef grok_number
+#endif
+#define grok_number(a,b,c) DPPP_(my_grok_number)(aTHX_ a,b,c)
+#define Perl_grok_number DPPP_(my_grok_number)
+
+#if defined(NEED_grok_number) || defined(NEED_grok_number_GLOBAL)
+int
+DPPP_(my_grok_number)(pTHX_ const char *pv, STRLEN len, UV *valuep)
+{
+  const char *s = pv;
+  const char *send = pv + len;
+  const UV max_div_10 = UV_MAX / 10;
+  const char max_mod_10 = UV_MAX % 10;
+  int numtype = 0;
+  int sawinf = 0;
+  int sawnan = 0;
+
+  while (s < send && isSPACE(*s))
+    s++;
+  if (s == send) {
+    return 0;
+  } else if (*s == '-') {
+    s++;
+    numtype = IS_NUMBER_NEG;
+  }
+  else if (*s == '+')
+  s++;
+
+  if (s == send)
+    return 0;
+
+  /* next must be digit or the radix separator or beginning of infinity */
+  if (isDIGIT(*s)) {
+    /* UVs are at least 32 bits, so the first 9 decimal digits cannot
+       overflow.  */
+    UV value = *s - '0';
+    /* This construction seems to be more optimiser friendly.
+       (without it gcc does the isDIGIT test and the *s - '0' separately)
+       With it gcc on arm is managing 6 instructions (6 cycles) per digit.
+       In theory the optimiser could deduce how far to unroll the loop
+       before checking for overflow.  */
+    if (++s < send) {
+      int digit = *s - '0';
+      if (digit >= 0 && digit <= 9) {
+        value = value * 10 + digit;
+        if (++s < send) {
+          digit = *s - '0';
+          if (digit >= 0 && digit <= 9) {
+            value = value * 10 + digit;
+            if (++s < send) {
+              digit = *s - '0';
+              if (digit >= 0 && digit <= 9) {
+                value = value * 10 + digit;
+		if (++s < send) {
+                  digit = *s - '0';
+                  if (digit >= 0 && digit <= 9) {
+                    value = value * 10 + digit;
+                    if (++s < send) {
+                      digit = *s - '0';
+                      if (digit >= 0 && digit <= 9) {
+                        value = value * 10 + digit;
+                        if (++s < send) {
+                          digit = *s - '0';
+                          if (digit >= 0 && digit <= 9) {
+                            value = value * 10 + digit;
+                            if (++s < send) {
+                              digit = *s - '0';
+                              if (digit >= 0 && digit <= 9) {
+                                value = value * 10 + digit;
+                                if (++s < send) {
+                                  digit = *s - '0';
+                                  if (digit >= 0 && digit <= 9) {
+                                    value = value * 10 + digit;
+                                    if (++s < send) {
+                                      /* Now got 9 digits, so need to check
+                                         each time for overflow.  */
+                                      digit = *s - '0';
+                                      while (digit >= 0 && digit <= 9
+                                             && (value < max_div_10
+                                                 || (value == max_div_10
+                                                     && digit <= max_mod_10))) {
+                                        value = value * 10 + digit;
+                                        if (++s < send)
+                                          digit = *s - '0';
+                                        else
+                                          break;
+                                      }
+                                      if (digit >= 0 && digit <= 9
+                                          && (s < send)) {
+                                        /* value overflowed.
+                                           skip the remaining digits, don't
+                                           worry about setting *valuep.  */
+                                        do {
+                                          s++;
+                                        } while (s < send && isDIGIT(*s));
+                                        numtype |=
+                                          IS_NUMBER_GREATER_THAN_UV_MAX;
+                                        goto skip_value;
+                                      }
+                                    }
+                                  }
+				}
+                              }
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+	}
+      }
+    }
+    numtype |= IS_NUMBER_IN_UV;
+    if (valuep)
+      *valuep = value;
+
+  skip_value:
+    if (GROK_NUMERIC_RADIX(&s, send)) {
+      numtype |= IS_NUMBER_NOT_INT;
+      while (s < send && isDIGIT(*s))  /* optional digits after the radix */
+        s++;
+    }
+  }
+  else if (GROK_NUMERIC_RADIX(&s, send)) {
+    numtype |= IS_NUMBER_NOT_INT | IS_NUMBER_IN_UV; /* valuep assigned below */
+    /* no digits before the radix means we need digits after it */
+    if (s < send && isDIGIT(*s)) {
+      do {
+        s++;
+      } while (s < send && isDIGIT(*s));
+      if (valuep) {
+        /* integer approximation is valid - it's 0.  */
+        *valuep = 0;
+      }
+    }
+    else
+      return 0;
+  } else if (*s == 'I' || *s == 'i') {
+    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+    s++; if (s == send || (*s != 'F' && *s != 'f')) return 0;
+    s++; if (s < send && (*s == 'I' || *s == 'i')) {
+      s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+      s++; if (s == send || (*s != 'I' && *s != 'i')) return 0;
+      s++; if (s == send || (*s != 'T' && *s != 't')) return 0;
+      s++; if (s == send || (*s != 'Y' && *s != 'y')) return 0;
+      s++;
+    }
+    sawinf = 1;
+  } else if (*s == 'N' || *s == 'n') {
+    /* XXX TODO: There are signaling NaNs and quiet NaNs. */
+    s++; if (s == send || (*s != 'A' && *s != 'a')) return 0;
+    s++; if (s == send || (*s != 'N' && *s != 'n')) return 0;
+    s++;
+    sawnan = 1;
+  } else
+    return 0;
+
+  if (sawinf) {
+    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
+    numtype |= IS_NUMBER_INFINITY | IS_NUMBER_NOT_INT;
+  } else if (sawnan) {
+    numtype &= IS_NUMBER_NEG; /* Keep track of sign  */
+    numtype |= IS_NUMBER_NAN | IS_NUMBER_NOT_INT;
+  } else if (s < send) {
+    /* we can have an optional exponent part */
+    if (*s == 'e' || *s == 'E') {
+      /* The only flag we keep is sign.  Blow away any "it's UV"  */
+      numtype &= IS_NUMBER_NEG;
+      numtype |= IS_NUMBER_NOT_INT;
+      s++;
+      if (s < send && (*s == '-' || *s == '+'))
+        s++;
+      if (s < send && isDIGIT(*s)) {
+        do {
+          s++;
+        } while (s < send && isDIGIT(*s));
+      }
+      else
+      return 0;
+    }
+  }
+  while (s < send && isSPACE(*s))
+    s++;
+  if (s >= send)
+    return numtype;
+  if (len == 10 && memEQ(pv, "0 but true", 10)) {
+    if (valuep)
+      *valuep = 0;
+    return IS_NUMBER_IN_UV;
+  }
+  return 0;
+}
+#endif
+#endif
+
+/*
+ * The grok_* routines have been modified to use warn() instead of
+ * Perl_warner(). Also, 'hexdigit' was the former name of PL_hexdigit,
+ * which is why the stack variable has been renamed to 'xdigit'.
+ */
+
+#ifndef grok_bin
+#if defined(NEED_grok_bin)
+static UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static
+#else
+extern UV DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+#endif
+
+#ifdef grok_bin
+#  undef grok_bin
+#endif
+#define grok_bin(a,b,c,d) DPPP_(my_grok_bin)(aTHX_ a,b,c,d)
+#define Perl_grok_bin DPPP_(my_grok_bin)
+
+#if defined(NEED_grok_bin) || defined(NEED_grok_bin_GLOBAL)
+UV
+DPPP_(my_grok_bin)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_2 = UV_MAX / 2;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+
+    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+        /* strip off leading b or 0b.
+           for compatibility silently suffer "b" and "0b" as valid binary
+           numbers. */
+        if (len >= 1) {
+            if (s[0] == 'b') {
+                s++;
+                len--;
+            }
+            else if (len >= 2 && s[0] == '0' && s[1] == 'b') {
+                s+=2;
+                len-=2;
+            }
+        }
+    }
+
+    for (; len-- && *s; s++) {
+        char bit = *s;
+        if (bit == '0' || bit == '1') {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+               With gcc seems to be much straighter code than old scan_bin.  */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_2) {
+                    value = (value << 1) | (bit - '0');
+                    continue;
+                }
+                /* Bah. We're just overflowed.  */
+                warn("Integer overflow in binary number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 2.0;
+	    /* If an NV has not enough bits in its mantissa to
+	     * represent a UV this summing of small low-order numbers
+	     * is a waste of time (because the NV cannot preserve
+	     * the low-order bits anyway): we could just remember when
+	     * did we overflow and in the end just multiply value_nv by the
+	     * right amount. */
+            value_nv += (NV)(bit - '0');
+            continue;
+        }
+        if (bit == '_' && len && allow_underscores && (bit = s[1])
+            && (bit == '0' || bit == '1'))
+	    {
+		--len;
+		++s;
+                goto redo;
+	    }
+        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+            warn("Illegal binary digit '%c' ignored", *s);
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+	|| (!overflowed && value > 0xffffffff  )
+#endif
+	) {
+	warn("Binary number > 0b11111111111111111111111111111111 non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_hex
+#if defined(NEED_grok_hex)
+static UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static
+#else
+extern UV DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+#endif
+
+#ifdef grok_hex
+#  undef grok_hex
+#endif
+#define grok_hex(a,b,c,d) DPPP_(my_grok_hex)(aTHX_ a,b,c,d)
+#define Perl_grok_hex DPPP_(my_grok_hex)
+
+#if defined(NEED_grok_hex) || defined(NEED_grok_hex_GLOBAL)
+UV
+DPPP_(my_grok_hex)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_16 = UV_MAX / 16;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+    const char *xdigit;
+
+    if (!(*flags & PERL_SCAN_DISALLOW_PREFIX)) {
+        /* strip off leading x or 0x.
+           for compatibility silently suffer "x" and "0x" as valid hex numbers.
+        */
+        if (len >= 1) {
+            if (s[0] == 'x') {
+                s++;
+                len--;
+            }
+            else if (len >= 2 && s[0] == '0' && s[1] == 'x') {
+                s+=2;
+                len-=2;
+            }
+        }
+    }
+
+    for (; len-- && *s; s++) {
+	xdigit = strchr((char *) PL_hexdigit, *s);
+        if (xdigit) {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+               With gcc seems to be much straighter code than old scan_hex.  */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_16) {
+                    value = (value << 4) | ((xdigit - PL_hexdigit) & 15);
+                    continue;
+                }
+                warn("Integer overflow in hexadecimal number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 16.0;
+	    /* If an NV has not enough bits in its mantissa to
+	     * represent a UV this summing of small low-order numbers
+	     * is a waste of time (because the NV cannot preserve
+	     * the low-order bits anyway): we could just remember when
+	     * did we overflow and in the end just multiply value_nv by the
+	     * right amount of 16-tuples. */
+            value_nv += (NV)((xdigit - PL_hexdigit) & 15);
+            continue;
+        }
+        if (*s == '_' && len && allow_underscores && s[1]
+		&& (xdigit = strchr((char *) PL_hexdigit, s[1])))
+	    {
+		--len;
+		++s;
+                goto redo;
+	    }
+        if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+            warn("Illegal hexadecimal digit '%c' ignored", *s);
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+	|| (!overflowed && value > 0xffffffff  )
+#endif
+	) {
+	warn("Hexadecimal number > 0xffffffff non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#ifndef grok_oct
+#if defined(NEED_grok_oct)
+static UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+static
+#else
+extern UV DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result);
+#endif
+
+#ifdef grok_oct
+#  undef grok_oct
+#endif
+#define grok_oct(a,b,c,d) DPPP_(my_grok_oct)(aTHX_ a,b,c,d)
+#define Perl_grok_oct DPPP_(my_grok_oct)
+
+#if defined(NEED_grok_oct) || defined(NEED_grok_oct_GLOBAL)
+UV
+DPPP_(my_grok_oct)(pTHX_ char *start, STRLEN *len_p, I32 *flags, NV *result)
+{
+    const char *s = start;
+    STRLEN len = *len_p;
+    UV value = 0;
+    NV value_nv = 0;
+
+    const UV max_div_8 = UV_MAX / 8;
+    bool allow_underscores = *flags & PERL_SCAN_ALLOW_UNDERSCORES;
+    bool overflowed = FALSE;
+
+    for (; len-- && *s; s++) {
+         /* gcc 2.95 optimiser not smart enough to figure that this subtraction
+            out front allows slicker code.  */
+        int digit = *s - '0';
+        if (digit >= 0 && digit <= 7) {
+            /* Write it in this wonky order with a goto to attempt to get the
+               compiler to make the common case integer-only loop pretty tight.
+            */
+          redo:
+            if (!overflowed) {
+                if (value <= max_div_8) {
+                    value = (value << 3) | digit;
+                    continue;
+                }
+                /* Bah. We're just overflowed.  */
+                warn("Integer overflow in octal number");
+                overflowed = TRUE;
+                value_nv = (NV) value;
+            }
+            value_nv *= 8.0;
+	    /* If an NV has not enough bits in its mantissa to
+	     * represent a UV this summing of small low-order numbers
+	     * is a waste of time (because the NV cannot preserve
+	     * the low-order bits anyway): we could just remember when
+	     * did we overflow and in the end just multiply value_nv by the
+	     * right amount of 8-tuples. */
+            value_nv += (NV)digit;
+            continue;
+        }
+        if (digit == ('_' - '0') && len && allow_underscores
+            && (digit = s[1] - '0') && (digit >= 0 && digit <= 7))
+	    {
+		--len;
+		++s;
+                goto redo;
+	    }
+        /* Allow \octal to work the DWIM way (that is, stop scanning
+         * as soon as non-octal characters are seen, complain only iff
+         * someone seems to want to use the digits eight and nine). */
+        if (digit == 8 || digit == 9) {
+            if (!(*flags & PERL_SCAN_SILENT_ILLDIGIT))
+                warn("Illegal octal digit '%c' ignored", *s);
+        }
+        break;
+    }
+
+    if (   ( overflowed && value_nv > 4294967295.0)
+#if UVSIZE > 4
+	|| (!overflowed && value > 0xffffffff  )
+#endif
+	) {
+	warn("Octal number > 037777777777 non-portable");
+    }
+    *len_p = s - start;
+    if (!overflowed) {
+        *flags = 0;
+        return value;
+    }
+    *flags = PERL_SCAN_GREATER_THAN_UV_MAX;
+    if (result)
+        *result = value_nv;
+    return UV_MAX;
+}
+#endif
+#endif
+
+#if !defined(my_snprintf)
+#if defined(NEED_my_snprintf)
+static int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+static
+#else
+extern int DPPP_(my_my_snprintf)(char * buffer, const Size_t len, const char * format, ...);
+#endif
+
+#define my_snprintf DPPP_(my_my_snprintf)
+#define Perl_my_snprintf DPPP_(my_my_snprintf)
+
+#if defined(NEED_my_snprintf) || defined(NEED_my_snprintf_GLOBAL)
+
+int
+DPPP_(my_my_snprintf)(char *buffer, const Size_t len, const char *format, ...)
+{
+    dTHX;
+    int retval;
+    va_list ap;
+    va_start(ap, format);
+#ifdef HAS_VSNPRINTF
+    retval = vsnprintf(buffer, len, format, ap);
+#else
+    retval = vsprintf(buffer, format, ap);
+#endif
+    va_end(ap);
+    if (retval >= (int)len)
+	Perl_croak(aTHX_ "panic: my_snprintf buffer overflow");
+    return retval;
+}
+
+#endif
+#endif
+
+#ifdef NO_XSLOCKS
+#  ifdef dJMPENV
+#    define dXCPT             dJMPENV; int rEtV = 0
+#    define XCPT_TRY_START    JMPENV_PUSH(rEtV); if (rEtV == 0)
+#    define XCPT_TRY_END      JMPENV_POP;
+#    define XCPT_CATCH        if (rEtV != 0)
+#    define XCPT_RETHROW      JMPENV_JUMP(rEtV)
+#  else
+#    define dXCPT             Sigjmp_buf oldTOP; int rEtV = 0
+#    define XCPT_TRY_START    Copy(top_env, oldTOP, 1, Sigjmp_buf); rEtV = Sigsetjmp(top_env, 1); if (rEtV == 0)
+#    define XCPT_TRY_END      Copy(oldTOP, top_env, 1, Sigjmp_buf);
+#    define XCPT_CATCH        if (rEtV != 0)
+#    define XCPT_RETHROW      Siglongjmp(top_env, rEtV)
+#  endif
+#endif
+
+#if !defined(my_strlcat)
+#if defined(NEED_my_strlcat)
+static Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+static
+#else
+extern Size_t DPPP_(my_my_strlcat)(char * dst, const char * src, Size_t size);
+#endif
+
+#define my_strlcat DPPP_(my_my_strlcat)
+#define Perl_my_strlcat DPPP_(my_my_strlcat)
+
+#if defined(NEED_my_strlcat) || defined(NEED_my_strlcat_GLOBAL)
+
+Size_t
+DPPP_(my_my_strlcat)(char *dst, const char *src, Size_t size)
+{
+    Size_t used, length, copy;
+
+    used = strlen(dst);
+    length = strlen(src);
+    if (size > 0 && used < size - 1) {
+        copy = (length >= size - used) ? size - used - 1 : length;
+        memcpy(dst + used, src, copy);
+        dst[used + copy] = '\0';
+    }
+    return used + length;
+}
+#endif
+#endif
+
+#if !defined(my_strlcpy)
+#if defined(NEED_my_strlcpy)
+static Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+static
+#else
+extern Size_t DPPP_(my_my_strlcpy)(char * dst, const char * src, Size_t size);
+#endif
+
+#define my_strlcpy DPPP_(my_my_strlcpy)
+#define Perl_my_strlcpy DPPP_(my_my_strlcpy)
+
+#if defined(NEED_my_strlcpy) || defined(NEED_my_strlcpy_GLOBAL)
+
+Size_t
+DPPP_(my_my_strlcpy)(char *dst, const char *src, Size_t size)
+{
+    Size_t length, copy;
+
+    length = strlen(src);
+    if (size > 0) {
+        copy = (length >= size) ? size - 1 : length;
+        memcpy(dst, src, copy);
+        dst[copy] = '\0';
+    }
+    return length;
+}
+
+#endif
+#endif
+
+#endif /* _P_P_PORTABILITY_H_ */
+
+/* End of File ppport.h */
diff --git a/t/0-load.t b/t/0-load.t
new file mode 100644
index 0000000..f598a60
--- /dev/null
+++ b/t/0-load.t
@@ -0,0 +1,5 @@
+use Test::More tests => 1;
+
+BEGIN {
+    use_ok('Lingua::Stem::Snowball');
+}
diff --git a/t/1-stem.t b/t/1-stem.t
new file mode 100644
index 0000000..f2e99b3
--- /dev/null
+++ b/t/1-stem.t
@@ -0,0 +1,75 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More;
+use Lingua::Stem::Snowball qw(:all);
+
+my @languages = stemmers();
+
+plan tests => scalar(@languages) + 17;
+
+for my $language (@languages) {
+    is( 'Lingua::Stem::Snowball',
+        ref Lingua::Stem::Snowball->new( lang => $language ),
+        "construct stemmer for lang => '$language'"
+    );
+}
+
+my $stemmer;
+
+$stemmer = Lingua::Stem::Snowball->new( lang => $languages[0] );
+is( 'Lingua::Stem::Snowball', ref($stemmer), "constuct a stemmer" );
+is( $stemmer->lang, $languages[0], "stemmer has the expected language" );
+
+$stemmer = Lingua::Stem::Snowball->new();
+is( 'Lingua::Stem::Snowball', ref($stemmer),
+    "Construct stemmer with no args" );
+is( $stemmer->lang, '', "stemmer has empty string for language" );
+$stemmer->lang( $languages[0] );
+is( $stemmer->lang, $languages[0], "reset the language", );
+$stemmer->lang('nothing');
+is( $stemmer->lang, $languages[0],
+    "resetting the language to an invalid value silently fails" );
+$stemmer->lang( uc( $languages[0] ) );
+is( $stemmer->lang, $languages[0],
+    "tolerate uppercase versions of ISO codes" );
+
+$stemmer = Lingua::Stem::Snowball->new();
+is( $stemmer->stem('foo'), undef, "with no lang, stem returns undef" );
+is( $stemmer->stem(), undef, "with no input, stem returns undef" );
+
+# Test for bug #7510 - [ not really, bug 7510 has to do with subclassing ]
+is( stem( 'fr', '�t�' ),    '�t�',  "functional interface" );
+is( stem( 'en', 'horses' ), 'hors', "functional interface" );
+
+# Tests for bug #7509
+$stemmer = Lingua::Stem::Snowball->new();
+is( 'Lingua::Stem::Snowball', ref($stemmer), "it's a Snowball, alright" );
+is( $stemmer->lang, '', "empty language" );
+$stemmer->lang('nothing');
+is( $@,
+    "Language 'nothing' does not exist",
+    "correct error message for invalid language"
+);
+
+# Test for mixed case words
+is( stem( 'fr', 'AIMERA' ),
+    stem( 'fr', 'aimera' ),
+    "stemmer lowercases uppercase source"
+);
+
+# Test for bug #13900
+$stemmer = Lingua::Stem::Snowball->new( lang => 'en' );
+my @stemmable = ( '', undef, 'foo', 'bar', '' );
+my @stemmed = $stemmer->stem( \@stemmable );
+is( scalar(@stemmable), scalar(@stemmed),
+    "don't strip empty array elements" );
+
+# Test for ticket #13898
+$stemmer = Lingua::Stem::Snowball->new( lang => 'en' );
+ at stemmable = ( 'foo', 'ranger\'s', 'bar' );
+my @stemmed_ok = ( 'foo', 'ranger', 'bar' );
+$stemmer->strip_apostrophes(1);
+ at stemmed = $stemmer->stem( \@stemmable );
+ok( eq_array( \@stemmed_ok, \@stemmed ), "apostrophe s" );
+
diff --git a/t/2-full.t b/t/2-full.t
new file mode 100644
index 0000000..4c82b37
--- /dev/null
+++ b/t/2-full.t
@@ -0,0 +1,91 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More tests => 8484;
+use Lingua::Stem::Snowball qw( stem );
+use File::Spec;
+
+my @languages = qw( en da de es fi fr it nl no pt ru sv );
+my $stemmer   = Lingua::Stem::Snowball->new();
+
+for my $iso (@languages) {
+    my ( @before, @after );
+    my $encoding;
+
+    # set language
+    $stemmer->lang($iso);
+
+    # test ISO-8859-1 / KOI8-R vocab
+    $encoding = $iso eq 'ru' ? 'KOI8-R' : 'ISO-8859-1';
+    my $default_enc_voc_path
+        = File::Spec->catfile( 't', 'test_voc', "$iso.default_enc" );
+    open( my $default_enc_voc_fh, '<', $default_enc_voc_path )
+        or die "Couldn't open file '$default_enc_voc_path' for reading: $!";
+    $stemmer->encoding($encoding);
+    while (<$default_enc_voc_fh>) {
+        chomp;
+        my ( $raw, $expected ) = split;
+        push @before, $raw;
+        push @after,  $expected;
+        test_singles( $raw, $expected, $iso, $encoding );
+    }
+    test_arrays( \@before, \@after, $iso, $encoding );
+
+    # test UTF-8 vocab
+    $encoding = 'UTF-8';
+    @before   = ();
+    @after    = ();
+    my $utf8_voc_path = File::Spec->catfile( 't', 'test_voc', "$iso.utf8" );
+    open( my $utf8_voc_fh, '<:utf8', $utf8_voc_path )
+        or die "Couldn't open file '$utf8_voc_path' for reading: $!";
+    $stemmer->encoding($encoding);
+    while (<$utf8_voc_fh>) {
+        chomp;
+        my ( $raw, $expected ) = split;
+        push @before, $raw;
+        push @after,  $expected;
+        test_singles( $raw, $expected, $iso, $encoding );
+    }
+    test_arrays( \@before, \@after, $iso, $encoding );
+
+}
+
+sub test_singles {
+    my ( $raw, $expected, $iso, $encoding ) = @_;
+
+    my $got = $stemmer->stem($raw);
+    is( $got, $expected, "$iso \$s->stem(\$raw)" );
+
+    if ( $encoding ne 'UTF-8' ) {
+        $got = stem( $iso, $raw );
+        is( $got, $expected, "$iso stem(\$lang, \$raw)" );
+    }
+
+    $got = $stemmer->stem( uc($raw) );
+    is( $got, $expected, "$iso \$s->stem(uc(\$raw))" );
+
+    $got = [$raw];
+    $stemmer->stem_in_place($got);
+    is( $got->[0], $expected, "$iso \$s->stem_in_place(\$raw)" );
+}
+
+sub test_arrays {
+    my ( $raw, $expected, $iso, $encoding ) = @_;
+
+    my @got = $stemmer->stem($raw);
+    is_deeply( \@got, $expected, "$iso \$s->stem(\@raw)" );
+
+    if ( $encoding ne 'UTF-8' ) {
+        @got = stem( $iso, $raw );
+        is_deeply( \@got, $expected, "$iso stem(\$lang, \@raw)" );
+    }
+
+    my @uppercased = map {uc} @$raw;
+    @got = $stemmer->stem( \@uppercased );
+    is_deeply( \@got, $expected, "$iso \$s->stem(\@raw) (uc'd)" );
+
+    @got = @$raw;
+    $stemmer->stem_in_place( \@got );
+    is_deeply( \@got, $expected, "$iso \$s->stem_in_place(\@raw)" );
+}
+
diff --git a/t/3-subclass.t b/t/3-subclass.t
new file mode 100644
index 0000000..b57ad27
--- /dev/null
+++ b/t/3-subclass.t
@@ -0,0 +1,18 @@
+#!/usr/bin/perl
+
+# Tests for bug #7510
+package MyStem;
+use base qw( Lingua::Stem::Snowball );
+
+package main;
+use strict;
+use Test::More tests => 3;
+
+my $s = MyStem->new( lang => 'fr' );
+ok( 'MyStem', ref($s) );
+
+my $lemm = $s->stem('�t�');
+is( $lemm, '�t�', "stem works" );
+
+$lemm = $s->stem('aimant');
+is( $lemm, 'aim', "stem works" );
diff --git a/t/98-TestPod.t b/t/98-TestPod.t
new file mode 100644
index 0000000..263557c
--- /dev/null
+++ b/t/98-TestPod.t
@@ -0,0 +1,7 @@
+#!/usr/bin/perl
+
+use Test::More;
+plan skip_all => "Test::Pod 1.00 required for testing POD"
+    unless eval "use Test::Pod 1.00; 1";
+all_pod_files_ok();
+
diff --git a/t/99-TestPodCoverage.t b/t/99-TestPodCoverage.t
new file mode 100644
index 0000000..e5415c2
--- /dev/null
+++ b/t/99-TestPodCoverage.t
@@ -0,0 +1,6 @@
+#!/usr/bin/perl
+
+use Test::More;
+plan skip_all => "Test::Pod::Coverage required for testing POD"
+    unless eval "use Test::Pod::Coverage; 1";
+all_pod_coverage_ok();
diff --git a/t/test_voc/da.default_enc b/t/test_voc/da.default_enc
new file mode 100644
index 0000000..122ca9a
--- /dev/null
+++ b/t/test_voc/da.default_enc
@@ -0,0 +1,100 @@
+sonm                          sonm
+overses                       overs
+karavane                      karavan
+trol�st                       trol�st
+bag                           bag
+flette                        flet
+suf                           suf
+gimzo                         gimzo
+lammets                       lam
+overhans                      overhan
+bortskyller                   bortskyl
+l�sk�bte                      l�sk�bt
+s�s                           s�s
+heruberne                     herub
+majest�t                      majest�t
+skalkeskjul                   skalkeskjul
+beroliget                     bero
+bragt                         bragt
+abimael                       abimael
+fnyste                        fnyst
+skr�ningerne                  skr�ning
+vagtsted                      vagtsted
+evnerikke                     evnerik
+keros                         kero
+forel�ses                     forel�s
+h�jestes                      h�jest
+sm�byer                       sm�by
+neris                         neris
+dybere                        dyb
+hovedlokker                   hovedlok
+forbitrelse                   forbitr
+hebraiske                     hebraisk
+sf�der                        sf�d
+forbi                         forbi
+buna                          buna
+forkl�de                      forkl�d
+bogs                          bog
+urene                         uren
+dr�n                          dr�n
+folkets                       folk
+hine                          hin
+opholdt                       ophold
+dedans                        dedan
+antikrister                   antikrist
+ruinhobe                      ruinhob
+skarn                         skarn
+kuer                          kuer
+sl�r                          sl�r
+tr�den                        tr�d
+opskriv                       opskriv
+hoben                         hob
+tilintetg�re                  tilintetg�r
+skelne                        skeln
+folkeslags                    folkeslag
+l�ftesten                     l�ftest
+pr�sternes                    pr�st
+folkekampe                    folkekamp
+hizki                         hizki
+utugts                        utug
+ordre                         ordr
+fineste                       finest
+tireja                        tireja
+fik                           fik
+stridsm�ndene                 stridsm�nd
+omkring                       omkring
+hliver                        hliv
+slagter                       slagt
+sammenrulles                  sammenrul
+velse                         vels
+stangede                      stanged
+storvind                      storvind
+blund                         blund
+tusinder                      tusind
+klippeborge                   klippeborg
+huri                          huri
+slip                          slip
+byrderne                      byrd
+overskuede                    overskued
+engel                         engel
+kul                           kul
+opskr�mmer                    opskr�m
+livstegn                      livstegn
+landsh�vdinger                landsh�vding
+turen                         tur
+br�nden                       br�nd
+regering                      regering
+h�drede                       h�dred
+lytt                          lyt
+stamme�versterne              stamme�verst
+hersltede                     herslted
+g�dens                        g�d
+profeteret                    profet
+s�gte                         s�gt
+forlad                        forlad
+bemandede                     bemanded
+majest�tens                   majest�t
+kampskrig                     kampskr
+syg                           syg
+sabbatter                     sabbat
+blad                          blad
diff --git a/t/test_voc/da.utf8 b/t/test_voc/da.utf8
new file mode 100644
index 0000000..66cf45e
--- /dev/null
+++ b/t/test_voc/da.utf8
@@ -0,0 +1,100 @@
+sonm                          sonm
+overses                       overs
+karavane                      karavan
+troløst                       troløst
+bag                           bag
+flette                        flet
+suf                           suf
+gimzo                         gimzo
+lammets                       lam
+overhans                      overhan
+bortskyller                   bortskyl
+løskøbte                      løskøbt
+sås                           sås
+heruberne                     herub
+majestæt                      majestæt
+skalkeskjul                   skalkeskjul
+beroliget                     bero
+bragt                         bragt
+abimael                       abimael
+fnyste                        fnyst
+skråningerne                  skråning
+vagtsted                      vagtsted
+evnerikke                     evnerik
+keros                         kero
+forelæses                     forelæs
+højestes                      højest
+småbyer                       småby
+neris                         neris
+dybere                        dyb
+hovedlokker                   hovedlok
+forbitrelse                   forbitr
+hebraiske                     hebraisk
+sfæder                        sfæd
+forbi                         forbi
+buna                          buna
+forklæde                      forklæd
+bogs                          bog
+urene                         uren
+drøn                          drøn
+folkets                       folk
+hine                          hin
+opholdt                       ophold
+dedans                        dedan
+antikrister                   antikrist
+ruinhobe                      ruinhob
+skarn                         skarn
+kuer                          kuer
+slår                          slår
+træden                        træd
+opskriv                       opskriv
+hoben                         hob
+tilintetgøre                  tilintetgør
+skelne                        skeln
+folkeslags                    folkeslag
+løftesten                     løftest
+præsternes                    præst
+folkekampe                    folkekamp
+hizki                         hizki
+utugts                        utug
+ordre                         ordr
+fineste                       finest
+tireja                        tireja
+fik                           fik
+stridsmændene                 stridsmænd
+omkring                       omkring
+hliver                        hliv
+slagter                       slagt
+sammenrulles                  sammenrul
+velse                         vels
+stangede                      stanged
+storvind                      storvind
+blund                         blund
+tusinder                      tusind
+klippeborge                   klippeborg
+huri                          huri
+slip                          slip
+byrderne                      byrd
+overskuede                    overskued
+engel                         engel
+kul                           kul
+opskræmmer                    opskræm
+livstegn                      livstegn
+landshøvdinger                landshøvding
+turen                         tur
+brønden                       brønd
+regering                      regering
+hædrede                       hædred
+lytt                          lyt
+stammeøversterne              stammeøverst
+hersltede                     herslted
+gådens                        gåd
+profeteret                    profet
+søgte                         søgt
+forlad                        forlad
+bemandede                     bemanded
+majestætens                   majestæt
+kampskrig                     kampskr
+syg                           syg
+sabbatter                     sabbat
+blad                          blad
diff --git a/t/test_voc/de.default_enc b/t/test_voc/de.default_enc
new file mode 100644
index 0000000..123d67c
--- /dev/null
+++ b/t/test_voc/de.default_enc
@@ -0,0 +1,100 @@
+gleitet                       gleitet
+felsenkette                   felsenkett
+satteln                       satteln
+synodalrat                    synodalrat
+vorausgeschickt               vorausgeschickt
+�ugelchen                     augelch
+geschwollnen                  geschwolln
+nationen                      nation
+unermesslich                  unermess
+marti                         marti
+s�het                         sahet
+bieranstalt                   bieranstalt
+unruhig                       unruh
+ertrank                       ertrank
+spannender                    spannend
+abgenutzten                   abgenutzt
+geliebt                       geliebt
+ermordete                     ermordet
+katzensprung                  katzenspr
+wessen                        wess
+missbrauchsdebatte            missbrauchsdebatt
+wiedergefunden                wiedergefund
+geheimnisse                   geheimniss
+kuhpfluge                     kuhpflug
+heiteren                      heit
+desolatio                     desolatio
+widerspenstigsten             widerspenst
+qu�lt                         qualt
+ursache                       ursach
+neid                          neid
+bleamerln                     bleamerln
+dem�tiger                     demut
+vormittagsimbiss              vormittagsimbiss
+empfinde                      empfind
+zwecke                        zweck
+herzlichen                    herzlich
+umschlang                     umschlang
+verhallte                     verhallt
+uns�glich                     unsag
+standpunkte                   standpunkt
+eintritt                      eintritt
+eierbrot                      eierbrot
+stamme                        stamm
+verheiratetes                 verheiratet
+h�lzernes                     holzern
+singen                        sing
+gleichzeitig                  gleichzeit
+anderckens                    anderck
+spannten                      spannt
+glockensch�nen                glockenschon
+zierlicher                    zierlich
+verwunschenen                 verwunsch
+umanandhocken                 umanandhock
+herabl��t                     herablasst
+verwechselt                   verwechselt
+gesellschaften                gesellschaft
+ausgezeichnetr�ckbesinnung    ausgezeichnetruckbesinn
+verschollenen                 verscholl
+gelees                        gele
+verdunkelt                    verdunkelt
+herumsprangen                 herumsprang
+bewegungsgr�nde               bewegungsgrund
+denkbar                       denkbar
+k�stlich                      kostlich
+immanent                      immanent
+schaden                       schad
+berechnung                    berechn
+word                          word
+schwefelgelbem                schwefelgelb
+kindische                     kindisch
+gebratene                     gebrat
+z�ngchen                      zangch
+fischern                      fisch
+hinzuf�gt                     hinzufugt
+mitf�hrt                      mitfuhrt
+dreissiger                    dreissig
+stinkige                      stinkig
+s�useln                       sauseln
+erdharzes                     erdharz
+gebogen                       gebog
+neubauten                     neubaut
+wollten                       wollt
+heimwege                      heimweg
+gel�bde                       gelubd
+mi�brauchen                   missbrauch
+korne                         korn
+b�rstners                     burstn
+impressum                     impressum
+fr�ulein                      fraulein
+bew�lkten                     bewolkt
+angfangt                      angfangt
+ringes                        ring
+bek�men                       bekam
+sprichw�rter                  sprichwort
+br�llte                       brullt
+beruhigten                    beruhigt
+trauerte                      trauert
+vor�berkam                    voruberkam
+sechsfache                    sechsfach
+gefastet                      gefastet
diff --git a/t/test_voc/de.utf8 b/t/test_voc/de.utf8
new file mode 100644
index 0000000..b0f7f7f
--- /dev/null
+++ b/t/test_voc/de.utf8
@@ -0,0 +1,100 @@
+gleitet                       gleitet
+felsenkette                   felsenkett
+satteln                       satteln
+synodalrat                    synodalrat
+vorausgeschickt               vorausgeschickt
+äugelchen                     augelch
+geschwollnen                  geschwolln
+nationen                      nation
+unermesslich                  unermess
+marti                         marti
+sähet                         sahet
+bieranstalt                   bieranstalt
+unruhig                       unruh
+ertrank                       ertrank
+spannender                    spannend
+abgenutzten                   abgenutzt
+geliebt                       geliebt
+ermordete                     ermordet
+katzensprung                  katzenspr
+wessen                        wess
+missbrauchsdebatte            missbrauchsdebatt
+wiedergefunden                wiedergefund
+geheimnisse                   geheimniss
+kuhpfluge                     kuhpflug
+heiteren                      heit
+desolatio                     desolatio
+widerspenstigsten             widerspenst
+quält                         qualt
+ursache                       ursach
+neid                          neid
+bleamerln                     bleamerln
+demütiger                     demut
+vormittagsimbiss              vormittagsimbiss
+empfinde                      empfind
+zwecke                        zweck
+herzlichen                    herzlich
+umschlang                     umschlang
+verhallte                     verhallt
+unsäglich                     unsag
+standpunkte                   standpunkt
+eintritt                      eintritt
+eierbrot                      eierbrot
+stamme                        stamm
+verheiratetes                 verheiratet
+hölzernes                     holzern
+singen                        sing
+gleichzeitig                  gleichzeit
+anderckens                    anderck
+spannten                      spannt
+glockenschönen                glockenschon
+zierlicher                    zierlich
+verwunschenen                 verwunsch
+umanandhocken                 umanandhock
+herabläßt                     herablasst
+verwechselt                   verwechselt
+gesellschaften                gesellschaft
+ausgezeichnetrückbesinnung    ausgezeichnetruckbesinn
+verschollenen                 verscholl
+gelees                        gele
+verdunkelt                    verdunkelt
+herumsprangen                 herumsprang
+bewegungsgründe               bewegungsgrund
+denkbar                       denkbar
+köstlich                      kostlich
+immanent                      immanent
+schaden                       schad
+berechnung                    berechn
+word                          word
+schwefelgelbem                schwefelgelb
+kindische                     kindisch
+gebratene                     gebrat
+zängchen                      zangch
+fischern                      fisch
+hinzufügt                     hinzufugt
+mitführt                      mitfuhrt
+dreissiger                    dreissig
+stinkige                      stinkig
+säuseln                       sauseln
+erdharzes                     erdharz
+gebogen                       gebog
+neubauten                     neubaut
+wollten                       wollt
+heimwege                      heimweg
+gelübde                       gelubd
+mißbrauchen                   missbrauch
+korne                         korn
+bürstners                     burstn
+impressum                     impressum
+fräulein                      fraulein
+bewölkten                     bewolkt
+angfangt                      angfangt
+ringes                        ring
+bekämen                       bekam
+sprichwörter                  sprichwort
+brüllte                       brullt
+beruhigten                    beruhigt
+trauerte                      trauert
+vorüberkam                    voruberkam
+sechsfache                    sechsfach
+gefastet                      gefastet
diff --git a/t/test_voc/en.default_enc b/t/test_voc/en.default_enc
new file mode 100644
index 0000000..cb1ed67
--- /dev/null
+++ b/t/test_voc/en.default_enc
@@ -0,0 +1,100 @@
+wi                            wi
+counter                       counter
+repair                        repair
+limes                         lime
+allies                        alli
+schemes                       scheme
+partisans                     partisan
+unremitting                   unremit
+gilding                       gild
+crystallized                  crystal
+tongs                         tong
+dustier                       dustier
+krestovsky                    krestovski
+confuting                     confut
+enlightened                   enlighten
+boundaries                    boundari
+executors                     executor
+awaken                        awaken
+drownded                      drownd
+upbraiding                    upbraid
+contending                    contend
+revolving                     revolv
+snowflakes                    snowflak
+reader                        reader
+yonge                         yong
+coalitions                    coalit
+parcels                       parcel
+mingle                        mingl
+sterne                        stern
+energy                        energi
+jerkily                       jerkili
+stretched                     stretch
+draining                      drain
+clytia                        clytia
+quart                         quart
+envenomed                     envenom
+tolerate                      toler
+parisians                     parisian
+mate                          mate
+goodwood                      goodwood
+dilemma                       dilemma
+darker                        darker
+follering                     foller
+goodnaturedly                 goodnatur
+astonishingly                 astonish
+width                         width
+inebriated                    inebri
+convenience                   conveni
+adultery                      adulteri
+grossly                       grossli
+cardinal                      cardin
+undertakes                    undertak
+harbour                       harbour
+reminder                      remind
+shal                          shal
+bod                           bod
+knif                          knif
+surpasses                     surpass
+superabundant                 superabund
+moped                         mope
+conduce                       conduc
+crossly                       crossli
+census                        census
+ridges                        ridg
+convicts                      convict
+interests                     interest
+broiling                      broil
+nonchalant                    nonchal
+resume                        resum
+civilization                  civil
+deplore                       deplor
+clerkship                     clerkship
+lxii                          lxii
+headless                      headless
+curate                        curat
+hopped                        hop
+howell                        howel
+descrip                       descrip
+shrillness                    shrill
+applicant                     applic
+celebrate                     celebr
+aloe                          alo
+drink                         drink
+overtime                      overtim
+world                         world
+dowdles                       dowdl
+obeyed                        obey
+tommy                         tommi
+accomplishing                 accomplish
+nous                          nous
+remitting                     remit
+irreconcilable                irreconcil
+welveteen                     welveteen
+cowards                       coward
+digitated                     digit
+unpleasantness                unpleas
+barge                         barg
+watkins                       watkin
+vibration                     vibrat
+thicken                       thicken
diff --git a/t/test_voc/en.utf8 b/t/test_voc/en.utf8
new file mode 100644
index 0000000..cb1ed67
--- /dev/null
+++ b/t/test_voc/en.utf8
@@ -0,0 +1,100 @@
+wi                            wi
+counter                       counter
+repair                        repair
+limes                         lime
+allies                        alli
+schemes                       scheme
+partisans                     partisan
+unremitting                   unremit
+gilding                       gild
+crystallized                  crystal
+tongs                         tong
+dustier                       dustier
+krestovsky                    krestovski
+confuting                     confut
+enlightened                   enlighten
+boundaries                    boundari
+executors                     executor
+awaken                        awaken
+drownded                      drownd
+upbraiding                    upbraid
+contending                    contend
+revolving                     revolv
+snowflakes                    snowflak
+reader                        reader
+yonge                         yong
+coalitions                    coalit
+parcels                       parcel
+mingle                        mingl
+sterne                        stern
+energy                        energi
+jerkily                       jerkili
+stretched                     stretch
+draining                      drain
+clytia                        clytia
+quart                         quart
+envenomed                     envenom
+tolerate                      toler
+parisians                     parisian
+mate                          mate
+goodwood                      goodwood
+dilemma                       dilemma
+darker                        darker
+follering                     foller
+goodnaturedly                 goodnatur
+astonishingly                 astonish
+width                         width
+inebriated                    inebri
+convenience                   conveni
+adultery                      adulteri
+grossly                       grossli
+cardinal                      cardin
+undertakes                    undertak
+harbour                       harbour
+reminder                      remind
+shal                          shal
+bod                           bod
+knif                          knif
+surpasses                     surpass
+superabundant                 superabund
+moped                         mope
+conduce                       conduc
+crossly                       crossli
+census                        census
+ridges                        ridg
+convicts                      convict
+interests                     interest
+broiling                      broil
+nonchalant                    nonchal
+resume                        resum
+civilization                  civil
+deplore                       deplor
+clerkship                     clerkship
+lxii                          lxii
+headless                      headless
+curate                        curat
+hopped                        hop
+howell                        howel
+descrip                       descrip
+shrillness                    shrill
+applicant                     applic
+celebrate                     celebr
+aloe                          alo
+drink                         drink
+overtime                      overtim
+world                         world
+dowdles                       dowdl
+obeyed                        obey
+tommy                         tommi
+accomplishing                 accomplish
+nous                          nous
+remitting                     remit
+irreconcilable                irreconcil
+welveteen                     welveteen
+cowards                       coward
+digitated                     digit
+unpleasantness                unpleas
+barge                         barg
+watkins                       watkin
+vibration                     vibrat
+thicken                       thicken
diff --git a/t/test_voc/es.default_enc b/t/test_voc/es.default_enc
new file mode 100644
index 0000000..991b012
--- /dev/null
+++ b/t/test_voc/es.default_enc
@@ -0,0 +1,100 @@
+em                            em
+encabezado                    encabez
+migraci�n                     migracion
+proporcionado                 proporcion
+conectarse                    conect
+batallan                      batall
+walberto                      walbert
+limpio                        limpi
+ofrecen                       ofrec
+acta                          acta
+anotaciones                   anot
+pagamos                       pag
+cl�nico                       clinic
+urista                        urist
+resulte                       result
+reparar                       repar
+populismo                     popul
+participante                  particip
+absorver                      absorv
+dillo                         dill
+buick                         buick
+ciertas                       ciert
+fukuoka                       fukuok
+fundamentos                   fundament
+disfrutar                     disfrut
+cornejo                       cornej
+campos                        camp
+detuvo                        detuv
+concurri�                     concurr
+reclamaci�n                   reclam
+alambre                       alambr
+administra                    administr
+insulta                       insult
+interventores                 interventor
+bi�logo                       biolog
+auto                          aut
+margen                        marg
+a�reos                        aere
+resquicio                     resquici
+harefield                     harefield
+oralia                        orali
+policiacas                    policiac
+vosso                         voss
+multar                        mult
+cuidar�                       cuid
+esperado                      esper
+adapt�ndose                   adapt
+ampliarla                     ampli
+interceptados                 intercept
+delano                        delan
+mientan                       mient
+habitaciones                  habit
+teaanque                      teaanqu
+fortuna                       fortun
+pulmonares                    pulmonar
+organizan                     organiz
+coello                        coell
+abaco                         abac
+colin                         colin
+hallamos                      hall
+leblanc                       leblanc
+resurgir                      resurg
+boutiques                     boutiqu
+citado                        cit
+renovar                       renov
+progresista                   progres
+normatividad                  normat
+preguntamos                   pregunt
+luminosas                     lumin
+para�so                       parais
+empez�                        empez
+provocar�n                    provoc
+pospuso                       pospus
+claros                        clar
+puedan                        pued
+alcanzar�                     alcanz
+calcetines                    calcetin
+b�blico                       biblic
+m�rale                        miral
+indique                       indiqu
+alivio                        alivi
+honradez                      honradez
+exclusivas                    exclus
+dinero                        diner
+tocaban                       toc
+incertidumbre                 incertidumbr
+medias                        medi
+modelos                       model
+aceptas                       acept
+capitalino                    capitalin
+modificaciones                modif
+york                          york
+ancestrales                   ancestral
+pavimentados                  paviment
+derredor                      derredor
+reiter�                       reiter
+anexos                        anex
+entrevist�                    entrevist
+refieren                      refier
+operas                        oper
diff --git a/t/test_voc/es.utf8 b/t/test_voc/es.utf8
new file mode 100644
index 0000000..b8276d8
--- /dev/null
+++ b/t/test_voc/es.utf8
@@ -0,0 +1,100 @@
+em                            em
+encabezado                    encabez
+migración                     migracion
+proporcionado                 proporcion
+conectarse                    conect
+batallan                      batall
+walberto                      walbert
+limpio                        limpi
+ofrecen                       ofrec
+acta                          acta
+anotaciones                   anot
+pagamos                       pag
+clínico                       clinic
+urista                        urist
+resulte                       result
+reparar                       repar
+populismo                     popul
+participante                  particip
+absorver                      absorv
+dillo                         dill
+buick                         buick
+ciertas                       ciert
+fukuoka                       fukuok
+fundamentos                   fundament
+disfrutar                     disfrut
+cornejo                       cornej
+campos                        camp
+detuvo                        detuv
+concurrió                     concurr
+reclamación                   reclam
+alambre                       alambr
+administra                    administr
+insulta                       insult
+interventores                 interventor
+biólogo                       biolog
+auto                          aut
+margen                        marg
+aéreos                        aere
+resquicio                     resquici
+harefield                     harefield
+oralia                        orali
+policiacas                    policiac
+vosso                         voss
+multar                        mult
+cuidará                       cuid
+esperado                      esper
+adaptándose                   adapt
+ampliarla                     ampli
+interceptados                 intercept
+delano                        delan
+mientan                       mient
+habitaciones                  habit
+teaanque                      teaanqu
+fortuna                       fortun
+pulmonares                    pulmonar
+organizan                     organiz
+coello                        coell
+abaco                         abac
+colin                         colin
+hallamos                      hall
+leblanc                       leblanc
+resurgir                      resurg
+boutiques                     boutiqu
+citado                        cit
+renovar                       renov
+progresista                   progres
+normatividad                  normat
+preguntamos                   pregunt
+luminosas                     lumin
+paraíso                       parais
+empezó                        empez
+provocarán                    provoc
+pospuso                       pospus
+claros                        clar
+puedan                        pued
+alcanzará                     alcanz
+calcetines                    calcetin
+bíblico                       biblic
+mírale                        miral
+indique                       indiqu
+alivio                        alivi
+honradez                      honradez
+exclusivas                    exclus
+dinero                        diner
+tocaban                       toc
+incertidumbre                 incertidumbr
+medias                        medi
+modelos                       model
+aceptas                       acept
+capitalino                    capitalin
+modificaciones                modif
+york                          york
+ancestrales                   ancestral
+pavimentados                  paviment
+derredor                      derredor
+reiteró                       reiter
+anexos                        anex
+entrevistó                    entrevist
+refieren                      refier
+operas                        oper
diff --git a/t/test_voc/fi.default_enc b/t/test_voc/fi.default_enc
new file mode 100644
index 0000000..4379188
--- /dev/null
+++ b/t/test_voc/fi.default_enc
@@ -0,0 +1,100 @@
+imperial                      imperial
+hattu                         hatu
+ajolupaa                      ajolup
+aikoinaan                     aiko
+alaotsikon                    alaotsiko
+ahtikari                      ahtikar
+aeterna                       aeter
+hy�kk�ysvalmisteluista        hy�kk�ysvalmistelu
+erikoisedustaja               erikoisedustaj
+budjettiehdotus               budjettiehdotus
+h�meenpuistoa                 h�meenpuisto
+ajokelvottomaksi              ajokelvottom
+impola                        impol
+geneettisen                   geneettis
+hiipumassa                    hiipum
+annosmaljoihin                annosmalj
+haikeasti                     haikeast
+ammattikunnalle               ammattikun
+arvosanaksi                   arvosan
+aatetta                       aate
+ennusmerkeist�                ennusmerk
+elvytet��n                    elvyt
+hali                          hali
+bogartin                      bogart
+hyks                          hyks
+alaik�isten                   alaik�ist
+hammasl��k�rin�               hammasl��k�r
+harkittuaan                   harkitua
+alalisien                     alalis
+enteellisesti                 enteellis
+elokuvamaailman               elokuvamaailm
+aprillip�iv�n                 aprillip�iv
+ilmoitustulot                 ilmoitustulo
+asettui                       asetui
+hm                            hm
+huuska                        huusk
+hall�                         hall�
+heikinheimolle                heikinheimo
+down                          dow
+elokuviinsa                   elokuv
+antautumista                  antautum
+iltap�iv�kerhoa               iltap�iv�kerho
+helmeilee                     helmeil
+ihmisoikeusj�rjest�jen        ihmisoikeusj�rjest�j
+afasialiiton                  afasialiito
+alkuteksti�                   alkutekst
+inflatorinen                  inflatorin
+ep�kiitollista                ep�kiitol
+elinaikana                    elinaik
+gotabankeniin                 gotabanken
+groznissa                     grozn
+haukunnalla                   haukun
+hiipumassa                    hiipum
+ihastuksen                    ihastuks
+himanen                       himan
+huuhdotaan                    huuhdo
+el�kevakuutuksen              el�kevakuutuks
+heitt�ytyneet                 heitt�ytyn
+hepo                          hepo
+alabama                       alabam
+deran                         dera
+ik�vist�                      ik�v
+fasismiko                     fasism
+aateliset                     aatelis
+appassionato                  appassionato
+ihmiskehon                    ihmiskehon
+fhra                          fhra
+etel�nmatkalle                etel�nmatk
+el�misest�                    el�mis
+ilmaisuja                     ilmaisu
+iltakoulu                     iltakoulu
+hajautettu                    hajautetu
+historiaksi                   historia
+h�ss�tyst�                    h�ss�ty
+inflaatioksi                  inflaatio
+ekumeenisen                   ekumeenis
+hutulle                       hutu
+ep�puhtauksia                 ep�puhtauks
+dolen                         dole
+el�neiden                     el�n
+dunbar                        dunbar
+haltioituneesti               haltioitun
+ateriaa                       ateria
+baskeja                       baskej
+hillaryn                      hillary
+estell�                       est
+galina                        gal
+flipperi�                     flipper
+huutokauppakamarin            huutokauppakamar
+esittelev��                   esittelev
+biomekaniikan                 biomekaniik
+beste                         best
+farkkuihin                    farku
+ikuiseen                      ikuis
+aktiivivuosina                aktiivivuos
+finlandia                     finland
+holvista                      holv
+id�nkaupan                    id�nkaup
+helismaan                     helism
+atte                          at
diff --git a/t/test_voc/fi.utf8 b/t/test_voc/fi.utf8
new file mode 100644
index 0000000..d31f623
--- /dev/null
+++ b/t/test_voc/fi.utf8
@@ -0,0 +1,100 @@
+imperial                      imperial
+hattu                         hatu
+ajolupaa                      ajolup
+aikoinaan                     aiko
+alaotsikon                    alaotsiko
+ahtikari                      ahtikar
+aeterna                       aeter
+hyökkäysvalmisteluista        hyökkäysvalmistelu
+erikoisedustaja               erikoisedustaj
+budjettiehdotus               budjettiehdotus
+hämeenpuistoa                 hämeenpuisto
+ajokelvottomaksi              ajokelvottom
+impola                        impol
+geneettisen                   geneettis
+hiipumassa                    hiipum
+annosmaljoihin                annosmalj
+haikeasti                     haikeast
+ammattikunnalle               ammattikun
+arvosanaksi                   arvosan
+aatetta                       aate
+ennusmerkeistä                ennusmerk
+elvytetään                    elvyt
+hali                          hali
+bogartin                      bogart
+hyks                          hyks
+alaikäisten                   alaikäist
+hammaslääkärinä               hammaslääkär
+harkittuaan                   harkitua
+alalisien                     alalis
+enteellisesti                 enteellis
+elokuvamaailman               elokuvamaailm
+aprillipäivän                 aprillipäiv
+ilmoitustulot                 ilmoitustulo
+asettui                       asetui
+hm                            hm
+huuska                        huusk
+hallõ                         hallõ
+heikinheimolle                heikinheimo
+down                          dow
+elokuviinsa                   elokuv
+antautumista                  antautum
+iltapäiväkerhoa               iltapäiväkerho
+helmeilee                     helmeil
+ihmisoikeusjärjestöjen        ihmisoikeusjärjestöj
+afasialiiton                  afasialiito
+alkutekstiä                   alkutekst
+inflatorinen                  inflatorin
+epäkiitollista                epäkiitol
+elinaikana                    elinaik
+gotabankeniin                 gotabanken
+groznissa                     grozn
+haukunnalla                   haukun
+hiipumassa                    hiipum
+ihastuksen                    ihastuks
+himanen                       himan
+huuhdotaan                    huuhdo
+eläkevakuutuksen              eläkevakuutuks
+heittäytyneet                 heittäytyn
+hepo                          hepo
+alabama                       alabam
+deran                         dera
+ikävistä                      ikäv
+fasismiko                     fasism
+aateliset                     aatelis
+appassionato                  appassionato
+ihmiskehon                    ihmiskehon
+fhra                          fhra
+etelänmatkalle                etelänmatk
+elämisestä                    elämis
+ilmaisuja                     ilmaisu
+iltakoulu                     iltakoulu
+hajautettu                    hajautetu
+historiaksi                   historia
+hössötystä                    hössöty
+inflaatioksi                  inflaatio
+ekumeenisen                   ekumeenis
+hutulle                       hutu
+epäpuhtauksia                 epäpuhtauks
+dolen                         dole
+eläneiden                     elän
+dunbar                        dunbar
+haltioituneesti               haltioitun
+ateriaa                       ateria
+baskeja                       baskej
+hillaryn                      hillary
+estellä                       est
+galina                        gal
+flipperiä                     flipper
+huutokauppakamarin            huutokauppakamar
+esittelevää                   esittelev
+biomekaniikan                 biomekaniik
+beste                         best
+farkkuihin                    farku
+ikuiseen                      ikuis
+aktiivivuosina                aktiivivuos
+finlandia                     finland
+holvista                      holv
+idänkaupan                    idänkaup
+helismaan                     helism
+atte                          at
diff --git a/t/test_voc/fr.default_enc b/t/test_voc/fr.default_enc
new file mode 100644
index 0000000..dc5aace
--- /dev/null
+++ b/t/test_voc/fr.default_enc
@@ -0,0 +1,100 @@
+ch�tier                       ch�ti
+p�trifi�                      p�trifi
+�moustiller                   �moustill
+raidirent                     raid
+accourir                      accour
+torrent                       torrent
+cr�atures                     cr�atur
+inspiraient                   inspir
+ruin�s                        ruin
+comtesse                      comtess
+c�r�s                         c�res
+plainte                       plaint
+accordez                      accord
+impayable                     impai
+approchant                    approch
+bouder                        boud
+frilair                       frilair
+signez                        sign
+notable                       notabl
+condamne                      condamn
+conduisent                    conduisent
+demeurait                     demeur
+impatient�                    impatient
+titubant                      titub
+tra�n�                        tra�n
+aie                           aie
+anonymement                   anonym
+rejoindre                     rejoindr
+soulev�es                     soulev
+bu                            bu
+m�chait                       m�ch
+obligeant                     oblig
+ressembl�                     ressembl
+d�testerez                    d�test
+cosmopolite                   cosmopolit
+r�signation                   r�sign
+rougi                         roug
+aimables                      aimabl
+failli                        faill
+ponctuel                      ponctuel
+glaces                        glac
+ladri                         ladr
+pipes                         pip
+diction                       diction
+apparente                     apparent
+inhalation                    inhal
+culte                         cult
+astrologues                   astrologu
+meubl�e                       meubl
+d�contenanc�                  d�contenanc
+tutoiement                    tutoi
+enregistrer                   enregistr
+froissa                       froiss
+offrira                       offrir
+gentle                        gentl
+�chut                         �chut
+statuaire                     statuair
+install�                      install
+annales                       annal
+emp�chez                      emp�ch
+estafier                      estafi
+bris�es                       bris
+travers�e                     travers
+grilles                       grill
+devins                        devin
+persuader                     persuad
+quelquefois                   quelquefois
+mormon                        mormon
+grimer                        grim
+consid�r�                     consider
+r�volutionnaires              r�volutionnair
+oubliant                      oubli
+galons                        galon
+to                            to
+pouvait                       pouv
+convenaient                   conven
+charg�e                       charg
+tombeaux                      tombeau
+p�nurie                       p�nur
+d�tourn�                      d�tourn
+accost�                       accost
+rousseau                      rousseau
+recruter                      recrut
+demesurement                  demesur
+coquets                       coquet
+immoralit�                    immoral
+lugubres                      lugubr
+longues                       longu
+contravention                 contravent
+bouger                        boug
+regards                       regard
+troupes                       troup
+ressuscit�                    ressusc
+provoquait                    provoqu
+patron                        patron
+pu                            pu
+confession                    confess
+sorts                         sort
+callyan                       callyan
+conclusion                    conclus
diff --git a/t/test_voc/fr.utf8 b/t/test_voc/fr.utf8
new file mode 100644
index 0000000..70dd8f0
--- /dev/null
+++ b/t/test_voc/fr.utf8
@@ -0,0 +1,100 @@
+châtier                       châti
+pétrifié                      pétrifi
+émoustiller                   émoustill
+raidirent                     raid
+accourir                      accour
+torrent                       torrent
+créatures                     créatur
+inspiraient                   inspir
+ruinés                        ruin
+comtesse                      comtess
+cérès                         céres
+plainte                       plaint
+accordez                      accord
+impayable                     impai
+approchant                    approch
+bouder                        boud
+frilair                       frilair
+signez                        sign
+notable                       notabl
+condamne                      condamn
+conduisent                    conduisent
+demeurait                     demeur
+impatienté                    impatient
+titubant                      titub
+traîné                        traîn
+aie                           aie
+anonymement                   anonym
+rejoindre                     rejoindr
+soulevées                     soulev
+bu                            bu
+mâchait                       mâch
+obligeant                     oblig
+ressemblé                     ressembl
+détesterez                    détest
+cosmopolite                   cosmopolit
+résignation                   résign
+rougi                         roug
+aimables                      aimabl
+failli                        faill
+ponctuel                      ponctuel
+glaces                        glac
+ladri                         ladr
+pipes                         pip
+diction                       diction
+apparente                     apparent
+inhalation                    inhal
+culte                         cult
+astrologues                   astrologu
+meublée                       meubl
+décontenancé                  décontenanc
+tutoiement                    tutoi
+enregistrer                   enregistr
+froissa                       froiss
+offrira                       offrir
+gentle                        gentl
+échut                         échut
+statuaire                     statuair
+installé                      install
+annales                       annal
+empêchez                      empêch
+estafier                      estafi
+brisées                       bris
+traversée                     travers
+grilles                       grill
+devins                        devin
+persuader                     persuad
+quelquefois                   quelquefois
+mormon                        mormon
+grimer                        grim
+considéré                     consider
+révolutionnaires              révolutionnair
+oubliant                      oubli
+galons                        galon
+to                            to
+pouvait                       pouv
+convenaient                   conven
+chargée                       charg
+tombeaux                      tombeau
+pénurie                       pénur
+détourné                      détourn
+accosté                       accost
+rousseau                      rousseau
+recruter                      recrut
+demesurement                  demesur
+coquets                       coquet
+immoralité                    immoral
+lugubres                      lugubr
+longues                       longu
+contravention                 contravent
+bouger                        boug
+regards                       regard
+troupes                       troup
+ressuscité                    ressusc
+provoquait                    provoqu
+patron                        patron
+pu                            pu
+confession                    confess
+sorts                         sort
+callyan                       callyan
+conclusion                    conclus
diff --git a/t/test_voc/it.default_enc b/t/test_voc/it.default_enc
new file mode 100644
index 0000000..d8c7789
--- /dev/null
+++ b/t/test_voc/it.default_enc
@@ -0,0 +1,100 @@
+faccian                       faccian
+calcistiche                   calcist
+rolomix                       rolomix
+nessuno                       nessun
+verbo                         verb
+fa                            fa
+doglia                        dogl
+butter�                       butt
+consumare                     consum
+spegnendo                     spegn
+pressava                      press
+segnala                       segnal
+marpol                        marpol
+assumer�                      assum
+voti                          vot
+me                            me
+involtati                     involt
+tristissima                   tristissim
+strame                        stram
+flessori                      flessor
+strascicarono                 strascic
+tartassati                    tartass
+colb�                         colb
+prov�                         prov
+partono                       part
+enrico                        enric
+ingaggi                       ingagg
+ricalcare                     ricalc
+interista                     inter
+particolarmente               particolar
+cura                          cur
+gagliarda                     gagliard
+ciriaco                       ciriac
+nastri                        nastr
+adamo                         adam
+ricordano                     ricord
+tendevan                      tendevan
+caterina                      caterin
+competesse                    competess
+portiere                      port
+chiarimento                   chiar
+attuazione                    attuazion
+accatastata                   accatast
+compromissione                compromission
+decidendo                     decid
+cioccolata                    cioccol
+carattere                     caratt
+sensibile                     sensibil
+osservatore                   osserv
+compatirsi                    compat
+introdurvi                    introdurv
+citavano                      cit
+alkan                         alkan
+autostrada                    autostrad
+adoprerebbe                   adopr
+crescono                      cresc
+kladusa                       kladus
+affrontano                    affront
+salerno                       salern
+roccaforte                    roccafort
+gabinetto                     gabinett
+convitati                     convit
+bastandogli                   bast
+olcese                        olces
+affar                         affar
+parchi                        parc
+contestata                    contest
+perdendo                      perd
+assenzio                      assenz
+brivio                        briv
+davanzali                     davanzal
+aggiungeranno                 aggiung
+borrini                       borrin
+rimprovera                    rimprover
+badar                         bad
+scartafaccio                  scartafacc
+scambievolmente               scambievol
+risolutezza                   risolutezz
+scalzacane                    scalzacan
+editto                        editt
+orientamento                  orient
+introducendone                introduc
+raccostando                   raccost
+persegue                      persegu
+successivo                    success
+prospettata                   prospett
+accarezzarla                  accarezz
+lentezza                      lentezz
+investiti                     invest
+part                          part
+aventi                        avent
+tonini                        tonin
+ucciderlo                     uccid
+ipotesi                       ipotes
+pap�                          pap
+scompariva                    scompar
+anno                          anno
+tocci                         tocc
+ricompariva                   ricompar
+sospetto                      sospett
diff --git a/t/test_voc/it.utf8 b/t/test_voc/it.utf8
new file mode 100644
index 0000000..bbce102
--- /dev/null
+++ b/t/test_voc/it.utf8
@@ -0,0 +1,100 @@
+faccian                       faccian
+calcistiche                   calcist
+rolomix                       rolomix
+nessuno                       nessun
+verbo                         verb
+fa                            fa
+doglia                        dogl
+butterò                       butt
+consumare                     consum
+spegnendo                     spegn
+pressava                      press
+segnala                       segnal
+marpol                        marpol
+assumerà                      assum
+voti                          vot
+me                            me
+involtati                     involt
+tristissima                   tristissim
+strame                        stram
+flessori                      flessor
+strascicarono                 strascic
+tartassati                    tartass
+colbò                         colb
+provò                         prov
+partono                       part
+enrico                        enric
+ingaggi                       ingagg
+ricalcare                     ricalc
+interista                     inter
+particolarmente               particolar
+cura                          cur
+gagliarda                     gagliard
+ciriaco                       ciriac
+nastri                        nastr
+adamo                         adam
+ricordano                     ricord
+tendevan                      tendevan
+caterina                      caterin
+competesse                    competess
+portiere                      port
+chiarimento                   chiar
+attuazione                    attuazion
+accatastata                   accatast
+compromissione                compromission
+decidendo                     decid
+cioccolata                    cioccol
+carattere                     caratt
+sensibile                     sensibil
+osservatore                   osserv
+compatirsi                    compat
+introdurvi                    introdurv
+citavano                      cit
+alkan                         alkan
+autostrada                    autostrad
+adoprerebbe                   adopr
+crescono                      cresc
+kladusa                       kladus
+affrontano                    affront
+salerno                       salern
+roccaforte                    roccafort
+gabinetto                     gabinett
+convitati                     convit
+bastandogli                   bast
+olcese                        olces
+affar                         affar
+parchi                        parc
+contestata                    contest
+perdendo                      perd
+assenzio                      assenz
+brivio                        briv
+davanzali                     davanzal
+aggiungeranno                 aggiung
+borrini                       borrin
+rimprovera                    rimprover
+badar                         bad
+scartafaccio                  scartafacc
+scambievolmente               scambievol
+risolutezza                   risolutezz
+scalzacane                    scalzacan
+editto                        editt
+orientamento                  orient
+introducendone                introduc
+raccostando                   raccost
+persegue                      persegu
+successivo                    success
+prospettata                   prospett
+accarezzarla                  accarezz
+lentezza                      lentezz
+investiti                     invest
+part                          part
+aventi                        avent
+tonini                        tonin
+ucciderlo                     uccid
+ipotesi                       ipotes
+papà                          pap
+scompariva                    scompar
+anno                          anno
+tocci                         tocc
+ricompariva                   ricompar
+sospetto                      sospett
diff --git a/t/test_voc/nl.default_enc b/t/test_voc/nl.default_enc
new file mode 100644
index 0000000..cf3863e
--- /dev/null
+++ b/t/test_voc/nl.default_enc
@@ -0,0 +1,100 @@
+vooraanstaande                vooraanstaand
+vasteland                     vasteland
+terugvond                     terugvond
+wilton                        wilton
+betrof                        betrof
+buffer                        buffer
+mexico                        mexico
+esva                          esva
+uitgevaagd                    uitgevaagd
+aangemerkt                    aangemerkt
+deinende                      deinend
+spaargeld                     spaargeld
+ierland                       ierland
+uitgewisseld                  uitgewisseld
+droog                         drog
+saneringscentra               saneringscentra
+kastrup                       kastrup
+duizelde                      duizeld
+symboolwerking                symboolwerk
+afvalsoort                    afvalsoort
+wittig                        wittig
+koperoxyde                    koperoxyd
+glaswol                       glaswol
+herhalen                      herhal
+modale                        modal
+d�chue                        dechue
+families                      families
+schrap                        schrap
+woonbebouwing                 woonbebouw
+afgezwakt                     afgezwakt
+westertocht                   westertocht
+naliep                        naliep
+aanhang                       aanhang
+hoofdproblemen                hoofdproblem
+elhorst                       elhorst
+stroomvoorzieningssysteem     stroomvoorzieningssystem
+aardolie                      aardolie
+voorstelt                     voorstelt
+reserves                      reserves
+ladingen                      lading
+euregio                       euregio
+ethylbenzeen                  ethylbenzen
+hydrologische                 hydrologisch
+rioolbuis                     rioolbuis
+grelle                        grell
+vestigde                      vestigd
+hygi�ne                       hygien
+flacons                       flacon
+level                         level
+concrete                      concret
+koopkracht                    koopkracht
+termijnmarkt                  termijnmarkt
+meeslepen                     meeslep
+zeehondenjagers               zeehondenjager
+proporties                    proporties
+gefrankeerd                   gefrankeerd
+praat                         prat
+afvalstromen                  afvalstrom
+bruusk                        bruusk
+haakwerk                      haakwerk
+verkochten                    verkocht
+bezoekers                     bezoeker
+rivierbeheer                  rivierbeher
+katalytische                  katalytisch
+flirt                         flirt
+greater                       greater
+plafondpanelen                plafondpanel
+biomassaproducerende          biomassaproducer
+kiesschijf                    kiesschijf
+mevrouw                       mevrouw
+opzoekt                       opzoekt
+heidebrand                    heidebrand
+nblf                          nblf
+uitspaart                     uitspaart
+gemodelleerd                  gemodelleerd
+waterrecreanten               waterrecreant
+batterijhouder                batterijhouder
+grijnzen                      grijnz
+verwazigd                     verwazigd
+imdmicon                      imdmicon
+egaliseren                    egaliser
+injecteert                    injecteert
+verheugd                      verheugd
+verlangens                    verlangen
+waddeninspectie               waddeninspectie
+afgeschoten                   afgeschot
+abatement                     abatement
+wijkverwarmingsnet            wijkverwarmingsnet
+phyteuma                      phyteuma
+gevaar                        gevar
+overheidssubsidie             overheidssubsidie
+steunen                       steun
+bouwterreinen                 bouwterrein
+opwerpen                      opwerp
+kellner                       kellner
+fibers                        fiber
+kostte                        kost
+verbindingszone               verbindingszon
+korrelmix                     korrelmix
+milieuonvriendelijke          milieuonvriend
diff --git a/t/test_voc/nl.utf8 b/t/test_voc/nl.utf8
new file mode 100644
index 0000000..bb60951
--- /dev/null
+++ b/t/test_voc/nl.utf8
@@ -0,0 +1,100 @@
+vooraanstaande                vooraanstaand
+vasteland                     vasteland
+terugvond                     terugvond
+wilton                        wilton
+betrof                        betrof
+buffer                        buffer
+mexico                        mexico
+esva                          esva
+uitgevaagd                    uitgevaagd
+aangemerkt                    aangemerkt
+deinende                      deinend
+spaargeld                     spaargeld
+ierland                       ierland
+uitgewisseld                  uitgewisseld
+droog                         drog
+saneringscentra               saneringscentra
+kastrup                       kastrup
+duizelde                      duizeld
+symboolwerking                symboolwerk
+afvalsoort                    afvalsoort
+wittig                        wittig
+koperoxyde                    koperoxyd
+glaswol                       glaswol
+herhalen                      herhal
+modale                        modal
+déchue                        dechue
+families                      families
+schrap                        schrap
+woonbebouwing                 woonbebouw
+afgezwakt                     afgezwakt
+westertocht                   westertocht
+naliep                        naliep
+aanhang                       aanhang
+hoofdproblemen                hoofdproblem
+elhorst                       elhorst
+stroomvoorzieningssysteem     stroomvoorzieningssystem
+aardolie                      aardolie
+voorstelt                     voorstelt
+reserves                      reserves
+ladingen                      lading
+euregio                       euregio
+ethylbenzeen                  ethylbenzen
+hydrologische                 hydrologisch
+rioolbuis                     rioolbuis
+grelle                        grell
+vestigde                      vestigd
+hygiëne                       hygien
+flacons                       flacon
+level                         level
+concrete                      concret
+koopkracht                    koopkracht
+termijnmarkt                  termijnmarkt
+meeslepen                     meeslep
+zeehondenjagers               zeehondenjager
+proporties                    proporties
+gefrankeerd                   gefrankeerd
+praat                         prat
+afvalstromen                  afvalstrom
+bruusk                        bruusk
+haakwerk                      haakwerk
+verkochten                    verkocht
+bezoekers                     bezoeker
+rivierbeheer                  rivierbeher
+katalytische                  katalytisch
+flirt                         flirt
+greater                       greater
+plafondpanelen                plafondpanel
+biomassaproducerende          biomassaproducer
+kiesschijf                    kiesschijf
+mevrouw                       mevrouw
+opzoekt                       opzoekt
+heidebrand                    heidebrand
+nblf                          nblf
+uitspaart                     uitspaart
+gemodelleerd                  gemodelleerd
+waterrecreanten               waterrecreant
+batterijhouder                batterijhouder
+grijnzen                      grijnz
+verwazigd                     verwazigd
+imdmicon                      imdmicon
+egaliseren                    egaliser
+injecteert                    injecteert
+verheugd                      verheugd
+verlangens                    verlangen
+waddeninspectie               waddeninspectie
+afgeschoten                   afgeschot
+abatement                     abatement
+wijkverwarmingsnet            wijkverwarmingsnet
+phyteuma                      phyteuma
+gevaar                        gevar
+overheidssubsidie             overheidssubsidie
+steunen                       steun
+bouwterreinen                 bouwterrein
+opwerpen                      opwerp
+kellner                       kellner
+fibers                        fiber
+kostte                        kost
+verbindingszone               verbindingszon
+korrelmix                     korrelmix
+milieuonvriendelijke          milieuonvriend
diff --git a/t/test_voc/no.default_enc b/t/test_voc/no.default_enc
new file mode 100644
index 0000000..138ac0c
--- /dev/null
+++ b/t/test_voc/no.default_enc
@@ -0,0 +1,100 @@
+meld                          meld
+barnebarn                     barnebarn
+edw                           edw
+linjene                       linj
+nybygging                     nybygging
+vilk�rene                     vilk�r
+skattereglane                 skatteregl
+sl�ret                        sl�r
+adresser                      adress
+l�nnsgrunnlag                 l�nnsgrunnlag
+brukarar                      brukar
+inntektsbeskatning            inntektsbeskatning
+tillatne                      tillatn
+tolv                          tolv
+kommersielle                  kommersiell
+akademikernes                 akademikern
+samvirkeutvalget              samvirkeutvalg
+slangen                       slang
+menja                         menj
+dekk                          dekk
+dr�fta                        dr�ft
+kontrollere                   kontroller
+langesundsfjorden             langesundsfjord
+vetoet                        veto
+gjennomf�rte                  gjennomf�rt
+tidshorisonten                tidshorisont
+sj�kart                       sj�kart
+gutten                        gutt
+tom                           tom
+krokrygget                    krokrygg
+aksjon�r                      aksjon�r
+�kningene                     �kning
+gripe                         grip
+ombygginga                    ombygging
+fordelane                     fordel
+veksten                       vekst
+misvisande                    misvis
+markeds                       marked
+kystsoneplan                  kystsoneplan
+samvirkepreget                samvirkepreg
+containervekst                containervekst
+same                          sam
+derigjennom                   derigjennom
+likviditetsbehov              likviditetsbehov
+h�yst                         h�yst
+borge                         borg
+spareinnskota                 spareinnskot
+lilleholt                     lilleholt
+forsvinne                     forsvinn
+terminallokalisering          terminallokalisering
+omveg                         omveg
+ferden                        ferd
+varemedlemmer                 varemedlemm
+containeriseringsgraden       containeriseringsgrad
+yrkesut�var                   yrkesut�v
+avleggjast                    avleggj
+kristeleg                     krist
+snille                        snill
+heftet                        heft
+siktes                        sikt
+ormsundkaia                   ormsundkai
+tilleggsytelser               tilleggsyt
+lese                          les
+kvalifikasjonar               kvalifikasjon
+bustadfornying                bustadfornying
+spareinnskota                 spareinnskot
+sjurs�ya                      sjurs�y
+sleper                        slep
+stanser                       stans
+flakvarpomr�det               flakvarpomr�d
+ugjerningsmenn                ugjerningsmenn
+arena                         aren
+trykker                       trykk
+fjellkl�ft                    fjellkl�ft
+kredittilsynsloven            kredittilsyn
+tilsvarande                   tilsvar
+dvergen                       dverg
+presser                       press
+buskerud                      buskerud
+gror                          gror
+styret                        styr
+inntektsgrunnlag              inntektsgrunnlag
+tjene                         tjen
+pekefinger                    pekefing
+oppf�ringa                    oppf�ring
+dagens                        dag
+skeive                        skeiv
+roll                          roll
+refererte                     referer
+l�ysingar                     l�ysing
+bel�psgrense                  bel�psgrens
+utbyggings                    utbygging
+rastl�sheten                  rastl�s
+konkurrerande                 konkurrer
+domstolane                    domstol
+har                           har
+l�rene                        l�r
+summende                      summ
+stamvegnettet                 stamvegnett
+svinekj�tt                    svinekj�tt
diff --git a/t/test_voc/no.utf8 b/t/test_voc/no.utf8
new file mode 100644
index 0000000..58afe7b
--- /dev/null
+++ b/t/test_voc/no.utf8
@@ -0,0 +1,100 @@
+meld                          meld
+barnebarn                     barnebarn
+edw                           edw
+linjene                       linj
+nybygging                     nybygging
+vilkårene                     vilkår
+skattereglane                 skatteregl
+sløret                        slør
+adresser                      adress
+lønnsgrunnlag                 lønnsgrunnlag
+brukarar                      brukar
+inntektsbeskatning            inntektsbeskatning
+tillatne                      tillatn
+tolv                          tolv
+kommersielle                  kommersiell
+akademikernes                 akademikern
+samvirkeutvalget              samvirkeutvalg
+slangen                       slang
+menja                         menj
+dekk                          dekk
+drøfta                        drøft
+kontrollere                   kontroller
+langesundsfjorden             langesundsfjord
+vetoet                        veto
+gjennomførte                  gjennomført
+tidshorisonten                tidshorisont
+sjøkart                       sjøkart
+gutten                        gutt
+tom                           tom
+krokrygget                    krokrygg
+aksjonær                      aksjonær
+økningene                     økning
+gripe                         grip
+ombygginga                    ombygging
+fordelane                     fordel
+veksten                       vekst
+misvisande                    misvis
+markeds                       marked
+kystsoneplan                  kystsoneplan
+samvirkepreget                samvirkepreg
+containervekst                containervekst
+same                          sam
+derigjennom                   derigjennom
+likviditetsbehov              likviditetsbehov
+høyst                         høyst
+borge                         borg
+spareinnskota                 spareinnskot
+lilleholt                     lilleholt
+forsvinne                     forsvinn
+terminallokalisering          terminallokalisering
+omveg                         omveg
+ferden                        ferd
+varemedlemmer                 varemedlemm
+containeriseringsgraden       containeriseringsgrad
+yrkesutøvar                   yrkesutøv
+avleggjast                    avleggj
+kristeleg                     krist
+snille                        snill
+heftet                        heft
+siktes                        sikt
+ormsundkaia                   ormsundkai
+tilleggsytelser               tilleggsyt
+lese                          les
+kvalifikasjonar               kvalifikasjon
+bustadfornying                bustadfornying
+spareinnskota                 spareinnskot
+sjursøya                      sjursøy
+sleper                        slep
+stanser                       stans
+flakvarpområdet               flakvarpområd
+ugjerningsmenn                ugjerningsmenn
+arena                         aren
+trykker                       trykk
+fjellkløft                    fjellkløft
+kredittilsynsloven            kredittilsyn
+tilsvarande                   tilsvar
+dvergen                       dverg
+presser                       press
+buskerud                      buskerud
+gror                          gror
+styret                        styr
+inntektsgrunnlag              inntektsgrunnlag
+tjene                         tjen
+pekefinger                    pekefing
+oppføringa                    oppføring
+dagens                        dag
+skeive                        skeiv
+roll                          roll
+refererte                     referer
+løysingar                     løysing
+beløpsgrense                  beløpsgrens
+utbyggings                    utbygging
+rastløsheten                  rastløs
+konkurrerande                 konkurrer
+domstolane                    domstol
+har                           har
+lårene                        lår
+summende                      summ
+stamvegnettet                 stamvegnett
+svinekjøtt                    svinekjøtt
diff --git a/t/test_voc/pt.default_enc b/t/test_voc/pt.default_enc
new file mode 100644
index 0000000..0345b36
--- /dev/null
+++ b/t/test_voc/pt.default_enc
@@ -0,0 +1,100 @@
+beltr�o                       beltr�
+feixe                         feix
+media��o                      media��
+f�sicas                       f�sic
+transe                        trans
+cores                         cor
+fundadoras                    fundador
+voavam                        voav
+apostador                     apost
+atestada                      atest
+liquide                       liquid
+hubert                        hubert
+inalcan��veis                 inalcanc
+ofere�a                       oferec
+cyrus                         cyrus
+tio                           tio
+cont�gio                      cont�gi
+mundana                       mundan
+grape                         grap
+ir�                           ir�
+swissbank                     swissbank
+ousado                        ous
+fornecedoras                  fornecedor
+passaram                      pass
+poltronas                     poltron
+rotulando                     rotul
+portanto                      portant
+finalizado                    finaliz
+franca                        franc
+incentivamos                  incentiv
+tornozelo                     tornozel
+reproduzir                    reproduz
+cruzamentos                   cruzament
+espacial                      espacial
+qubilah                       qubilah
+agr�nomo                      agr�nom
+admira                        admir
+dessem                        dess
+infi�is                       infi
+poupou                        poup
+ironia                        iron
+gestor                        gestor
+amizades                      amizad
+food                          food
+encruzilhadas                 encruzilh
+olh�                          olh�
+descobrimos                   descobr
+protetores                    protetor
+constru��es                   constru��
+metr�poles                    metr�pol
+teoricamente                  teoric
+velas                         vel
+mick                          mick
+apologia                      apolog
+nominalmente                  nominal
+vistas                        vist
+pico                          pic
+boto                          bot
+implementem                   implement
+acess�vel                     acess
+desconhecido                  desconhec
+argentina                     argentin
+salgadinhos                   salgadinh
+adequada                      adequ
+s�ries                        s�ri
+zita                          zit
+acreditavam                   acredit
+maneira                       maneir
+interrogando                  interrog
+ar�sio                        ar�si
+sucederam                     suced
+televisiva                    televis
+tucanos                       tucan
+torta                         tort
+falcatruas                    falcatru
+euforia                       eufor
+kraft                         kraft
+contida                       cont
+custam                        cust
+fatias                        fat
+esquecemos                    esquec
+operamos                      oper
+corria                        corr
+atingisse                     ating
+indica��es                    indic
+massifica��o                  massific
+l�dico                        l�dic
+queda                         qued
+edmund                        edmund
+dumont                        dumont
+cinq�enten�rio                cinq�enten�ri
+seres                         ser
+berimbaus                     berimbaus
+assassinada                   assassin
+adriana                       adrian
+f�rmica                       f�rmic
+inspecionar                   inspecion
+realmente                     realment
+visible                       visibl
+moramos                       mor
diff --git a/t/test_voc/pt.utf8 b/t/test_voc/pt.utf8
new file mode 100644
index 0000000..a2cbbbf
--- /dev/null
+++ b/t/test_voc/pt.utf8
@@ -0,0 +1,100 @@
+beltrão                       beltrã
+feixe                         feix
+mediação                      mediaçã
+físicas                       físic
+transe                        trans
+cores                         cor
+fundadoras                    fundador
+voavam                        voav
+apostador                     apost
+atestada                      atest
+liquide                       liquid
+hubert                        hubert
+inalcançáveis                 inalcanc
+ofereça                       oferec
+cyrus                         cyrus
+tio                           tio
+contágio                      contági
+mundana                       mundan
+grape                         grap
+irã                           irã
+swissbank                     swissbank
+ousado                        ous
+fornecedoras                  fornecedor
+passaram                      pass
+poltronas                     poltron
+rotulando                     rotul
+portanto                      portant
+finalizado                    finaliz
+franca                        franc
+incentivamos                  incentiv
+tornozelo                     tornozel
+reproduzir                    reproduz
+cruzamentos                   cruzament
+espacial                      espacial
+qubilah                       qubilah
+agrônomo                      agrônom
+admira                        admir
+dessem                        dess
+infiéis                       infi
+poupou                        poup
+ironia                        iron
+gestor                        gestor
+amizades                      amizad
+food                          food
+encruzilhadas                 encruzilh
+olhá                          olhá
+descobrimos                   descobr
+protetores                    protetor
+construções                   construçõ
+metrópoles                    metrópol
+teoricamente                  teoric
+velas                         vel
+mick                          mick
+apologia                      apolog
+nominalmente                  nominal
+vistas                        vist
+pico                          pic
+boto                          bot
+implementem                   implement
+acessível                     acess
+desconhecido                  desconhec
+argentina                     argentin
+salgadinhos                   salgadinh
+adequada                      adequ
+séries                        séri
+zita                          zit
+acreditavam                   acredit
+maneira                       maneir
+interrogando                  interrog
+arósio                        arósi
+sucederam                     suced
+televisiva                    televis
+tucanos                       tucan
+torta                         tort
+falcatruas                    falcatru
+euforia                       eufor
+kraft                         kraft
+contida                       cont
+custam                        cust
+fatias                        fat
+esquecemos                    esquec
+operamos                      oper
+corria                        corr
+atingisse                     ating
+indicações                    indic
+massificação                  massific
+lúdico                        lúdic
+queda                         qued
+edmund                        edmund
+dumont                        dumont
+cinqüentenário                cinqüentenári
+seres                         ser
+berimbaus                     berimbaus
+assassinada                   assassin
+adriana                       adrian
+fórmica                       fórmic
+inspecionar                   inspecion
+realmente                     realment
+visible                       visibl
+moramos                       mor
diff --git a/t/test_voc/ru.default_enc b/t/test_voc/ru.default_enc
new file mode 100644
index 0000000..0de615c
--- /dev/null
+++ b/t/test_voc/ru.default_enc
@@ -0,0 +1,100 @@
+�����������                   ���������
+������                        �����
+�������                       �����
+���������                     �������
+�������                       ������
+�����                         ���
+�����                         �����
+���������                     �������
+���������                     �������
+�������                       �����
+��������                      ������
+����������                    ��������
+��������                      �������
+������                        �����
+�����                         �����
+��������                      �����
+������������                  ����������
+���������                     �����
+����                          ���
+�����������                   �������
+����������                    �������
+������                        ����
+��������                      �����
+�������                       �����
+����������                    �����
+���������                     ������
+������                        ����
+�������                       �������
+���������                     ������
+���������                     �������
+���                           ��
+�������������                 �����������
+������������                  ���������
+�������                       ������
+������                        ���
+��������                      �����
+�������                       �����
+�������                       �����
+�������                       ������
+������                        ����
+������                        �����
+������                        ����
+����                          ����
+������                        ����
+�������                       �����
+��������                      ������
+�����������                   ���������
+������������                  ����������
+�������                       �������
+������                        ����
+������                        ����
+��������                      ������
+�������                       ������
+�����������                   �������
+������                        �����
+�����������                   ��������
+������                        ������
+�����������                   ���������
+���������                     �����
+�������                       ������
+���������                     ���������
+���������������               �������������
+��������                      ������
+���������                     ��������
+������                        ����
+��������                      �����
+��������                      ��������
+���������                     ������
+���������                     ������
+��������                      �����
+����������                    ��������
+�������������                 ������
+��������                      ����
+������                        ����
+����������                    ��������
+���������                     ����
+������������                  ��������
+�������                       ����
+�������                       ������
+�������                       �����
+������������                  ��������
+��������������                ������������
+���������                     ���������
+������                        ����
+��������                      �������
+��������                      ������
+�����������                   ��������
+�������                       �����
+�����������                   ����������
+��������                      ������
+�����������                   ����������
+������                        �����
+���������                     �������
+�������                       �����
+������                        �����
+��������                      ������
+�������                       �����
+�����������                   ���������
+������                        �����
+��������                      �����
diff --git a/t/test_voc/ru.utf8 b/t/test_voc/ru.utf8
new file mode 100644
index 0000000..5c2505d
--- /dev/null
+++ b/t/test_voc/ru.utf8
@@ -0,0 +1,100 @@
+нетерепении                   нетерепен
+выпита                        выпит
+намекам                       намек
+клеверных                     клеверн
+дремота                       дремот
+любят                         люб
+навел                         навел
+необычный                     необычн
+дремлющим                     дремлющ
+внешняя                       внешн
+железная                      железн
+переживала                    пережива
+заставал                      застава
+потеря                        потер
+очерк                         очерк
+гнусными                      гнусн
+корреджиевой                  корреджиев
+веселости                     весел
+моря                          мор
+отверзалось                   отверза
+прибавлено                    прибавл
+впился                        впил
+быстрого                      быстр
+париком                       парик
+избавились                    избав
+вспомнишь                     вспомн
+рожком                        рожк
+троицын                       троицын
+изысканно                     изыска
+пропадала                     пропада
+эру                           эр
+благоразумная                 благоразумн
+призадумался                  призадума
+барышню                       барышн
+решили                        реш
+уступить                      уступ
+семенит                       семен
+смуглый                       смугл
+миколки                       миколк
+свежая                        свеж
+лошади                        лошад
+платим                        плат
+льют                          льют
+всякие                        всяк
+отворил                       отвор
+червовый                      червов
+выговаривая                   выговарив
+неизъяснимых                  неизъясним
+дневник                       дневник
+семгой                        семг
+утащил                        утащ
+пустынна                      пустын
+публика                       публик
+поджигающее                   поджига
+людски                        людск
+раскаленные                   раскален
+плевок                        плевок
+гражданской                   гражданск
+венчаться                     венча
+моменты                       момент
+цирюльник                     цирюльник
+народонаселения               народонаселен
+принятая                      принят
+вавиловка                     вавиловк
+зрению                        зрен
+съездить                      съезд
+протокол                      протокол
+задавайте                     задава
+зачитался                     зачита
+сватался                      свата
+сотрясения                    сотрясен
+повторившееся                 повтор
+сватаясь                      сват
+грехов                        грех
+командиром                    командир
+заспишься                     засп
+устраиваются                  устраива
+длилось                       длил
+лежанку                       лежанк
+илистом                       илист
+вслушиваться                  вслушива
+неповоротливом                неповоротлив
+результат                     результат
+плавит                        плав
+пронизан                      прониза
+запястья                      запяст
+испорченные                   испорчен
+дырявые                       дыряв
+поддерживал                   поддержива
+свадьбой                      свадьб
+исповедовал                   исповедова
+пороху                        порох
+тщеславии                     тщеслав
+шоркает                       шорка
+власти                        власт
+горевший                      горевш
+гладкие                       гладк
+властвовала                   властвова
+указав                        указа
+срываешь                      срыва
diff --git a/t/test_voc/sv.default_enc b/t/test_voc/sv.default_enc
new file mode 100644
index 0000000..276d246
--- /dev/null
+++ b/t/test_voc/sv.default_enc
@@ -0,0 +1,100 @@
+skrubba                       skrubb
+farmor                        farm
+f�rl�jliga                    f�rl�j
+kr�kningar                    kr�kning
+�gonlock                      �gonlock
+pl�tslig                      pl�ts
+hycklare                      hyckl
+pung                          pung
+math�mtaren                   math�mt
+angelal                       angelal
+leverne                       levern
+bj�rtat                       bj�rt
+sofver                        sofv
+bibeh�lla                     bibeh�ll
+gudadryck                     gudadryck
+sokt                          sokt
+kv�llsvard                    kv�llsvard
+styvfader                     styvfad
+�gna                          �gn
+fodcr                         fodcr
+plus                          plus
+br�dd                         br�dd
+tillbalka                     tillbalk
+undgick                       undgick
+hur                           hur
+uppenbar                      uppenb
+d�rn�st                       d�rn�st
+slaktat                       slakt
+pro                           pro
+ied                           ied
+gladlynt                      gladlynt
+klandra                       klandr
+v�rmande                      v�rm
+t�nkarna                      t�nk
+bog                           bog
+nosade                        nos
+framkalladt                   framkallad
+dragsh�llaren                 dragsh�ll
+omt�nksamhet                  omt�nksam
+opel                          opel
+sloka                         slok
+pr�vade                       pr�v
+symbol                        symbol
+sockenbor                     sockenb
+familjebjudningarna           familjebjudning
+s�ren                         s�r
+timrar                        timr
+upptr�dde                     upptr�d
+tager                         tag
+toge                          tog
+drunknade                     drunkn
+gl�mska                       gl�msk
+friare                        friar
+kontraster                    kontrast
+dalar                         dal
+i�rde                         i�rd
+n�mnt                         n�mnt
+s�rjer                        s�rj
+minuters                      minuter
+bro                           bro
+uppf�dda                      uppf�d
+vaksamma                      vaksamm
+fr�jds                        fr�jd
+behjertat                     behjert
+m�nga                         m�ng
+g�mde                         g�md
+uppfriskande                  uppfrisk
+forstorad                     forstor
+sp�rrade                      sp�rr
+fr�knig                       fr�kn
+krist                         krist
+droska                        drosk
+reta                          ret
+bortbytt                      bortbyt
+meddelat                      meddel
+plumpa                        plump
+skrynklade                    skrynkl
+berest                        berest
+v�lvilliga                    v�lvil
+d�d                           d�d
+skilde                        skild
+h�rdt                         h�rd
+kyrkog�rdsh�rnet              kyrkog�rdsh�rnet
+batar                         bat
+tr�ttnat                      tr�ttn
+lydiga                        lyd
+betala                        betal
+f�rv�rvt                      f�rv�rvt
+afsteg                        afsteg
+honett                        honet
+v�ggarne                      v�gg
+v�rkarna                      v�rk
+b�fvat                        b�fv
+gymnasiitid                   gymnasiitid
+handlingss�tt                 handlingss�t
+s�ndagsf�rmiddag              s�ndagsf�rmiddag
+f�rgprakt                     f�rgprak
+trassel                       trassel
+kerstins                      kerstin
+farande                       far
diff --git a/t/test_voc/sv.utf8 b/t/test_voc/sv.utf8
new file mode 100644
index 0000000..1697832
--- /dev/null
+++ b/t/test_voc/sv.utf8
@@ -0,0 +1,100 @@
+skrubba                       skrubb
+farmor                        farm
+förlöjliga                    förlöj
+krökningar                    krökning
+ögonlock                      ögonlock
+plötslig                      plöts
+hycklare                      hyckl
+pung                          pung
+mathämtaren                   mathämt
+angelal                       angelal
+leverne                       levern
+bjärtat                       bjärt
+sofver                        sofv
+bibehålla                     bibehåll
+gudadryck                     gudadryck
+sokt                          sokt
+kvällsvard                    kvällsvard
+styvfader                     styvfad
+ögna                          ögn
+fodcr                         fodcr
+plus                          plus
+brädd                         brädd
+tillbalka                     tillbalk
+undgick                       undgick
+hur                           hur
+uppenbar                      uppenb
+därnäst                       därnäst
+slaktat                       slakt
+pro                           pro
+ied                           ied
+gladlynt                      gladlynt
+klandra                       klandr
+värmande                      värm
+tänkarna                      tänk
+bog                           bog
+nosade                        nos
+framkalladt                   framkallad
+dragshållaren                 dragshåll
+omtänksamhet                  omtänksam
+opel                          opel
+sloka                         slok
+prövade                       pröv
+symbol                        symbol
+sockenbor                     sockenb
+familjebjudningarna           familjebjudning
+såren                         sår
+timrar                        timr
+uppträdde                     uppträd
+tager                         tag
+toge                          tog
+drunknade                     drunkn
+glömska                       glömsk
+friare                        friar
+kontraster                    kontrast
+dalar                         dal
+iörde                         iörd
+nämnt                         nämnt
+sörjer                        sörj
+minuters                      minuter
+bro                           bro
+uppfödda                      uppföd
+vaksamma                      vaksamm
+fröjds                        fröjd
+behjertat                     behjert
+mänga                         mäng
+gömde                         gömd
+uppfriskande                  uppfrisk
+forstorad                     forstor
+spärrade                      spärr
+fräknig                       fräkn
+krist                         krist
+droska                        drosk
+reta                          ret
+bortbytt                      bortbyt
+meddelat                      meddel
+plumpa                        plump
+skrynklade                    skrynkl
+berest                        berest
+välvilliga                    välvil
+död                           död
+skilde                        skild
+hårdt                         hård
+kyrkogårdshörnet              kyrkogårdshörnet
+batar                         bat
+tröttnat                      tröttn
+lydiga                        lyd
+betala                        betal
+förvärvt                      förvärvt
+afsteg                        afsteg
+honett                        honet
+väggarne                      vägg
+värkarna                      värk
+bäfvat                        bäfv
+gymnasiitid                   gymnasiitid
+handlingssätt                 handlingssät
+söndagsförmiddag              söndagsförmiddag
+färgprakt                     färgprak
+trassel                       trassel
+kerstins                      kerstin
+farande                       far

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/liblingua-stem-snowball-perl.git



More information about the Pkg-perl-cvs-commits mailing list