diff --git a/src/backend/snowball/Makefile b/src/backend/snowball/Makefile
index 50cbace41d..0732fd7d6b 100644
--- a/src/backend/snowball/Makefile
+++ b/src/backend/snowball/Makefile
@@ -23,13 +23,13 @@ OBJS= $(WIN32RES) dict_snowball.o api.o utilities.o \
 	stem_ISO_8859_1_finnish.o \
 	stem_ISO_8859_1_french.o \
 	stem_ISO_8859_1_german.o \
-	stem_ISO_8859_1_hungarian.o \
 	stem_ISO_8859_1_italian.o \
 	stem_ISO_8859_1_norwegian.o \
 	stem_ISO_8859_1_porter.o \
 	stem_ISO_8859_1_portuguese.o \
 	stem_ISO_8859_1_spanish.o \
 	stem_ISO_8859_1_swedish.o \
+	stem_ISO_8859_2_hungarian.o \
 	stem_ISO_8859_2_romanian.o \
 	stem_KOI8_R_russian.o \
 	stem_UTF_8_danish.o \
diff --git a/src/backend/snowball/dict_snowball.c b/src/backend/snowball/dict_snowball.c
index 78c9f73ef0..30e44eee3f 100644
--- a/src/backend/snowball/dict_snowball.c
+++ b/src/backend/snowball/dict_snowball.c
@@ -32,13 +32,13 @@
 #include "snowball/libstemmer/stem_ISO_8859_1_finnish.h"
 #include "snowball/libstemmer/stem_ISO_8859_1_french.h"
 #include "snowball/libstemmer/stem_ISO_8859_1_german.h"
-#include "snowball/libstemmer/stem_ISO_8859_1_hungarian.h"
 #include "snowball/libstemmer/stem_ISO_8859_1_italian.h"
 #include "snowball/libstemmer/stem_ISO_8859_1_norwegian.h"
 #include "snowball/libstemmer/stem_ISO_8859_1_porter.h"
 #include "snowball/libstemmer/stem_ISO_8859_1_portuguese.h"
 #include "snowball/libstemmer/stem_ISO_8859_1_spanish.h"
 #include "snowball/libstemmer/stem_ISO_8859_1_swedish.h"
+#include "snowball/libstemmer/stem_ISO_8859_2_hungarian.h"
 #include "snowball/libstemmer/stem_ISO_8859_2_romanian.h"
 #include "snowball/libstemmer/stem_KOI8_R_russian.h"
 #include "snowball/libstemmer/stem_UTF_8_danish.h"
@@ -85,13 +85,13 @@ static const stemmer_module stemmer_modules[] =
 	{"finnish", PG_LATIN1, finnish_ISO_8859_1_create_env, finnish_ISO_8859_1_close_env, finnish_ISO_8859_1_stem},
 	{"french", PG_LATIN1, french_ISO_8859_1_create_env, french_ISO_8859_1_close_env, french_ISO_8859_1_stem},
 	{"german", PG_LATIN1, german_ISO_8859_1_create_env, german_ISO_8859_1_close_env, german_ISO_8859_1_stem},
-	{"hungarian", PG_LATIN1, hungarian_ISO_8859_1_create_env, hungarian_ISO_8859_1_close_env, hungarian_ISO_8859_1_stem},
 	{"italian", PG_LATIN1, italian_ISO_8859_1_create_env, italian_ISO_8859_1_close_env, italian_ISO_8859_1_stem},
 	{"norwegian", PG_LATIN1, norwegian_ISO_8859_1_create_env, norwegian_ISO_8859_1_close_env, norwegian_ISO_8859_1_stem},
 	{"porter", PG_LATIN1, porter_ISO_8859_1_create_env, porter_ISO_8859_1_close_env, porter_ISO_8859_1_stem},
 	{"portuguese", PG_LATIN1, portuguese_ISO_8859_1_create_env, portuguese_ISO_8859_1_close_env, portuguese_ISO_8859_1_stem},
 	{"spanish", PG_LATIN1, spanish_ISO_8859_1_create_env, spanish_ISO_8859_1_close_env, spanish_ISO_8859_1_stem},
 	{"swedish", PG_LATIN1, swedish_ISO_8859_1_create_env, swedish_ISO_8859_1_close_env, swedish_ISO_8859_1_stem},
+	{"hungarian", PG_LATIN2, hungarian_ISO_8859_2_create_env, hungarian_ISO_8859_2_close_env, hungarian_ISO_8859_2_stem},
 	{"romanian", PG_LATIN2, romanian_ISO_8859_2_create_env, romanian_ISO_8859_2_close_env, romanian_ISO_8859_2_stem},
 	{"russian", PG_KOI8R, russian_KOI8_R_create_env, russian_KOI8_R_close_env, russian_KOI8_R_stem},
 	{"danish", PG_UTF8, danish_UTF_8_create_env, danish_UTF_8_close_env, danish_UTF_8_stem},
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_danish.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_danish.c
index 36a9f99276..263c226e34 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_danish.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_danish.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -132,15 +132,15 @@ static const symbol s_0[] = { 's', 't' };
 static const symbol s_1[] = { 'i', 'g' };
 static const 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 ret = z->c + 3;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 31 */
+    {   int c_test1 = z->c; /* test, line 33 */
+        {   int ret = z->c + 3; /* hop, line 33 */
             if (0 > ret || ret > z->l) return 0;
-            z->c = ret; /* hop, line 33 */
+            z->c = ret;
         }
         z->I[1] = z->c; /* setmark x, line 33 */
-        z->c = c_test;
+        z->c = c_test1;
     }
     if (out_grouping(z, g_v, 97, 248, 1) < 0) return 0; /* goto */ /* grouping v, line 34 */
     {    /* gopast */ /* non v, line 34 */
@@ -149,37 +149,34 @@ static int r_mark_regions(struct SN_env * z) {
         z->c += ret;
     }
     z->I[0] = z->c; /* setmark p1, line 34 */
-     /* try, line 35 */
-    if (!(z->I[0] < z->I[1])) goto lab0;
-    z->I[0] = z->I[1];
+    /* try, line 35 */
+    if (!(z->I[0] < z->I[1])) goto lab0; /* $(<integer expression> < <integer expression>), line 35 */
+    z->I[0] = z->I[1]; /* $p1 = <integer expression>, line 35 */
 lab0:
     return 1;
 }
 
-static int r_main_suffix(struct SN_env * z) {
+static int r_main_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 41 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 41 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 41 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 41 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851440 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_0, 32); /* substring, line 41 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851440 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 41 */
+        among_var = find_among_b(z, a_0, 32);
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 41 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 42 */
         case 1:
             {   int 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, 0)) return 0;
+            if (in_grouping_b(z, g_s_ending, 97, 229, 0)) return 0; /* grouping s_ending, line 50 */
             {   int ret = slice_del(z); /* delete, line 50 */
                 if (ret < 0) return ret;
             }
@@ -188,21 +185,19 @@ static int r_main_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_consonant_pair(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 55 */
-        {   int mlimit; /* setlimit, line 56 */
-            int m1 = z->l - z->c; (void)m1;
+static int r_consonant_pair(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 55 */
+
+        {   int mlimit2; /* setlimit, line 56 */
             if (z->c < z->I[0]) return 0;
-            z->c = z->I[0]; /* tomark, line 56 */
-            mlimit = z->lb; z->lb = z->c;
-            z->c = z->l - m1;
+            mlimit2 = z->lb; z->lb = z->I[0];
             z->ket = z->c; /* [, line 56 */
-            if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 116)) { z->lb = mlimit; return 0; }
-            if (!(find_among_b(z, a_1, 4))) { z->lb = mlimit; return 0; } /* substring, line 56 */
+            if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 116)) { z->lb = mlimit2; return 0; } /* substring, line 56 */
+            if (!(find_among_b(z, a_1, 4))) { z->lb = mlimit2; return 0; }
             z->bra = z->c; /* ], line 56 */
-            z->lb = mlimit;
+            z->lb = mlimit2;
         }
-        z->c = z->l - m_test;
+        z->c = z->l - m_test1;
     }
     if (z->c <= z->lb) return 0;
     z->c--; /* next, line 62 */
@@ -213,41 +208,38 @@ static int r_consonant_pair(struct SN_env * z) {
     return 1;
 }
 
-static int r_other_suffix(struct SN_env * z) {
+static int r_other_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     {   int m1 = z->l - z->c; (void)m1; /* do, line 66 */
         z->ket = z->c; /* [, line 66 */
-        if (!(eq_s_b(z, 2, s_0))) goto lab0;
+        if (!(eq_s_b(z, 2, s_0))) goto lab0; /* literal, line 66 */
         z->bra = z->c; /* ], line 66 */
-        if (!(eq_s_b(z, 2, s_1))) goto lab0;
+        if (!(eq_s_b(z, 2, s_1))) goto lab0; /* literal, line 66 */
         {   int ret = slice_del(z); /* delete, line 66 */
             if (ret < 0) return ret;
         }
     lab0:
         z->c = z->l - m1;
     }
-    {   int mlimit; /* setlimit, line 67 */
-        int m2 = z->l - z->c; (void)m2;
+
+    {   int mlimit2; /* setlimit, line 67 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 67 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m2;
+        mlimit2 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 67 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1572992 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_2, 5); /* substring, line 67 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1572992 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit2; return 0; } /* substring, line 67 */
+        among_var = find_among_b(z, a_2, 5);
+        if (!(among_var)) { z->lb = mlimit2; return 0; }
         z->bra = z->c; /* ], line 67 */
-        z->lb = mlimit;
+        z->lb = mlimit2;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 68 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 70 */
                 if (ret < 0) return ret;
             }
             {   int m3 = z->l - z->c; (void)m3; /* do, line 70 */
-                {   int ret = r_consonant_pair(z);
-                    if (ret == 0) goto lab1; /* call consonant_pair, line 70 */
+                {   int ret = r_consonant_pair(z); /* call consonant_pair, line 70 */
+                    if (ret == 0) goto lab1;
                     if (ret < 0) return ret;
                 }
             lab1:
@@ -263,19 +255,17 @@ static int r_other_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_undouble(struct SN_env * z) {
-    {   int mlimit; /* setlimit, line 76 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_undouble(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 76 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 76 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 76 */
-        if (out_grouping_b(z, g_v, 97, 248, 0)) { z->lb = mlimit; return 0; }
+        if (out_grouping_b(z, g_v, 97, 248, 0)) { z->lb = mlimit1; return 0; } /* non v, line 76 */
         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 = mlimit;
+        z->lb = mlimit1;
     }
     if (!(eq_v_b(z, z->S[0]))) return 0; /* name ch, line 77 */
     {   int ret = slice_del(z); /* delete, line 78 */
@@ -284,10 +274,10 @@ static int r_undouble(struct SN_env * z) {
     return 1;
 }
 
-extern int danish_ISO_8859_1_stem(struct SN_env * z) {
+extern int danish_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 84 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab0; /* call mark_regions, line 84 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 84 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
@@ -296,32 +286,32 @@ extern int danish_ISO_8859_1_stem(struct SN_env * z) {
     z->lb = z->c; z->c = z->l; /* backwards, line 85 */
 
     {   int m2 = z->l - z->c; (void)m2; /* do, line 86 */
-        {   int ret = r_main_suffix(z);
-            if (ret == 0) goto lab1; /* call main_suffix, line 86 */
+        {   int ret = r_main_suffix(z); /* call main_suffix, line 86 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
     {   int m3 = z->l - z->c; (void)m3; /* do, line 87 */
-        {   int ret = r_consonant_pair(z);
-            if (ret == 0) goto lab2; /* call consonant_pair, line 87 */
+        {   int ret = r_consonant_pair(z); /* call consonant_pair, line 87 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
         z->c = z->l - m3;
     }
     {   int m4 = z->l - z->c; (void)m4; /* do, line 88 */
-        {   int ret = r_other_suffix(z);
-            if (ret == 0) goto lab3; /* call other_suffix, line 88 */
+        {   int ret = r_other_suffix(z); /* call other_suffix, line 88 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
         z->c = z->l - m4;
     }
     {   int m5 = z->l - z->c; (void)m5; /* do, line 89 */
-        {   int ret = r_undouble(z);
-            if (ret == 0) goto lab4; /* call undouble, line 89 */
+        {   int ret = r_undouble(z); /* call undouble, line 89 */
+            if (ret == 0) goto lab4;
             if (ret < 0) return ret;
         }
     lab4:
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_dutch.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_dutch.c
index e5ba288b1f..b3d2c4e5d1 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_dutch.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_dutch.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -134,36 +134,28 @@ static const symbol s_1[] = { 'e' };
 static const symbol s_2[] = { 'i' };
 static const symbol s_3[] = { 'o' };
 static const symbol s_4[] = { 'u' };
-static const symbol s_5[] = { 'y' };
-static const symbol s_6[] = { 'Y' };
-static const symbol s_7[] = { 'i' };
-static const symbol s_8[] = { 'I' };
-static const symbol s_9[] = { 'y' };
-static const symbol s_10[] = { 'Y' };
-static const symbol s_11[] = { 'y' };
-static const symbol s_12[] = { 'i' };
-static const symbol s_13[] = { 'e' };
-static const symbol s_14[] = { 'g', 'e', 'm' };
-static const symbol s_15[] = { 'h', 'e', 'i', 'd' };
-static const symbol s_16[] = { 'h', 'e', 'i', 'd' };
-static const symbol s_17[] = { 'c' };
-static const symbol s_18[] = { 'e', 'n' };
-static const symbol s_19[] = { 'i', 'g' };
-static const symbol s_20[] = { 'e' };
-static const symbol s_21[] = { 'e' };
+static const symbol s_5[] = { 'Y' };
+static const symbol s_6[] = { 'I' };
+static const symbol s_7[] = { 'Y' };
+static const symbol s_8[] = { 'y' };
+static const symbol s_9[] = { 'i' };
+static const symbol s_10[] = { 'g', 'e', 'm' };
+static const symbol s_11[] = { 'h', 'e', 'i', 'd' };
+static const symbol s_12[] = { 'h', 'e', 'i', 'd' };
+static const symbol s_13[] = { 'e', 'n' };
+static const symbol s_14[] = { 'i', 'g' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     int among_var;
-    {   int c_test = z->c; /* test, line 42 */
+    {   int c_test1 = z->c; /* test, line 42 */
         while(1) { /* repeat, line 42 */
-            int c1 = z->c;
+            int c2 = z->c;
             z->bra = z->c; /* [, line 43 */
-            if (z->c >= z->l || z->p[z->c + 0] >> 5 != 7 || !((340306450 >> (z->p[z->c + 0] & 0x1f)) & 1)) among_var = 6; else
-            among_var = find_among(z, a_0, 11); /* substring, line 43 */
+            if (z->c >= z->l || z->p[z->c + 0] >> 5 != 7 || !((340306450 >> (z->p[z->c + 0] & 0x1f)) & 1)) among_var = 6; else /* substring, line 43 */
+            among_var = find_among(z, a_0, 11);
             if (!(among_var)) goto lab0;
             z->ket = z->c; /* ], line 43 */
-            switch(among_var) {
-                case 0: goto lab0;
+            switch (among_var) { /* among, line 43 */
                 case 1:
                     {   int ret = slice_from_s(z, 1, s_0); /* <-, line 45 */
                         if (ret < 0) return ret;
@@ -196,62 +188,65 @@ static int r_prelude(struct SN_env * z) {
             }
             continue;
         lab0:
-            z->c = c1;
+            z->c = c2;
             break;
         }
-        z->c = c_test;
+        z->c = c_test1;
     }
-    {   int c_keep = z->c; /* try, line 57 */
+    {   int c3 = z->c; /* try, line 57 */
         z->bra = z->c; /* [, line 57 */
-        if (!(eq_s(z, 1, s_5))) { z->c = c_keep; goto lab1; }
+        if (z->c == z->l || z->p[z->c] != 'y') { z->c = c3; goto lab1; } /* literal, line 57 */
+        z->c++;
         z->ket = z->c; /* ], line 57 */
-        {   int ret = slice_from_s(z, 1, s_6); /* <-, line 57 */
+        {   int ret = slice_from_s(z, 1, s_5); /* <-, line 57 */
             if (ret < 0) return ret;
         }
     lab1:
         ;
     }
     while(1) { /* repeat, line 58 */
-        int c2 = z->c;
+        int c4 = z->c;
         while(1) { /* goto, line 58 */
-            int c3 = z->c;
-            if (in_grouping(z, g_v, 97, 232, 0)) goto lab3;
+            int c5 = z->c;
+            if (in_grouping(z, g_v, 97, 232, 0)) goto lab3; /* grouping v, line 59 */
             z->bra = z->c; /* [, line 59 */
-            {   int c4 = z->c; /* or, line 59 */
-                if (!(eq_s(z, 1, s_7))) goto lab5;
+            {   int c6 = z->c; /* or, line 59 */
+                if (z->c == z->l || z->p[z->c] != 'i') goto lab5; /* literal, line 59 */
+                z->c++;
                 z->ket = z->c; /* ], line 59 */
-                if (in_grouping(z, g_v, 97, 232, 0)) goto lab5;
-                {   int ret = slice_from_s(z, 1, s_8); /* <-, line 59 */
+                if (in_grouping(z, g_v, 97, 232, 0)) goto lab5; /* grouping v, line 59 */
+                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 59 */
                     if (ret < 0) return ret;
                 }
                 goto lab4;
             lab5:
-                z->c = c4;
-                if (!(eq_s(z, 1, s_9))) goto lab3;
+                z->c = c6;
+                if (z->c == z->l || z->p[z->c] != 'y') goto lab3; /* literal, line 60 */
+                z->c++;
                 z->ket = z->c; /* ], line 60 */
-                {   int ret = slice_from_s(z, 1, s_10); /* <-, line 60 */
+                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 60 */
                     if (ret < 0) return ret;
                 }
             }
         lab4:
-            z->c = c3;
+            z->c = c5;
             break;
         lab3:
-            z->c = c3;
+            z->c = c5;
             if (z->c >= z->l) goto lab2;
             z->c++; /* goto, line 58 */
         }
         continue;
     lab2:
-        z->c = c2;
+        z->c = c4;
         break;
     }
     return 1;
 }
 
-static int r_mark_regions(struct SN_env * z) {
-    z->I[0] = z->l;
-    z->I[1] = z->l;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 66 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 67 */
     {    /* gopast */ /* grouping v, line 69 */
         int ret = out_grouping(z, g_v, 97, 232, 1);
         if (ret < 0) return 0;
@@ -263,9 +258,9 @@ static int r_mark_regions(struct SN_env * z) {
         z->c += ret;
     }
     z->I[0] = z->c; /* setmark p1, line 69 */
-     /* try, line 70 */
-    if (!(z->I[0] < 3)) goto lab0;
-    z->I[0] = 3;
+    /* try, line 70 */
+    if (!(z->I[0] < 3)) goto lab0; /* $(<integer expression> < <integer expression>), line 70 */
+    z->I[0] = 3; /* $p1 = <integer expression>, line 70 */
 lab0:
     {    /* gopast */ /* grouping v, line 71 */
         int ret = out_grouping(z, g_v, 97, 232, 1);
@@ -281,24 +276,23 @@ lab0:
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 75 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 77 */
-        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 89)) among_var = 3; else
-        among_var = find_among(z, a_1, 3); /* substring, line 77 */
+        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 89)) among_var = 3; else /* substring, line 77 */
+        among_var = find_among(z, a_1, 3);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 77 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 77 */
             case 1:
-                {   int ret = slice_from_s(z, 1, s_11); /* <-, line 78 */
+                {   int ret = slice_from_s(z, 1, s_8); /* <-, line 78 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_12); /* <-, line 79 */
+                {   int ret = slice_from_s(z, 1, s_9); /* <-, line 79 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -315,21 +309,21 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 87 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 88 */
     return 1;
 }
 
-static int r_undouble(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 91 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1050640 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-        if (!(find_among_b(z, a_2, 3))) return 0; /* among, line 91 */
-        z->c = z->l - m_test;
+static int r_undouble(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 91 */
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1050640 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* among, line 91 */
+        if (!(find_among_b(z, a_2, 3))) return 0;
+        z->c = z->l - m_test1;
     }
     z->ket = z->c; /* [, line 91 */
     if (z->c <= z->lb) return 0;
@@ -341,40 +335,38 @@ static int r_undouble(struct SN_env * z) {
     return 1;
 }
 
-static int r_e_ending(struct SN_env * z) {
+static int r_e_ending(struct SN_env * z) { /* backwardmode */
     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;
+    if (z->c <= z->lb || z->p[z->c - 1] != 'e') return 0; /* literal, line 96 */
+    z->c--;
     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 ret = r_R1(z); /* 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, 0)) return 0;
-        z->c = z->l - m_test;
+    {   int m_test1 = z->l - z->c; /* test, line 96 */
+        if (out_grouping_b(z, g_v, 97, 232, 0)) return 0; /* non v, line 96 */
+        z->c = z->l - m_test1;
     }
     {   int 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;
+    {   int ret = r_undouble(z); /* 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;
+static int r_en_ending(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_R1(z); /* call R1, line 102 */
+        if (ret <= 0) return ret;
     }
     {   int m1 = z->l - z->c; (void)m1; /* and, line 102 */
-        if (out_grouping_b(z, g_v, 97, 232, 0)) return 0;
+        if (out_grouping_b(z, g_v, 97, 232, 0)) return 0; /* non v, line 102 */
         z->c = z->l - m1;
         {   int m2 = z->l - z->c; (void)m2; /* not, line 102 */
-            if (!(eq_s_b(z, 3, s_14))) goto lab0;
+            if (!(eq_s_b(z, 3, s_10))) goto lab0; /* literal, line 102 */
             return 0;
         lab0:
             z->c = z->l - m2;
@@ -383,44 +375,42 @@ static int r_en_ending(struct SN_env * z) {
     {   int 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;
+    {   int ret = r_undouble(z); /* call undouble, line 103 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     {   int m1 = z->l - z->c; (void)m1; /* do, line 107 */
         z->ket = z->c; /* [, line 108 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((540704 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab0;
-        among_var = find_among_b(z, a_3, 5); /* substring, line 108 */
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((540704 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab0; /* substring, line 108 */
+        among_var = find_among_b(z, a_3, 5);
         if (!(among_var)) goto lab0;
         z->bra = z->c; /* ], line 108 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 108 */
             case 1:
-                {   int ret = r_R1(z);
-                    if (ret == 0) goto lab0; /* call R1, line 110 */
+                {   int ret = r_R1(z); /* call R1, line 110 */
+                    if (ret == 0) goto lab0;
                     if (ret < 0) return ret;
                 }
-                {   int ret = slice_from_s(z, 4, s_15); /* <-, line 110 */
+                {   int ret = slice_from_s(z, 4, s_11); /* <-, 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 */
+                {   int ret = r_en_ending(z); /* call en_ending, line 113 */
+                    if (ret == 0) goto lab0;
                     if (ret < 0) return ret;
                 }
                 break;
             case 3:
-                {   int ret = r_R1(z);
-                    if (ret == 0) goto lab0; /* call R1, line 116 */
+                {   int ret = r_R1(z); /* call R1, line 116 */
+                    if (ret == 0) goto lab0;
                     if (ret < 0) return ret;
                 }
-                if (out_grouping_b(z, g_v_j, 97, 232, 0)) goto lab0;
+                if (out_grouping_b(z, g_v_j, 97, 232, 0)) goto lab0; /* non v_j, line 116 */
                 {   int ret = slice_del(z); /* delete, line 116 */
                     if (ret < 0) return ret;
                 }
@@ -430,8 +420,8 @@ static int r_standard_suffix(struct SN_env * z) {
         z->c = z->l - m1;
     }
     {   int m2 = z->l - z->c; (void)m2; /* do, line 120 */
-        {   int ret = r_e_ending(z);
-            if (ret == 0) goto lab1; /* call e_ending, line 120 */
+        {   int ret = r_e_ending(z); /* call e_ending, line 120 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
@@ -439,14 +429,15 @@ static int r_standard_suffix(struct SN_env * z) {
     }
     {   int m3 = z->l - z->c; (void)m3; /* do, line 122 */
         z->ket = z->c; /* [, line 122 */
-        if (!(eq_s_b(z, 4, s_16))) goto lab2;
+        if (!(eq_s_b(z, 4, s_12))) goto lab2; /* literal, line 122 */
         z->bra = z->c; /* ], line 122 */
-        {   int ret = r_R2(z);
-            if (ret == 0) goto lab2; /* call R2, line 122 */
+        {   int ret = r_R2(z); /* call R2, line 122 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
         {   int m4 = z->l - z->c; (void)m4; /* not, line 122 */
-            if (!(eq_s_b(z, 1, s_17))) goto lab3;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'c') goto lab3; /* literal, line 122 */
+            z->c--;
             goto lab2;
         lab3:
             z->c = z->l - m4;
@@ -455,10 +446,10 @@ static int r_standard_suffix(struct SN_env * z) {
             if (ret < 0) return ret;
         }
         z->ket = z->c; /* [, line 123 */
-        if (!(eq_s_b(z, 2, s_18))) goto lab2;
+        if (!(eq_s_b(z, 2, s_13))) goto lab2; /* literal, line 123 */
         z->bra = z->c; /* ], line 123 */
-        {   int ret = r_en_ending(z);
-            if (ret == 0) goto lab2; /* call en_ending, line 123 */
+        {   int ret = r_en_ending(z); /* call en_ending, line 123 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
@@ -466,15 +457,14 @@ static int r_standard_suffix(struct SN_env * z) {
     }
     {   int m5 = z->l - z->c; (void)m5; /* do, line 126 */
         z->ket = z->c; /* [, line 127 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((264336 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab4;
-        among_var = find_among_b(z, a_4, 6); /* substring, line 127 */
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((264336 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab4; /* substring, line 127 */
+        among_var = find_among_b(z, a_4, 6);
         if (!(among_var)) goto lab4;
         z->bra = z->c; /* ], line 127 */
-        switch(among_var) {
-            case 0: goto lab4;
+        switch (among_var) { /* among, line 127 */
             case 1:
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab4; /* call R2, line 129 */
+                {   int ret = r_R2(z); /* call R2, line 129 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 129 */
@@ -482,14 +472,15 @@ static int r_standard_suffix(struct SN_env * z) {
                 }
                 {   int m6 = z->l - z->c; (void)m6; /* or, line 130 */
                     z->ket = z->c; /* [, line 130 */
-                    if (!(eq_s_b(z, 2, s_19))) goto lab6;
+                    if (!(eq_s_b(z, 2, s_14))) goto lab6; /* literal, line 130 */
                     z->bra = z->c; /* ], line 130 */
-                    {   int ret = r_R2(z);
-                        if (ret == 0) goto lab6; /* call R2, line 130 */
+                    {   int ret = r_R2(z); /* call R2, line 130 */
+                        if (ret == 0) goto lab6;
                         if (ret < 0) return ret;
                     }
                     {   int m7 = z->l - z->c; (void)m7; /* not, line 130 */
-                        if (!(eq_s_b(z, 1, s_20))) goto lab7;
+                        if (z->c <= z->lb || z->p[z->c - 1] != 'e') goto lab7; /* literal, line 130 */
+                        z->c--;
                         goto lab6;
                     lab7:
                         z->c = z->l - m7;
@@ -500,20 +491,21 @@ static int r_standard_suffix(struct SN_env * z) {
                     goto lab5;
                 lab6:
                     z->c = z->l - m6;
-                    {   int ret = r_undouble(z);
-                        if (ret == 0) goto lab4; /* call undouble, line 130 */
+                    {   int ret = r_undouble(z); /* call undouble, line 130 */
+                        if (ret == 0) goto lab4;
                         if (ret < 0) return ret;
                     }
                 }
             lab5:
                 break;
             case 2:
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab4; /* call R2, line 133 */
+                {   int ret = r_R2(z); /* call R2, line 133 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 {   int m8 = z->l - z->c; (void)m8; /* not, line 133 */
-                    if (!(eq_s_b(z, 1, s_21))) goto lab8;
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'e') goto lab8; /* literal, line 133 */
+                    z->c--;
                     goto lab4;
                 lab8:
                     z->c = z->l - m8;
@@ -523,21 +515,21 @@ static int r_standard_suffix(struct SN_env * z) {
                 }
                 break;
             case 3:
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab4; /* call R2, line 136 */
+                {   int ret = r_R2(z); /* call R2, line 136 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 {   int 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 */
+                {   int ret = r_e_ending(z); /* call e_ending, line 136 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 break;
             case 4:
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab4; /* call R2, line 139 */
+                {   int ret = r_R2(z); /* call R2, line 139 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 139 */
@@ -545,8 +537,8 @@ static int r_standard_suffix(struct SN_env * z) {
                 }
                 break;
             case 5:
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab4; /* call R2, line 142 */
+                {   int ret = r_R2(z); /* call R2, line 142 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 if (!(z->B[0])) goto lab4; /* Boolean test e_found, line 142 */
@@ -559,12 +551,12 @@ static int r_standard_suffix(struct SN_env * z) {
         z->c = z->l - m5;
     }
     {   int m9 = z->l - z->c; (void)m9; /* do, line 146 */
-        if (out_grouping_b(z, g_v_I, 73, 232, 0)) goto lab9;
-        {   int m_test = z->l - z->c; /* test, line 148 */
-            if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((2129954 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab9;
-            if (!(find_among_b(z, a_5, 4))) goto lab9; /* among, line 149 */
-            if (out_grouping_b(z, g_v, 97, 232, 0)) goto lab9;
-            z->c = z->l - m_test;
+        if (out_grouping_b(z, g_v_I, 73, 232, 0)) goto lab9; /* non v_I, line 147 */
+        {   int m_test10 = z->l - z->c; /* test, line 148 */
+            if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((2129954 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab9; /* among, line 149 */
+            if (!(find_among_b(z, a_5, 4))) goto lab9;
+            if (out_grouping_b(z, g_v, 97, 232, 0)) goto lab9; /* non v, line 150 */
+            z->c = z->l - m_test10;
         }
         z->ket = z->c; /* [, line 152 */
         if (z->c <= z->lb) goto lab9;
@@ -579,18 +571,18 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-extern int dutch_ISO_8859_1_stem(struct SN_env * z) {
+extern int dutch_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 159 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 159 */
+        {   int ret = r_prelude(z); /* call prelude, line 159 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
     {   int c2 = z->c; /* do, line 160 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab1; /* call mark_regions, line 160 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 160 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
@@ -598,22 +590,20 @@ extern int dutch_ISO_8859_1_stem(struct SN_env * z) {
     }
     z->lb = z->c; z->c = z->l; /* backwards, line 161 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* 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 - m3;
+    /* do, line 162 */
+    {   int ret = r_standard_suffix(z); /* call standard_suffix, line 162 */
+        if (ret == 0) goto lab2;
+        if (ret < 0) return ret;
     }
+lab2:
     z->c = z->lb;
-    {   int c4 = z->c; /* do, line 163 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab3; /* call postlude, line 163 */
+    {   int c3 = z->c; /* do, line 163 */
+        {   int ret = r_postlude(z); /* call postlude, line 163 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
-        z->c = c4;
+        z->c = c3;
     }
     return 1;
 }
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_english.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_english.c
index 141c45dc27..87ff8041aa 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_english.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_english.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -153,12 +153,12 @@ static const 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},
+/*  3 */ { 2, s_5_3, -1, 15, 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},
+/*  7 */ { 5, s_5_7, 3, 9, 0},
+/*  8 */ { 6, s_5_8, 3, 14, 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},
@@ -317,62 +317,52 @@ static const unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 };
 
 static const unsigned char g_valid_LI[] = { 55, 141, 2 };
 
-static const symbol s_0[] = { '\'' };
-static const symbol s_1[] = { 'y' };
-static const symbol s_2[] = { 'Y' };
-static const symbol s_3[] = { 'y' };
-static const symbol s_4[] = { 'Y' };
-static const symbol s_5[] = { 's', 's' };
-static const symbol s_6[] = { 'i' };
-static const symbol s_7[] = { 'i', 'e' };
-static const symbol s_8[] = { 'e', 'e' };
-static const symbol s_9[] = { 'e' };
-static const symbol s_10[] = { 'e' };
-static const symbol s_11[] = { 'y' };
-static const symbol s_12[] = { 'Y' };
-static const symbol s_13[] = { 'i' };
-static const symbol s_14[] = { 't', 'i', 'o', 'n' };
-static const symbol s_15[] = { 'e', 'n', 'c', 'e' };
-static const symbol s_16[] = { 'a', 'n', 'c', 'e' };
-static const symbol s_17[] = { 'a', 'b', 'l', 'e' };
-static const symbol s_18[] = { 'e', 'n', 't' };
-static const symbol s_19[] = { 'i', 'z', 'e' };
-static const symbol s_20[] = { 'a', 't', 'e' };
-static const symbol s_21[] = { 'a', 'l' };
-static const symbol s_22[] = { 'f', 'u', 'l' };
-static const symbol s_23[] = { 'o', 'u', 's' };
-static const symbol s_24[] = { 'i', 'v', 'e' };
-static const symbol s_25[] = { 'b', 'l', 'e' };
-static const symbol s_26[] = { 'l' };
-static const symbol s_27[] = { 'o', 'g' };
-static const symbol s_28[] = { 'f', 'u', 'l' };
-static const symbol s_29[] = { 'l', 'e', 's', 's' };
-static const symbol s_30[] = { 't', 'i', 'o', 'n' };
-static const symbol s_31[] = { 'a', 't', 'e' };
-static const symbol s_32[] = { 'a', 'l' };
-static const symbol s_33[] = { 'i', 'c' };
-static const symbol s_34[] = { 's' };
-static const symbol s_35[] = { 't' };
-static const symbol s_36[] = { 'l' };
-static const symbol s_37[] = { 's', 'k', 'i' };
-static const symbol s_38[] = { 's', 'k', 'y' };
-static const symbol s_39[] = { 'd', 'i', 'e' };
-static const symbol s_40[] = { 'l', 'i', 'e' };
-static const symbol s_41[] = { 't', 'i', 'e' };
-static const symbol s_42[] = { 'i', 'd', 'l' };
-static const symbol s_43[] = { 'g', 'e', 'n', 't', 'l' };
-static const symbol s_44[] = { 'u', 'g', 'l', 'i' };
-static const symbol s_45[] = { 'e', 'a', 'r', 'l', 'i' };
-static const symbol s_46[] = { 'o', 'n', 'l', 'i' };
-static const symbol s_47[] = { 's', 'i', 'n', 'g', 'l' };
-static const symbol s_48[] = { 'Y' };
-static const symbol s_49[] = { 'y' };
+static const symbol s_0[] = { 'Y' };
+static const symbol s_1[] = { 'Y' };
+static const symbol s_2[] = { 's', 's' };
+static const symbol s_3[] = { 'i' };
+static const symbol s_4[] = { 'i', 'e' };
+static const symbol s_5[] = { 'e', 'e' };
+static const symbol s_6[] = { 'e' };
+static const symbol s_7[] = { 'e' };
+static const symbol s_8[] = { 'i' };
+static const symbol s_9[] = { 't', 'i', 'o', 'n' };
+static const symbol s_10[] = { 'e', 'n', 'c', 'e' };
+static const symbol s_11[] = { 'a', 'n', 'c', 'e' };
+static const symbol s_12[] = { 'a', 'b', 'l', 'e' };
+static const symbol s_13[] = { 'e', 'n', 't' };
+static const symbol s_14[] = { 'i', 'z', 'e' };
+static const symbol s_15[] = { 'a', 't', 'e' };
+static const symbol s_16[] = { 'a', 'l' };
+static const symbol s_17[] = { 'f', 'u', 'l' };
+static const symbol s_18[] = { 'o', 'u', 's' };
+static const symbol s_19[] = { 'i', 'v', 'e' };
+static const symbol s_20[] = { 'b', 'l', 'e' };
+static const symbol s_21[] = { 'o', 'g' };
+static const symbol s_22[] = { 'l', 'e', 's', 's' };
+static const symbol s_23[] = { 't', 'i', 'o', 'n' };
+static const symbol s_24[] = { 'a', 't', 'e' };
+static const symbol s_25[] = { 'a', 'l' };
+static const symbol s_26[] = { 'i', 'c' };
+static const symbol s_27[] = { 's', 'k', 'i' };
+static const symbol s_28[] = { 's', 'k', 'y' };
+static const symbol s_29[] = { 'd', 'i', 'e' };
+static const symbol s_30[] = { 'l', 'i', 'e' };
+static const symbol s_31[] = { 't', 'i', 'e' };
+static const symbol s_32[] = { 'i', 'd', 'l' };
+static const symbol s_33[] = { 'g', 'e', 'n', 't', 'l' };
+static const symbol s_34[] = { 'u', 'g', 'l', 'i' };
+static const symbol s_35[] = { 'e', 'a', 'r', 'l', 'i' };
+static const symbol s_36[] = { 'o', 'n', 'l', 'i' };
+static const symbol s_37[] = { 's', 'i', 'n', 'g', 'l' };
+static const symbol s_38[] = { 'y' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     z->B[0] = 0; /* unset Y_found, line 26 */
     {   int c1 = z->c; /* do, line 27 */
         z->bra = z->c; /* [, line 27 */
-        if (!(eq_s(z, 1, s_0))) goto lab0;
+        if (z->c == z->l || z->p[z->c] != '\'') goto lab0; /* literal, line 27 */
+        z->c++;
         z->ket = z->c; /* ], line 27 */
         {   int ret = slice_del(z); /* delete, line 27 */
             if (ret < 0) return ret;
@@ -382,9 +372,10 @@ static int r_prelude(struct SN_env * z) {
     }
     {   int c2 = z->c; /* do, line 28 */
         z->bra = z->c; /* [, line 28 */
-        if (!(eq_s(z, 1, s_1))) goto lab1;
+        if (z->c == z->l || z->p[z->c] != 'y') goto lab1; /* literal, line 28 */
+        z->c++;
         z->ket = z->c; /* ], line 28 */
-        {   int ret = slice_from_s(z, 1, s_2); /* <-, line 28 */
+        {   int ret = slice_from_s(z, 1, s_0); /* <-, line 28 */
             if (ret < 0) return ret;
         }
         z->B[0] = 1; /* set Y_found, line 28 */
@@ -396,9 +387,10 @@ static int r_prelude(struct SN_env * z) {
             int c4 = z->c;
             while(1) { /* goto, line 29 */
                 int c5 = z->c;
-                if (in_grouping(z, g_v, 97, 121, 0)) goto lab4;
+                if (in_grouping(z, g_v, 97, 121, 0)) goto lab4; /* grouping v, line 29 */
                 z->bra = z->c; /* [, line 29 */
-                if (!(eq_s(z, 1, s_3))) goto lab4;
+                if (z->c == z->l || z->p[z->c] != 'y') goto lab4; /* literal, line 29 */
+                z->c++;
                 z->ket = z->c; /* ], line 29 */
                 z->c = c5;
                 break;
@@ -407,7 +399,7 @@ static int r_prelude(struct SN_env * z) {
                 if (z->c >= z->l) goto lab3;
                 z->c++; /* goto, line 29 */
             }
-            {   int ret = slice_from_s(z, 1, s_4); /* <-, line 29 */
+            {   int ret = slice_from_s(z, 1, s_1); /* <-, line 29 */
                 if (ret < 0) return ret;
             }
             z->B[0] = 1; /* set Y_found, line 29 */
@@ -421,13 +413,13 @@ static int r_prelude(struct SN_env * z) {
     return 1;
 }
 
-static int r_mark_regions(struct SN_env * z) {
-    z->I[0] = z->l;
-    z->I[1] = z->l;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 33 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 34 */
     {   int c1 = z->c; /* do, line 35 */
         {   int c2 = z->c; /* or, line 41 */
-            if (z->c + 4 >= z->l || z->p[z->c + 4] >> 5 != 3 || !((2375680 >> (z->p[z->c + 4] & 0x1f)) & 1)) goto lab2;
-            if (!(find_among(z, a_0, 3))) goto lab2; /* among, line 36 */
+            if (z->c + 4 >= z->l || z->p[z->c + 4] >> 5 != 3 || !((2375680 >> (z->p[z->c + 4] & 0x1f)) & 1)) goto lab2; /* among, line 36 */
+            if (!(find_among(z, a_0, 3))) goto lab2;
             goto lab1;
         lab2:
             z->c = c2;
@@ -461,76 +453,69 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_shortv(struct SN_env * z) {
+static int r_shortv(struct SN_env * z) { /* backwardmode */
     {   int m1 = z->l - z->c; (void)m1; /* or, line 51 */
-        if (out_grouping_b(z, g_v_WXY, 89, 121, 0)) goto lab1;
-        if (in_grouping_b(z, g_v, 97, 121, 0)) goto lab1;
-        if (out_grouping_b(z, g_v, 97, 121, 0)) goto lab1;
+        if (out_grouping_b(z, g_v_WXY, 89, 121, 0)) goto lab1; /* non v_WXY, line 50 */
+        if (in_grouping_b(z, g_v, 97, 121, 0)) goto lab1; /* grouping v, line 50 */
+        if (out_grouping_b(z, g_v, 97, 121, 0)) goto lab1; /* non v, line 50 */
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        if (out_grouping_b(z, g_v, 97, 121, 0)) return 0;
-        if (in_grouping_b(z, g_v, 97, 121, 0)) return 0;
+        if (out_grouping_b(z, g_v, 97, 121, 0)) return 0; /* non v, line 52 */
+        if (in_grouping_b(z, g_v, 97, 121, 0)) return 0; /* grouping v, line 52 */
         if (z->c > z->lb) return 0; /* atlimit, line 52 */
     }
 lab0:
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 55 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 56 */
     return 1;
 }
 
-static int r_Step_1a(struct SN_env * z) {
+static int r_Step_1a(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 59 */
+    {   int m1 = z->l - z->c; (void)m1; /* try, line 59 */
         z->ket = z->c; /* [, line 60 */
-        if (z->c <= z->lb || (z->p[z->c - 1] != 39 && z->p[z->c - 1] != 115)) { z->c = z->l - m_keep; goto lab0; }
-        among_var = find_among_b(z, a_1, 3); /* substring, line 60 */
-        if (!(among_var)) { z->c = z->l - m_keep; goto lab0; }
+        if (z->c <= z->lb || (z->p[z->c - 1] != 39 && z->p[z->c - 1] != 115)) { z->c = z->l - m1; goto lab0; } /* substring, line 60 */
+        if (!(find_among_b(z, a_1, 3))) { z->c = z->l - m1; goto lab0; }
         z->bra = z->c; /* ], line 60 */
-        switch(among_var) {
-            case 0: { z->c = z->l - m_keep; goto lab0; }
-            case 1:
-                {   int ret = slice_del(z); /* delete, line 62 */
-                    if (ret < 0) return ret;
-                }
-                break;
+        {   int ret = slice_del(z); /* delete, line 62 */
+            if (ret < 0) return ret;
         }
     lab0:
         ;
     }
     z->ket = z->c; /* [, line 65 */
-    if (z->c <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 115)) return 0;
-    among_var = find_among_b(z, a_2, 6); /* substring, line 65 */
+    if (z->c <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 115)) return 0; /* substring, line 65 */
+    among_var = find_among_b(z, a_2, 6);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 65 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 65 */
         case 1:
-            {   int ret = slice_from_s(z, 2, s_5); /* <-, line 66 */
+            {   int ret = slice_from_s(z, 2, s_2); /* <-, line 66 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int m1 = z->l - z->c; (void)m1; /* or, line 68 */
-                {   int ret = z->c - 2;
+            {   int m2 = z->l - z->c; (void)m2; /* or, line 68 */
+                {   int ret = z->c - 2; /* hop, line 68 */
                     if (z->lb > ret || ret > z->l) goto lab2;
-                    z->c = ret; /* hop, line 68 */
+                    z->c = ret;
                 }
-                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 68 */
+                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 68 */
                     if (ret < 0) return ret;
                 }
                 goto lab1;
             lab2:
-                z->c = z->l - m1;
-                {   int ret = slice_from_s(z, 2, s_7); /* <-, line 68 */
+                z->c = z->l - m2;
+                {   int ret = slice_from_s(z, 2, s_4); /* <-, line 68 */
                     if (ret < 0) return ret;
                 }
             }
@@ -552,48 +537,47 @@ static int r_Step_1a(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_1b(struct SN_env * z) {
+static int r_Step_1b(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 75 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((33554576 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_4, 6); /* substring, line 75 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((33554576 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 75 */
+    among_var = find_among_b(z, a_4, 6);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 75 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 75 */
         case 1:
-            {   int ret = r_R1(z);
-                if (ret == 0) return 0; /* call R1, line 77 */
-                if (ret < 0) return ret;
+            {   int ret = r_R1(z); /* call R1, line 77 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 2, s_8); /* <-, line 77 */
+            {   int ret = slice_from_s(z, 2, s_5); /* <-, line 77 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int m_test = z->l - z->c; /* test, line 80 */
+            {   int m_test1 = z->l - z->c; /* test, line 80 */
                 {    /* gopast */ /* grouping v, line 80 */
                     int ret = out_grouping_b(z, g_v, 97, 121, 1);
                     if (ret < 0) return 0;
                     z->c -= ret;
                 }
-                z->c = z->l - m_test;
+                z->c = z->l - m_test1;
             }
             {   int ret = slice_del(z); /* delete, line 80 */
                 if (ret < 0) return ret;
             }
-            {   int m_test = z->l - z->c; /* test, line 81 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68514004 >> (z->p[z->c - 1] & 0x1f)) & 1)) among_var = 3; else
-                among_var = find_among_b(z, a_3, 13); /* substring, line 81 */
+            {   int m_test2 = z->l - z->c; /* test, line 81 */
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68514004 >> (z->p[z->c - 1] & 0x1f)) & 1)) among_var = 3; else /* substring, line 81 */
+                among_var = find_among_b(z, a_3, 13);
                 if (!(among_var)) return 0;
-                z->c = z->l - m_test;
+                z->c = z->l - m_test2;
             }
-            switch(among_var) {
-                case 0: return 0;
+            switch (among_var) { /* among, line 81 */
                 case 1:
-                    {   int c_keep = z->c;
-                        int ret = insert_s(z, z->c, z->c, 1, s_9); /* <+, line 83 */
-                        z->c = c_keep;
+                    {   int ret;
+                        {   int saved_c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_6); /* <+, line 83 */
+                            z->c = saved_c;
+                        }
                         if (ret < 0) return ret;
                     }
                     break;
@@ -608,16 +592,17 @@ static int r_Step_1b(struct SN_env * z) {
                     break;
                 case 3:
                     if (z->c != z->I[0]) return 0; /* atmark, line 87 */
-                    {   int m_test = z->l - z->c; /* test, line 87 */
-                        {   int ret = r_shortv(z);
-                            if (ret == 0) return 0; /* call shortv, line 87 */
-                            if (ret < 0) return ret;
+                    {   int m_test3 = z->l - z->c; /* test, line 87 */
+                        {   int ret = r_shortv(z); /* call shortv, line 87 */
+                            if (ret <= 0) return ret;
                         }
-                        z->c = z->l - m_test;
+                        z->c = z->l - m_test3;
                     }
-                    {   int c_keep = z->c;
-                        int ret = insert_s(z, z->c, z->c, 1, s_10); /* <+, line 87 */
-                        z->c = c_keep;
+                    {   int ret;
+                        {   int saved_c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_7); /* <+, line 87 */
+                            z->c = saved_c;
+                        }
                         if (ret < 0) return ret;
                     }
                     break;
@@ -627,121 +612,115 @@ static int r_Step_1b(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_1c(struct SN_env * z) {
+static int r_Step_1c(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 94 */
     {   int m1 = z->l - z->c; (void)m1; /* or, line 94 */
-        if (!(eq_s_b(z, 1, s_11))) goto lab1;
+        if (z->c <= z->lb || z->p[z->c - 1] != 'y') goto lab1; /* literal, line 94 */
+        z->c--;
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        if (!(eq_s_b(z, 1, s_12))) return 0;
+        if (z->c <= z->lb || z->p[z->c - 1] != 'Y') return 0; /* literal, line 94 */
+        z->c--;
     }
 lab0:
     z->bra = z->c; /* ], line 94 */
-    if (out_grouping_b(z, g_v, 97, 121, 0)) return 0;
-    {   int m2 = z->l - z->c; (void)m2; /* not, line 95 */
-        if (z->c > z->lb) goto lab2; /* atlimit, line 95 */
-        return 0;
-    lab2:
-        z->c = z->l - m2;
-    }
-    {   int ret = slice_from_s(z, 1, s_13); /* <-, line 96 */
+    if (out_grouping_b(z, g_v, 97, 121, 0)) return 0; /* non v, line 95 */
+    /* not, line 95 */
+    if (z->c > z->lb) goto lab2; /* atlimit, line 95 */
+    return 0;
+lab2:
+    {   int ret = slice_from_s(z, 1, s_8); /* <-, line 96 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_Step_2(struct SN_env * z) {
+static int r_Step_2(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 100 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((815616 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_5, 24); /* substring, line 100 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((815616 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 100 */
+    among_var = find_among_b(z, a_5, 24);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 100 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 100 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 100 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 100 */
         case 1:
-            {   int ret = slice_from_s(z, 4, s_14); /* <-, line 101 */
+            {   int ret = slice_from_s(z, 4, s_9); /* <-, line 101 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 4, s_15); /* <-, line 102 */
+            {   int ret = slice_from_s(z, 4, s_10); /* <-, line 102 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 4, s_16); /* <-, line 103 */
+            {   int ret = slice_from_s(z, 4, s_11); /* <-, line 103 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 4, s_17); /* <-, line 104 */
+            {   int ret = slice_from_s(z, 4, s_12); /* <-, line 104 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
-            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 105 */
+            {   int ret = slice_from_s(z, 3, s_13); /* <-, line 105 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            {   int ret = slice_from_s(z, 3, s_19); /* <-, line 107 */
+            {   int ret = slice_from_s(z, 3, s_14); /* <-, line 107 */
                 if (ret < 0) return ret;
             }
             break;
         case 7:
-            {   int ret = slice_from_s(z, 3, s_20); /* <-, line 109 */
+            {   int ret = slice_from_s(z, 3, s_15); /* <-, line 109 */
                 if (ret < 0) return ret;
             }
             break;
         case 8:
-            {   int ret = slice_from_s(z, 2, s_21); /* <-, line 111 */
+            {   int ret = slice_from_s(z, 2, s_16); /* <-, line 111 */
                 if (ret < 0) return ret;
             }
             break;
         case 9:
-            {   int ret = slice_from_s(z, 3, s_22); /* <-, line 112 */
+            {   int ret = slice_from_s(z, 3, s_17); /* <-, line 112 */
                 if (ret < 0) return ret;
             }
             break;
         case 10:
-            {   int ret = slice_from_s(z, 3, s_23); /* <-, line 114 */
+            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 114 */
                 if (ret < 0) return ret;
             }
             break;
         case 11:
-            {   int ret = slice_from_s(z, 3, s_24); /* <-, line 116 */
+            {   int ret = slice_from_s(z, 3, s_19); /* <-, line 116 */
                 if (ret < 0) return ret;
             }
             break;
         case 12:
-            {   int ret = slice_from_s(z, 3, s_25); /* <-, line 118 */
+            {   int ret = slice_from_s(z, 3, s_20); /* <-, line 118 */
                 if (ret < 0) return ret;
             }
             break;
         case 13:
-            if (!(eq_s_b(z, 1, s_26))) return 0;
-            {   int ret = slice_from_s(z, 2, s_27); /* <-, line 119 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'l') return 0; /* literal, line 119 */
+            z->c--;
+            {   int ret = slice_from_s(z, 2, s_21); /* <-, line 119 */
                 if (ret < 0) return ret;
             }
             break;
         case 14:
-            {   int ret = slice_from_s(z, 3, s_28); /* <-, line 120 */
+            {   int ret = slice_from_s(z, 4, s_22); /* <-, line 121 */
                 if (ret < 0) return ret;
             }
             break;
         case 15:
-            {   int ret = slice_from_s(z, 4, s_29); /* <-, line 121 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 16:
-            if (in_grouping_b(z, g_valid_LI, 99, 116, 0)) return 0;
+            if (in_grouping_b(z, g_valid_LI, 99, 116, 0)) return 0; /* grouping valid_LI, line 122 */
             {   int ret = slice_del(z); /* delete, line 122 */
                 if (ret < 0) return ret;
             }
@@ -750,36 +729,34 @@ static int r_Step_2(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_3(struct SN_env * z) {
+static int r_Step_3(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 127 */
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((528928 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_6, 9); /* substring, line 127 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((528928 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 127 */
+    among_var = find_among_b(z, a_6, 9);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 127 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 127 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 127 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 127 */
         case 1:
-            {   int ret = slice_from_s(z, 4, s_30); /* <-, line 128 */
+            {   int ret = slice_from_s(z, 4, s_23); /* <-, line 128 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 3, s_31); /* <-, line 129 */
+            {   int ret = slice_from_s(z, 3, s_24); /* <-, line 129 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 2, s_32); /* <-, line 130 */
+            {   int ret = slice_from_s(z, 2, s_25); /* <-, line 130 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 2, s_33); /* <-, line 132 */
+            {   int ret = slice_from_s(z, 2, s_26); /* <-, line 132 */
                 if (ret < 0) return ret;
             }
             break;
@@ -789,9 +766,8 @@ static int r_Step_3(struct SN_env * z) {
             }
             break;
         case 6:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 136 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 136 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 136 */
                 if (ret < 0) return ret;
@@ -801,19 +777,17 @@ static int r_Step_3(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_4(struct SN_env * z) {
+static int r_Step_4(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 141 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1864232 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_7, 18); /* substring, line 141 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1864232 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 141 */
+    among_var = find_among_b(z, a_7, 18);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 141 */
-    {   int ret = r_R2(z);
-        if (ret == 0) return 0; /* call R2, line 141 */
-        if (ret < 0) return ret;
+    {   int ret = r_R2(z); /* call R2, line 141 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 141 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 144 */
                 if (ret < 0) return ret;
@@ -821,11 +795,13 @@ static int r_Step_4(struct SN_env * z) {
             break;
         case 2:
             {   int m1 = z->l - z->c; (void)m1; /* or, line 145 */
-                if (!(eq_s_b(z, 1, s_34))) goto lab1;
+                if (z->c <= z->lb || z->p[z->c - 1] != 's') goto lab1; /* literal, line 145 */
+                z->c--;
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                if (!(eq_s_b(z, 1, s_35))) return 0;
+                if (z->c <= z->lb || z->p[z->c - 1] != 't') return 0; /* literal, line 145 */
+                z->c--;
             }
         lab0:
             {   int ret = slice_del(z); /* delete, line 145 */
@@ -836,31 +812,29 @@ static int r_Step_4(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_5(struct SN_env * z) {
+static int r_Step_5(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 150 */
-    if (z->c <= z->lb || (z->p[z->c - 1] != 101 && z->p[z->c - 1] != 108)) return 0;
-    among_var = find_among_b(z, a_8, 2); /* substring, line 150 */
+    if (z->c <= z->lb || (z->p[z->c - 1] != 101 && z->p[z->c - 1] != 108)) return 0; /* substring, line 150 */
+    among_var = find_among_b(z, a_8, 2);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 150 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 150 */
         case 1:
             {   int m1 = z->l - z->c; (void)m1; /* or, line 151 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab1; /* call R2, line 151 */
+                {   int ret = r_R2(z); /* call R2, line 151 */
+                    if (ret == 0) goto lab1;
                     if (ret < 0) return ret;
                 }
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                {   int ret = r_R1(z);
-                    if (ret == 0) return 0; /* call R1, line 151 */
-                    if (ret < 0) return ret;
+                {   int ret = r_R1(z); /* call R1, line 151 */
+                    if (ret <= 0) return ret;
                 }
                 {   int m2 = z->l - z->c; (void)m2; /* not, line 151 */
-                    {   int ret = r_shortv(z);
-                        if (ret == 0) goto lab2; /* call shortv, line 151 */
+                    {   int ret = r_shortv(z); /* call shortv, line 151 */
+                        if (ret == 0) goto lab2;
                         if (ret < 0) return ret;
                     }
                     return 0;
@@ -874,11 +848,11 @@ static int r_Step_5(struct SN_env * z) {
             }
             break;
         case 2:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 152 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 152 */
+                if (ret <= 0) return ret;
             }
-            if (!(eq_s_b(z, 1, s_36))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'l') return 0; /* literal, line 152 */
+            z->c--;
             {   int ret = slice_del(z); /* delete, line 152 */
                 if (ret < 0) return ret;
             }
@@ -887,77 +861,76 @@ static int r_Step_5(struct SN_env * z) {
     return 1;
 }
 
-static int r_exception2(struct SN_env * z) {
+static int r_exception2(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 158 */
-    if (z->c - 5 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 103)) return 0;
-    if (!(find_among_b(z, a_9, 8))) return 0; /* substring, line 158 */
+    if (z->c - 5 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 103)) return 0; /* substring, line 158 */
+    if (!(find_among_b(z, a_9, 8))) return 0;
     z->bra = z->c; /* ], line 158 */
     if (z->c > z->lb) return 0; /* atlimit, line 158 */
     return 1;
 }
 
-static int r_exception1(struct SN_env * z) {
+static int r_exception1(struct SN_env * z) { /* forwardmode */
     int among_var;
     z->bra = z->c; /* [, line 170 */
-    if (z->c + 2 >= z->l || z->p[z->c + 2] >> 5 != 3 || !((42750482 >> (z->p[z->c + 2] & 0x1f)) & 1)) return 0;
-    among_var = find_among(z, a_10, 18); /* substring, line 170 */
+    if (z->c + 2 >= z->l || z->p[z->c + 2] >> 5 != 3 || !((42750482 >> (z->p[z->c + 2] & 0x1f)) & 1)) return 0; /* substring, line 170 */
+    among_var = find_among(z, a_10, 18);
     if (!(among_var)) return 0;
     z->ket = z->c; /* ], line 170 */
     if (z->c < z->l) return 0; /* atlimit, line 170 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 170 */
         case 1:
-            {   int ret = slice_from_s(z, 3, s_37); /* <-, line 174 */
+            {   int ret = slice_from_s(z, 3, s_27); /* <-, line 174 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 3, s_38); /* <-, line 175 */
+            {   int ret = slice_from_s(z, 3, s_28); /* <-, line 175 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 3, s_39); /* <-, line 176 */
+            {   int ret = slice_from_s(z, 3, s_29); /* <-, line 176 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 3, s_40); /* <-, line 177 */
+            {   int ret = slice_from_s(z, 3, s_30); /* <-, line 177 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
-            {   int ret = slice_from_s(z, 3, s_41); /* <-, line 178 */
+            {   int ret = slice_from_s(z, 3, s_31); /* <-, line 178 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            {   int ret = slice_from_s(z, 3, s_42); /* <-, line 182 */
+            {   int ret = slice_from_s(z, 3, s_32); /* <-, line 182 */
                 if (ret < 0) return ret;
             }
             break;
         case 7:
-            {   int ret = slice_from_s(z, 5, s_43); /* <-, line 183 */
+            {   int ret = slice_from_s(z, 5, s_33); /* <-, line 183 */
                 if (ret < 0) return ret;
             }
             break;
         case 8:
-            {   int ret = slice_from_s(z, 4, s_44); /* <-, line 184 */
+            {   int ret = slice_from_s(z, 4, s_34); /* <-, line 184 */
                 if (ret < 0) return ret;
             }
             break;
         case 9:
-            {   int ret = slice_from_s(z, 5, s_45); /* <-, line 185 */
+            {   int ret = slice_from_s(z, 5, s_35); /* <-, line 185 */
                 if (ret < 0) return ret;
             }
             break;
         case 10:
-            {   int ret = slice_from_s(z, 4, s_46); /* <-, line 186 */
+            {   int ret = slice_from_s(z, 4, s_36); /* <-, line 186 */
                 if (ret < 0) return ret;
             }
             break;
         case 11:
-            {   int ret = slice_from_s(z, 5, s_47); /* <-, line 187 */
+            {   int ret = slice_from_s(z, 5, s_37); /* <-, line 187 */
                 if (ret < 0) return ret;
             }
             break;
@@ -965,14 +938,15 @@ static int r_exception1(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     if (!(z->B[0])) return 0; /* Boolean test Y_found, line 203 */
     while(1) { /* repeat, line 203 */
         int c1 = z->c;
         while(1) { /* goto, line 203 */
             int c2 = z->c;
             z->bra = z->c; /* [, line 203 */
-            if (!(eq_s(z, 1, s_48))) goto lab1;
+            if (z->c == z->l || z->p[z->c] != 'Y') goto lab1; /* literal, line 203 */
+            z->c++;
             z->ket = z->c; /* ], line 203 */
             z->c = c2;
             break;
@@ -981,7 +955,7 @@ static int r_postlude(struct SN_env * z) {
             if (z->c >= z->l) goto lab0;
             z->c++; /* goto, line 203 */
         }
-        {   int ret = slice_from_s(z, 1, s_49); /* <-, line 203 */
+        {   int ret = slice_from_s(z, 1, s_38); /* <-, line 203 */
             if (ret < 0) return ret;
         }
         continue;
@@ -992,19 +966,19 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-extern int english_ISO_8859_1_stem(struct SN_env * z) {
+extern int english_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* or, line 207 */
-        {   int ret = r_exception1(z);
-            if (ret == 0) goto lab1; /* call exception1, line 207 */
+        {   int ret = r_exception1(z); /* call exception1, line 207 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
         goto lab0;
     lab1:
         z->c = c1;
         {   int c2 = z->c; /* not, line 208 */
-            {   int ret = z->c + 3;
+            {   int ret = z->c + 3; /* hop, line 208 */
                 if (0 > ret || ret > z->l) goto lab3;
-                z->c = ret; /* hop, line 208 */
+                z->c = ret;
             }
             goto lab2;
         lab3:
@@ -1013,98 +987,94 @@ extern int english_ISO_8859_1_stem(struct SN_env * z) {
         goto lab0;
     lab2:
         z->c = c1;
-        {   int c3 = z->c; /* do, line 209 */
-            {   int ret = r_prelude(z);
-                if (ret == 0) goto lab4; /* call prelude, line 209 */
-                if (ret < 0) return ret;
-            }
-        lab4:
-            z->c = c3;
+        /* do, line 209 */
+        {   int ret = r_prelude(z); /* call prelude, line 209 */
+            if (ret == 0) goto lab4;
+            if (ret < 0) return ret;
         }
-        {   int c4 = z->c; /* do, line 210 */
-            {   int ret = r_mark_regions(z);
-                if (ret == 0) goto lab5; /* call mark_regions, line 210 */
-                if (ret < 0) return ret;
-            }
-        lab5:
-            z->c = c4;
+    lab4:
+        /* do, line 210 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 210 */
+            if (ret == 0) goto lab5;
+            if (ret < 0) return ret;
         }
+    lab5:
         z->lb = z->c; z->c = z->l; /* backwards, line 211 */
 
-        {   int m5 = z->l - z->c; (void)m5; /* do, line 213 */
-            {   int ret = r_Step_1a(z);
-                if (ret == 0) goto lab6; /* call Step_1a, line 213 */
+        {   int m3 = z->l - z->c; (void)m3; /* do, line 213 */
+            {   int ret = r_Step_1a(z); /* call Step_1a, line 213 */
+                if (ret == 0) goto lab6;
                 if (ret < 0) return ret;
             }
         lab6:
-            z->c = z->l - m5;
+            z->c = z->l - m3;
         }
-        {   int m6 = z->l - z->c; (void)m6; /* or, line 215 */
-            {   int ret = r_exception2(z);
-                if (ret == 0) goto lab8; /* call exception2, line 215 */
+        {   int m4 = z->l - z->c; (void)m4; /* or, line 215 */
+            {   int ret = r_exception2(z); /* call exception2, line 215 */
+                if (ret == 0) goto lab8;
                 if (ret < 0) return ret;
             }
             goto lab7;
         lab8:
-            z->c = z->l - m6;
-            {   int m7 = z->l - z->c; (void)m7; /* do, line 217 */
-                {   int ret = r_Step_1b(z);
-                    if (ret == 0) goto lab9; /* call Step_1b, line 217 */
+            z->c = z->l - m4;
+            {   int m5 = z->l - z->c; (void)m5; /* do, line 217 */
+                {   int ret = r_Step_1b(z); /* call Step_1b, line 217 */
+                    if (ret == 0) goto lab9;
                     if (ret < 0) return ret;
                 }
             lab9:
-                z->c = z->l - m7;
+                z->c = z->l - m5;
             }
-            {   int m8 = z->l - z->c; (void)m8; /* do, line 218 */
-                {   int ret = r_Step_1c(z);
-                    if (ret == 0) goto lab10; /* call Step_1c, line 218 */
+            {   int m6 = z->l - z->c; (void)m6; /* do, line 218 */
+                {   int ret = r_Step_1c(z); /* call Step_1c, line 218 */
+                    if (ret == 0) goto lab10;
                     if (ret < 0) return ret;
                 }
             lab10:
-                z->c = z->l - m8;
+                z->c = z->l - m6;
             }
-            {   int m9 = z->l - z->c; (void)m9; /* do, line 220 */
-                {   int ret = r_Step_2(z);
-                    if (ret == 0) goto lab11; /* call Step_2, line 220 */
+            {   int m7 = z->l - z->c; (void)m7; /* do, line 220 */
+                {   int ret = r_Step_2(z); /* call Step_2, line 220 */
+                    if (ret == 0) goto lab11;
                     if (ret < 0) return ret;
                 }
             lab11:
-                z->c = z->l - m9;
+                z->c = z->l - m7;
             }
-            {   int m10 = z->l - z->c; (void)m10; /* do, line 221 */
-                {   int ret = r_Step_3(z);
-                    if (ret == 0) goto lab12; /* call Step_3, line 221 */
+            {   int m8 = z->l - z->c; (void)m8; /* do, line 221 */
+                {   int ret = r_Step_3(z); /* call Step_3, line 221 */
+                    if (ret == 0) goto lab12;
                     if (ret < 0) return ret;
                 }
             lab12:
-                z->c = z->l - m10;
+                z->c = z->l - m8;
             }
-            {   int m11 = z->l - z->c; (void)m11; /* do, line 222 */
-                {   int ret = r_Step_4(z);
-                    if (ret == 0) goto lab13; /* call Step_4, line 222 */
+            {   int m9 = z->l - z->c; (void)m9; /* do, line 222 */
+                {   int ret = r_Step_4(z); /* call Step_4, line 222 */
+                    if (ret == 0) goto lab13;
                     if (ret < 0) return ret;
                 }
             lab13:
-                z->c = z->l - m11;
+                z->c = z->l - m9;
             }
-            {   int m12 = z->l - z->c; (void)m12; /* do, line 224 */
-                {   int ret = r_Step_5(z);
-                    if (ret == 0) goto lab14; /* call Step_5, line 224 */
+            {   int m10 = z->l - z->c; (void)m10; /* do, line 224 */
+                {   int ret = r_Step_5(z); /* call Step_5, line 224 */
+                    if (ret == 0) goto lab14;
                     if (ret < 0) return ret;
                 }
             lab14:
-                z->c = z->l - m12;
+                z->c = z->l - m10;
             }
         }
     lab7:
         z->c = z->lb;
-        {   int c13 = z->c; /* do, line 227 */
-            {   int ret = r_postlude(z);
-                if (ret == 0) goto lab15; /* call postlude, line 227 */
+        {   int c11 = z->c; /* do, line 227 */
+            {   int ret = r_postlude(z); /* call postlude, line 227 */
+                if (ret == 0) goto lab15;
                 if (ret < 0) return ret;
             }
         lab15:
-            z->c = c13;
+            z->c = c11;
         }
     }
 lab0:
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_finnish.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_finnish.c
index 9621771d28..58285e8c34 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_finnish.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_finnish.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -183,7 +183,7 @@ static const struct among a_6[30] =
 /*  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},
+/*  7 */ { 3, s_6_7, 4, 2, 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},
@@ -205,7 +205,7 @@ static const struct among a_6[30] =
 /* 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}
+/* 29 */ { 3, s_6_29, 26, 2, 0}
 };
 
 static const symbol s_7_0[3] = { 'e', 'j', 'a' };
@@ -261,151 +261,132 @@ static const struct among a_9[2] =
 
 static const unsigned char g_AEI[] = { 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 };
 
+static const unsigned char g_C[] = { 119, 223, 119, 1 };
+
 static const unsigned char g_V1[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 };
 
 static const unsigned char g_V2[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 };
 
 static const 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 const symbol s_0[] = { 'k' };
-static const symbol s_1[] = { 'k', 's', 'e' };
-static const symbol s_2[] = { 'k', 's', 'i' };
-static const symbol s_3[] = { 'i' };
-static const symbol s_4[] = { 'a' };
-static const symbol s_5[] = { 'e' };
-static const symbol s_6[] = { 'i' };
-static const symbol s_7[] = { 'o' };
-static const symbol s_8[] = { 0xE4 };
-static const symbol s_9[] = { 0xF6 };
-static const symbol s_10[] = { 'i', 'e' };
-static const symbol s_11[] = { 'e' };
-static const symbol s_12[] = { 'p', 'o' };
-static const symbol s_13[] = { 't' };
-static const symbol s_14[] = { 'p', 'o' };
-static const symbol s_15[] = { 'j' };
-static const symbol s_16[] = { 'o' };
-static const symbol s_17[] = { 'u' };
-static const symbol s_18[] = { 'o' };
-static const symbol s_19[] = { 'j' };
+static const symbol s_0[] = { 'k', 's', 'e' };
+static const symbol s_1[] = { 'k', 's', 'i' };
+static const symbol s_2[] = { 'i', 'e' };
+static const symbol s_3[] = { 'p', 'o' };
+static const symbol s_4[] = { 'p', 'o' };
 
-static int r_mark_regions(struct SN_env * z) {
-    z->I[0] = z->l;
-    z->I[1] = z->l;
-    if (out_grouping(z, g_V1, 97, 246, 1) < 0) return 0; /* goto */ /* grouping V1, line 46 */
-    {    /* gopast */ /* non V1, line 46 */
-        int ret = in_grouping(z, g_V1, 97, 246, 1);
-        if (ret < 0) return 0;
-        z->c += ret;
-    }
-    z->I[0] = z->c; /* setmark p1, line 46 */
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 44 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 45 */
     if (out_grouping(z, g_V1, 97, 246, 1) < 0) return 0; /* goto */ /* grouping V1, line 47 */
     {    /* gopast */ /* non V1, line 47 */
         int ret = in_grouping(z, g_V1, 97, 246, 1);
         if (ret < 0) return 0;
         z->c += ret;
     }
-    z->I[1] = z->c; /* setmark p2, line 47 */
+    z->I[0] = z->c; /* setmark p1, line 47 */
+    if (out_grouping(z, g_V1, 97, 246, 1) < 0) return 0; /* goto */ /* grouping V1, line 48 */
+    {    /* gopast */ /* non V1, line 48 */
+        int ret = in_grouping(z, g_V1, 97, 246, 1);
+        if (ret < 0) return 0;
+        z->c += ret;
+    }
+    z->I[1] = z->c; /* setmark p2, line 48 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 53 */
     return 1;
 }
 
-static int r_particle_etc(struct SN_env * z) {
+static int r_particle_etc(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 55 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 56 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 55 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 55 */
-        among_var = find_among_b(z, a_0, 10); /* substring, line 55 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
-        z->bra = z->c; /* ], line 55 */
-        z->lb = mlimit;
+        mlimit1 = z->lb; z->lb = z->I[0];
+        z->ket = z->c; /* [, line 56 */
+        among_var = find_among_b(z, a_0, 10); /* substring, line 56 */
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
+        z->bra = z->c; /* ], line 56 */
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 57 */
         case 1:
-            if (in_grouping_b(z, g_particle_end, 97, 246, 0)) return 0;
+            if (in_grouping_b(z, g_particle_end, 97, 246, 0)) return 0; /* grouping particle_end, line 63 */
             break;
         case 2:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 64 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 65 */
+                if (ret <= 0) return ret;
             }
             break;
     }
-    {   int ret = slice_del(z); /* delete, line 66 */
+    {   int ret = slice_del(z); /* delete, line 67 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_possessive(struct SN_env * z) {
+static int r_possessive(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 69 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 70 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 69 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 69 */
-        among_var = find_among_b(z, a_4, 9); /* substring, line 69 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
-        z->bra = z->c; /* ], line 69 */
-        z->lb = mlimit;
+        mlimit1 = z->lb; z->lb = z->I[0];
+        z->ket = z->c; /* [, line 70 */
+        among_var = find_among_b(z, a_4, 9); /* substring, line 70 */
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
+        z->bra = z->c; /* ], line 70 */
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 71 */
         case 1:
-            {   int m2 = z->l - z->c; (void)m2; /* not, line 72 */
-                if (!(eq_s_b(z, 1, s_0))) goto lab0;
+            {   int m2 = z->l - z->c; (void)m2; /* not, line 73 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'k') goto lab0; /* literal, line 73 */
+                z->c--;
                 return 0;
             lab0:
                 z->c = z->l - m2;
             }
-            {   int ret = slice_del(z); /* delete, line 72 */
+            {   int ret = slice_del(z); /* delete, line 73 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_del(z); /* delete, line 74 */
+            {   int ret = slice_del(z); /* delete, line 75 */
                 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 = slice_from_s(z, 3, s_2); /* <-, line 74 */
+            z->ket = z->c; /* [, line 75 */
+            if (!(eq_s_b(z, 3, s_0))) return 0; /* literal, line 75 */
+            z->bra = z->c; /* ], line 75 */
+            {   int ret = slice_from_s(z, 3, s_1); /* <-, line 75 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_del(z); /* delete, line 78 */
+            {   int ret = slice_del(z); /* delete, line 79 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            if (z->c - 1 <= z->lb || z->p[z->c - 1] != 97) return 0;
-            if (!(find_among_b(z, a_1, 6))) return 0; /* among, line 81 */
-            {   int ret = slice_del(z); /* delete, line 81 */
+            if (z->c - 1 <= z->lb || z->p[z->c - 1] != 97) return 0; /* among, line 82 */
+            if (!(find_among_b(z, a_1, 6))) return 0;
+            {   int ret = slice_del(z); /* delete, line 82 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
-            if (z->c - 1 <= z->lb || z->p[z->c - 1] != 228) return 0;
-            if (!(find_among_b(z, a_2, 6))) return 0; /* among, line 83 */
-            {   int ret = slice_del(z); /* delete, line 84 */
+            if (z->c - 1 <= z->lb || z->p[z->c - 1] != 228) return 0; /* among, line 84 */
+            if (!(find_among_b(z, a_2, 6))) return 0;
+            {   int ret = slice_del(z); /* delete, line 85 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            if (z->c - 2 <= z->lb || z->p[z->c - 1] != 101) return 0;
-            if (!(find_among_b(z, a_3, 2))) return 0; /* among, line 86 */
-            {   int ret = slice_del(z); /* delete, line 86 */
+            if (z->c - 2 <= z->lb || z->p[z->c - 1] != 101) return 0; /* among, line 87 */
+            if (!(find_among_b(z, a_3, 2))) return 0;
+            {   int ret = slice_del(z); /* delete, line 87 */
                 if (ret < 0) return ret;
             }
             break;
@@ -413,344 +394,336 @@ static int r_possessive(struct SN_env * z) {
     return 1;
 }
 
-static int r_LONG(struct SN_env * z) {
-    if (!(find_among_b(z, a_5, 7))) return 0; /* among, line 91 */
+static int r_LONG(struct SN_env * z) { /* backwardmode */
+    if (!(find_among_b(z, a_5, 7))) return 0; /* among, line 92 */
     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, 0)) return 0;
+static int r_VI(struct SN_env * z) { /* backwardmode */
+    if (z->c <= z->lb || z->p[z->c - 1] != 'i') return 0; /* literal, line 94 */
+    z->c--;
+    if (in_grouping_b(z, g_V2, 97, 246, 0)) return 0; /* grouping V2, line 94 */
     return 1;
 }
 
-static int r_case_ending(struct SN_env * z) {
+static int r_case_ending(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 96 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 97 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 96 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 96 */
-        among_var = find_among_b(z, a_6, 30); /* substring, line 96 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
-        z->bra = z->c; /* ], line 96 */
-        z->lb = mlimit;
+        mlimit1 = z->lb; z->lb = z->I[0];
+        z->ket = z->c; /* [, line 97 */
+        among_var = find_among_b(z, a_6, 30); /* substring, line 97 */
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
+        z->bra = z->c; /* ], line 97 */
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 98 */
         case 1:
-            if (!(eq_s_b(z, 1, s_4))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'a') return 0; /* literal, line 99 */
+            z->c--;
             break;
         case 2:
-            if (!(eq_s_b(z, 1, s_5))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'e') return 0; /* literal, line 100 */
+            z->c--;
             break;
         case 3:
-            if (!(eq_s_b(z, 1, s_6))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'i') return 0; /* literal, line 101 */
+            z->c--;
             break;
         case 4:
-            if (!(eq_s_b(z, 1, s_7))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'o') return 0; /* literal, line 102 */
+            z->c--;
             break;
         case 5:
-            if (!(eq_s_b(z, 1, s_8))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 0xE4) return 0; /* literal, line 103 */
+            z->c--;
             break;
         case 6:
-            if (!(eq_s_b(z, 1, s_9))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 0xF6) return 0; /* literal, line 104 */
+            z->c--;
             break;
         case 7:
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 111 */
-                {   int m2 = z->l - z->c; (void)m2; /* and, line 113 */
-                    {   int m3 = z->l - z->c; (void)m3; /* or, line 112 */
-                        {   int ret = r_LONG(z);
-                            if (ret == 0) goto lab2; /* call LONG, line 111 */
+            {   int m2 = z->l - z->c; (void)m2; /* try, line 112 */
+                {   int m3 = z->l - z->c; (void)m3; /* and, line 114 */
+                    {   int m4 = z->l - z->c; (void)m4; /* or, line 113 */
+                        {   int ret = r_LONG(z); /* call LONG, line 112 */
+                            if (ret == 0) goto lab2;
                             if (ret < 0) return ret;
                         }
                         goto lab1;
                     lab2:
-                        z->c = z->l - m3;
-                        if (!(eq_s_b(z, 2, s_10))) { z->c = z->l - m_keep; goto lab0; }
+                        z->c = z->l - m4;
+                        if (!(eq_s_b(z, 2, s_2))) { z->c = z->l - m2; goto lab0; } /* literal, line 113 */
                     }
                 lab1:
-                    z->c = z->l - m2;
-                    if (z->c <= z->lb) { z->c = z->l - m_keep; goto lab0; }
-                    z->c--; /* next, line 113 */
+                    z->c = z->l - m3;
+                    if (z->c <= z->lb) { z->c = z->l - m2; goto lab0; }
+                    z->c--; /* next, line 114 */
                 }
-                z->bra = z->c; /* ], line 113 */
+                z->bra = z->c; /* ], line 114 */
             lab0:
                 ;
             }
             break;
         case 8:
-            if (in_grouping_b(z, g_V1, 97, 246, 0)) return 0;
-            if (out_grouping_b(z, g_V1, 97, 246, 0)) return 0;
-            break;
-        case 9:
-            if (!(eq_s_b(z, 1, s_11))) return 0;
+            if (in_grouping_b(z, g_V1, 97, 246, 0)) return 0; /* grouping V1, line 120 */
+            if (in_grouping_b(z, g_C, 98, 122, 0)) return 0; /* grouping C, line 120 */
             break;
     }
-    {   int ret = slice_del(z); /* delete, line 138 */
+    {   int ret = slice_del(z); /* delete, line 139 */
         if (ret < 0) return ret;
     }
-    z->B[0] = 1; /* set ending_removed, line 139 */
+    z->B[0] = 1; /* set ending_removed, line 140 */
     return 1;
 }
 
-static int r_other_endings(struct SN_env * z) {
+static int r_other_endings(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 142 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 143 */
         if (z->c < z->I[1]) return 0;
-        z->c = z->I[1]; /* tomark, line 142 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 142 */
-        among_var = find_among_b(z, a_7, 14); /* substring, line 142 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
-        z->bra = z->c; /* ], line 142 */
-        z->lb = mlimit;
+        mlimit1 = z->lb; z->lb = z->I[1];
+        z->ket = z->c; /* [, line 143 */
+        among_var = find_among_b(z, a_7, 14); /* substring, line 143 */
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
+        z->bra = z->c; /* ], line 143 */
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 144 */
         case 1:
-            {   int m2 = z->l - z->c; (void)m2; /* not, line 146 */
-                if (!(eq_s_b(z, 2, s_12))) goto lab0;
+            {   int m2 = z->l - z->c; (void)m2; /* not, line 147 */
+                if (!(eq_s_b(z, 2, s_3))) goto lab0; /* literal, line 147 */
                 return 0;
             lab0:
                 z->c = z->l - m2;
             }
             break;
     }
-    {   int ret = slice_del(z); /* delete, line 151 */
+    {   int ret = slice_del(z); /* delete, line 152 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_i_plural(struct SN_env * z) {
-    {   int mlimit; /* setlimit, line 154 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_i_plural(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 155 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 154 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 154 */
-        if (z->c <= z->lb || (z->p[z->c - 1] != 105 && z->p[z->c - 1] != 106)) { z->lb = mlimit; return 0; }
-        if (!(find_among_b(z, a_8, 2))) { z->lb = mlimit; return 0; } /* substring, line 154 */
-        z->bra = z->c; /* ], line 154 */
-        z->lb = mlimit;
+        mlimit1 = z->lb; z->lb = z->I[0];
+        z->ket = z->c; /* [, line 155 */
+        if (z->c <= z->lb || (z->p[z->c - 1] != 105 && z->p[z->c - 1] != 106)) { z->lb = mlimit1; return 0; } /* substring, line 155 */
+        if (!(find_among_b(z, a_8, 2))) { z->lb = mlimit1; return 0; }
+        z->bra = z->c; /* ], line 155 */
+        z->lb = mlimit1;
     }
-    {   int ret = slice_del(z); /* delete, line 158 */
+    {   int ret = slice_del(z); /* delete, line 159 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_t_plural(struct SN_env * z) {
+static int r_t_plural(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 161 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 162 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 161 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 162 */
-        if (!(eq_s_b(z, 1, s_13))) { z->lb = mlimit; 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, 0)) { z->lb = mlimit; return 0; }
-            z->c = z->l - m_test;
+        mlimit1 = z->lb; z->lb = z->I[0];
+        z->ket = z->c; /* [, line 163 */
+        if (z->c <= z->lb || z->p[z->c - 1] != 't') { z->lb = mlimit1; return 0; } /* literal, line 163 */
+        z->c--;
+        z->bra = z->c; /* ], line 163 */
+        {   int m_test2 = z->l - z->c; /* test, line 163 */
+            if (in_grouping_b(z, g_V1, 97, 246, 0)) { z->lb = mlimit1; return 0; } /* grouping V1, line 163 */
+            z->c = z->l - m_test2;
         }
-        {   int ret = slice_del(z); /* delete, line 163 */
+        {   int ret = slice_del(z); /* delete, line 164 */
             if (ret < 0) return ret;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    {   int mlimit; /* setlimit, line 165 */
-        int m2 = z->l - z->c; (void)m2;
+
+    {   int mlimit3; /* setlimit, line 166 */
         if (z->c < z->I[1]) return 0;
-        z->c = z->I[1]; /* tomark, line 165 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m2;
-        z->ket = z->c; /* [, line 165 */
-        if (z->c - 2 <= z->lb || z->p[z->c - 1] != 97) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_9, 2); /* substring, line 165 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
-        z->bra = z->c; /* ], line 165 */
-        z->lb = mlimit;
+        mlimit3 = z->lb; z->lb = z->I[1];
+        z->ket = z->c; /* [, line 166 */
+        if (z->c - 2 <= z->lb || z->p[z->c - 1] != 97) { z->lb = mlimit3; return 0; } /* substring, line 166 */
+        among_var = find_among_b(z, a_9, 2);
+        if (!(among_var)) { z->lb = mlimit3; return 0; }
+        z->bra = z->c; /* ], line 166 */
+        z->lb = mlimit3;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 167 */
         case 1:
-            {   int m3 = z->l - z->c; (void)m3; /* not, line 167 */
-                if (!(eq_s_b(z, 2, s_14))) goto lab0;
+            {   int m4 = z->l - z->c; (void)m4; /* not, line 168 */
+                if (!(eq_s_b(z, 2, s_4))) goto lab0; /* literal, line 168 */
                 return 0;
             lab0:
-                z->c = z->l - m3;
+                z->c = z->l - m4;
             }
             break;
     }
-    {   int ret = slice_del(z); /* delete, line 170 */
+    {   int ret = slice_del(z); /* delete, line 171 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_tidy(struct SN_env * z) {
-    {   int mlimit; /* setlimit, line 173 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_tidy(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 174 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 173 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        {   int m2 = z->l - z->c; (void)m2; /* do, line 174 */
-            {   int m3 = z->l - z->c; (void)m3; /* and, line 174 */
-                {   int ret = r_LONG(z);
-                    if (ret == 0) goto lab0; /* call LONG, line 174 */
+        mlimit1 = z->lb; z->lb = z->I[0];
+        {   int m2 = z->l - z->c; (void)m2; /* do, line 175 */
+            {   int m3 = z->l - z->c; (void)m3; /* and, line 175 */
+                {   int ret = r_LONG(z); /* call LONG, line 175 */
+                    if (ret == 0) goto lab0;
                     if (ret < 0) return ret;
                 }
                 z->c = z->l - m3;
-                z->ket = z->c; /* [, line 174 */
+                z->ket = z->c; /* [, line 175 */
                 if (z->c <= z->lb) goto lab0;
-                z->c--; /* next, line 174 */
-                z->bra = z->c; /* ], line 174 */
-                {   int ret = slice_del(z); /* delete, line 174 */
+                z->c--; /* next, line 175 */
+                z->bra = z->c; /* ], line 175 */
+                {   int ret = slice_del(z); /* delete, line 175 */
                     if (ret < 0) return ret;
                 }
             }
         lab0:
             z->c = z->l - m2;
         }
-        {   int m4 = z->l - z->c; (void)m4; /* do, line 175 */
-            z->ket = z->c; /* [, line 175 */
-            if (in_grouping_b(z, g_AEI, 97, 228, 0)) goto lab1;
-            z->bra = z->c; /* ], line 175 */
-            if (out_grouping_b(z, g_V1, 97, 246, 0)) goto lab1;
-            {   int ret = slice_del(z); /* delete, line 175 */
-                if (ret < 0) return ret;
-            }
-        lab1:
-            z->c = z->l - m4;
-        }
-        {   int m5 = z->l - z->c; (void)m5; /* do, line 176 */
+        {   int m4 = z->l - z->c; (void)m4; /* do, line 176 */
             z->ket = z->c; /* [, line 176 */
-            if (!(eq_s_b(z, 1, s_15))) goto lab2;
+            if (in_grouping_b(z, g_AEI, 97, 228, 0)) goto lab1; /* grouping AEI, line 176 */
             z->bra = z->c; /* ], line 176 */
-            {   int m6 = z->l - z->c; (void)m6; /* or, line 176 */
-                if (!(eq_s_b(z, 1, s_16))) goto lab4;
+            if (in_grouping_b(z, g_C, 98, 122, 0)) goto lab1; /* grouping C, line 176 */
+            {   int ret = slice_del(z); /* delete, line 176 */
+                if (ret < 0) return ret;
+            }
+        lab1:
+            z->c = z->l - m4;
+        }
+        {   int m5 = z->l - z->c; (void)m5; /* do, line 177 */
+            z->ket = z->c; /* [, line 177 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'j') goto lab2; /* literal, line 177 */
+            z->c--;
+            z->bra = z->c; /* ], line 177 */
+            {   int m6 = z->l - z->c; (void)m6; /* or, line 177 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'o') goto lab4; /* literal, line 177 */
+                z->c--;
                 goto lab3;
             lab4:
                 z->c = z->l - m6;
-                if (!(eq_s_b(z, 1, s_17))) goto lab2;
+                if (z->c <= z->lb || z->p[z->c - 1] != 'u') goto lab2; /* literal, line 177 */
+                z->c--;
             }
         lab3:
-            {   int ret = slice_del(z); /* delete, line 176 */
+            {   int ret = slice_del(z); /* delete, line 177 */
                 if (ret < 0) return ret;
             }
         lab2:
             z->c = z->l - m5;
         }
-        {   int m7 = z->l - z->c; (void)m7; /* 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 = slice_del(z); /* delete, line 177 */
+        {   int m7 = z->l - z->c; (void)m7; /* do, line 178 */
+            z->ket = z->c; /* [, line 178 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'o') goto lab5; /* literal, line 178 */
+            z->c--;
+            z->bra = z->c; /* ], line 178 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'j') goto lab5; /* literal, line 178 */
+            z->c--;
+            {   int ret = slice_del(z); /* delete, line 178 */
                 if (ret < 0) return ret;
             }
         lab5:
             z->c = z->l - m7;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    if (in_grouping_b(z, g_V1, 97, 246, 1) < 0) return 0; /* goto */ /* non V1, 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 = slice_del(z); /* delete, line 179 */
+    if (in_grouping_b(z, g_V1, 97, 246, 1) < 0) return 0; /* goto */ /* non V1, line 180 */
+    z->ket = z->c; /* [, line 180 */
+    if (in_grouping_b(z, g_C, 98, 122, 0)) return 0; /* grouping C, line 180 */
+    z->bra = z->c; /* ], line 180 */
+    z->S[0] = slice_to(z, z->S[0]); /* -> x, line 180 */
+    if (z->S[0] == 0) return -1; /* -> x, line 180 */
+    if (!(eq_v_b(z, z->S[0]))) return 0; /* name x, line 180 */
+    {   int ret = slice_del(z); /* delete, line 180 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-extern int finnish_ISO_8859_1_stem(struct SN_env * z) {
-    {   int c1 = z->c; /* do, line 185 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab0; /* call mark_regions, line 185 */
+extern int finnish_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
+    {   int c1 = z->c; /* do, line 186 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 186 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    z->B[0] = 0; /* unset ending_removed, line 186 */
-    z->lb = z->c; z->c = z->l; /* backwards, line 187 */
+    z->B[0] = 0; /* unset ending_removed, line 187 */
+    z->lb = z->c; z->c = z->l; /* backwards, line 188 */
 
-    {   int m2 = z->l - z->c; (void)m2; /* do, line 188 */
-        {   int ret = r_particle_etc(z);
-            if (ret == 0) goto lab1; /* call particle_etc, line 188 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 189 */
+        {   int ret = r_particle_etc(z); /* call particle_etc, line 189 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 189 */
-        {   int ret = r_possessive(z);
-            if (ret == 0) goto lab2; /* call possessive, line 189 */
+    {   int m3 = z->l - z->c; (void)m3; /* do, line 190 */
+        {   int ret = r_possessive(z); /* call possessive, line 190 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
         z->c = z->l - m3;
     }
-    {   int m4 = z->l - z->c; (void)m4; /* do, line 190 */
-        {   int ret = r_case_ending(z);
-            if (ret == 0) goto lab3; /* call case_ending, line 190 */
+    {   int m4 = z->l - z->c; (void)m4; /* do, line 191 */
+        {   int ret = r_case_ending(z); /* call case_ending, line 191 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
         z->c = z->l - m4;
     }
-    {   int m5 = z->l - z->c; (void)m5; /* do, line 191 */
-        {   int ret = r_other_endings(z);
-            if (ret == 0) goto lab4; /* call other_endings, line 191 */
+    {   int m5 = z->l - z->c; (void)m5; /* do, line 192 */
+        {   int ret = r_other_endings(z); /* call other_endings, line 192 */
+            if (ret == 0) goto lab4;
             if (ret < 0) return ret;
         }
     lab4:
         z->c = z->l - m5;
     }
-    {   int m6 = z->l - z->c; (void)m6; /* or, line 192 */
-        if (!(z->B[0])) goto lab6; /* Boolean test ending_removed, line 192 */
-        {   int m7 = z->l - z->c; (void)m7; /* 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 - m7;
+    /* or, line 193 */
+    if (!(z->B[0])) goto lab6; /* Boolean test ending_removed, line 193 */
+    {   int m6 = z->l - z->c; (void)m6; /* do, line 193 */
+        {   int ret = r_i_plural(z); /* call i_plural, line 193 */
+            if (ret == 0) goto lab7;
+            if (ret < 0) return ret;
         }
-        goto lab5;
-    lab6:
+    lab7:
         z->c = z->l - m6;
-        {   int m8 = z->l - z->c; (void)m8; /* 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 - m8;
+    }
+    goto lab5;
+lab6:
+    {   int m7 = z->l - z->c; (void)m7; /* do, line 193 */
+        {   int ret = r_t_plural(z); /* call t_plural, line 193 */
+            if (ret == 0) goto lab8;
+            if (ret < 0) return ret;
         }
+    lab8:
+        z->c = z->l - m7;
     }
 lab5:
-    {   int m9 = z->l - z->c; (void)m9; /* do, line 193 */
-        {   int ret = r_tidy(z);
-            if (ret == 0) goto lab9; /* call tidy, line 193 */
+    {   int m8 = z->l - z->c; (void)m8; /* do, line 194 */
+        {   int ret = r_tidy(z); /* call tidy, line 194 */
+            if (ret == 0) goto lab9;
             if (ret < 0) return ret;
         }
     lab9:
-        z->c = z->l - m9;
+        z->c = z->l - m8;
     }
     z->c = z->lb;
     return 1;
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_french.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_french.c
index fc79c0a24d..1a1732b216 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_french.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_french.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -370,82 +370,71 @@ static const unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 
 static const unsigned char g_keep_with_s[] = { 1, 65, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
 
-static const symbol s_0[] = { 'u' };
-static const symbol s_1[] = { 'U' };
-static const symbol s_2[] = { 'i' };
-static const symbol s_3[] = { 'I' };
-static const symbol s_4[] = { 'y' };
-static const symbol s_5[] = { 'Y' };
-static const symbol s_6[] = { 'y' };
-static const symbol s_7[] = { 'Y' };
-static const symbol s_8[] = { 'q' };
-static const symbol s_9[] = { 'u' };
-static const symbol s_10[] = { 'U' };
-static const symbol s_11[] = { 'i' };
-static const symbol s_12[] = { 'u' };
-static const symbol s_13[] = { 'y' };
-static const symbol s_14[] = { 'i', 'c' };
-static const symbol s_15[] = { 'i', 'q', 'U' };
-static const symbol s_16[] = { 'l', 'o', 'g' };
-static const symbol s_17[] = { 'u' };
-static const symbol s_18[] = { 'e', 'n', 't' };
-static const symbol s_19[] = { 'a', 't' };
-static const symbol s_20[] = { 'e', 'u', 'x' };
-static const symbol s_21[] = { 'i' };
-static const symbol s_22[] = { 'a', 'b', 'l' };
-static const symbol s_23[] = { 'i', 'q', 'U' };
-static const symbol s_24[] = { 'a', 't' };
-static const symbol s_25[] = { 'i', 'c' };
-static const symbol s_26[] = { 'i', 'q', 'U' };
-static const symbol s_27[] = { 'e', 'a', 'u' };
-static const symbol s_28[] = { 'a', 'l' };
-static const symbol s_29[] = { 'e', 'u', 'x' };
-static const symbol s_30[] = { 'a', 'n', 't' };
-static const symbol s_31[] = { 'e', 'n', 't' };
-static const symbol s_32[] = { 'e' };
-static const symbol s_33[] = { 's' };
-static const symbol s_34[] = { 's' };
-static const symbol s_35[] = { 't' };
-static const symbol s_36[] = { 'i' };
-static const symbol s_37[] = { 'g', 'u' };
-static const symbol s_38[] = { 0xE9 };
-static const symbol s_39[] = { 0xE8 };
-static const symbol s_40[] = { 'e' };
-static const symbol s_41[] = { 'Y' };
-static const symbol s_42[] = { 'i' };
-static const symbol s_43[] = { 0xE7 };
-static const symbol s_44[] = { 'c' };
+static const symbol s_0[] = { 'U' };
+static const symbol s_1[] = { 'I' };
+static const symbol s_2[] = { 'Y' };
+static const symbol s_3[] = { 'Y' };
+static const symbol s_4[] = { 'U' };
+static const symbol s_5[] = { 'i' };
+static const symbol s_6[] = { 'u' };
+static const symbol s_7[] = { 'y' };
+static const symbol s_8[] = { 'i', 'c' };
+static const symbol s_9[] = { 'i', 'q', 'U' };
+static const symbol s_10[] = { 'l', 'o', 'g' };
+static const symbol s_11[] = { 'u' };
+static const symbol s_12[] = { 'e', 'n', 't' };
+static const symbol s_13[] = { 'a', 't' };
+static const symbol s_14[] = { 'e', 'u', 'x' };
+static const symbol s_15[] = { 'i' };
+static const symbol s_16[] = { 'a', 'b', 'l' };
+static const symbol s_17[] = { 'i', 'q', 'U' };
+static const symbol s_18[] = { 'a', 't' };
+static const symbol s_19[] = { 'i', 'c' };
+static const symbol s_20[] = { 'i', 'q', 'U' };
+static const symbol s_21[] = { 'e', 'a', 'u' };
+static const symbol s_22[] = { 'a', 'l' };
+static const symbol s_23[] = { 'e', 'u', 'x' };
+static const symbol s_24[] = { 'a', 'n', 't' };
+static const symbol s_25[] = { 'e', 'n', 't' };
+static const symbol s_26[] = { 'i' };
+static const symbol s_27[] = { 'g', 'u' };
+static const symbol s_28[] = { 'e' };
+static const symbol s_29[] = { 'i' };
+static const symbol s_30[] = { 'c' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     while(1) { /* repeat, line 38 */
         int c1 = z->c;
         while(1) { /* goto, line 38 */
             int c2 = z->c;
             {   int c3 = z->c; /* or, line 44 */
-                if (in_grouping(z, g_v, 97, 251, 0)) goto lab3;
+                if (in_grouping(z, g_v, 97, 251, 0)) goto lab3; /* grouping v, line 40 */
                 z->bra = z->c; /* [, line 40 */
                 {   int c4 = z->c; /* or, line 40 */
-                    if (!(eq_s(z, 1, s_0))) goto lab5;
+                    if (z->c == z->l || z->p[z->c] != 'u') goto lab5; /* literal, line 40 */
+                    z->c++;
                     z->ket = z->c; /* ], line 40 */
-                    if (in_grouping(z, g_v, 97, 251, 0)) goto lab5;
-                    {   int ret = slice_from_s(z, 1, s_1); /* <-, line 40 */
+                    if (in_grouping(z, g_v, 97, 251, 0)) goto lab5; /* grouping v, line 40 */
+                    {   int ret = slice_from_s(z, 1, s_0); /* <-, line 40 */
                         if (ret < 0) return ret;
                     }
                     goto lab4;
                 lab5:
                     z->c = c4;
-                    if (!(eq_s(z, 1, s_2))) goto lab6;
+                    if (z->c == z->l || z->p[z->c] != 'i') goto lab6; /* literal, line 41 */
+                    z->c++;
                     z->ket = z->c; /* ], line 41 */
-                    if (in_grouping(z, g_v, 97, 251, 0)) goto lab6;
-                    {   int ret = slice_from_s(z, 1, s_3); /* <-, line 41 */
+                    if (in_grouping(z, g_v, 97, 251, 0)) goto lab6; /* grouping v, line 41 */
+                    {   int ret = slice_from_s(z, 1, s_1); /* <-, line 41 */
                         if (ret < 0) return ret;
                     }
                     goto lab4;
                 lab6:
                     z->c = c4;
-                    if (!(eq_s(z, 1, s_4))) goto lab3;
+                    if (z->c == z->l || z->p[z->c] != 'y') goto lab3; /* literal, line 42 */
+                    z->c++;
                     z->ket = z->c; /* ], line 42 */
-                    {   int ret = slice_from_s(z, 1, s_5); /* <-, line 42 */
+                    {   int ret = slice_from_s(z, 1, s_2); /* <-, line 42 */
                         if (ret < 0) return ret;
                     }
                 }
@@ -454,20 +443,23 @@ static int r_prelude(struct SN_env * z) {
             lab3:
                 z->c = c3;
                 z->bra = z->c; /* [, line 45 */
-                if (!(eq_s(z, 1, s_6))) goto lab7;
+                if (z->c == z->l || z->p[z->c] != 'y') goto lab7; /* literal, line 45 */
+                z->c++;
                 z->ket = z->c; /* ], line 45 */
-                if (in_grouping(z, g_v, 97, 251, 0)) goto lab7;
-                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 45 */
+                if (in_grouping(z, g_v, 97, 251, 0)) goto lab7; /* grouping v, line 45 */
+                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 45 */
                     if (ret < 0) return ret;
                 }
                 goto lab2;
             lab7:
                 z->c = c3;
-                if (!(eq_s(z, 1, s_8))) goto lab1;
+                if (z->c == z->l || z->p[z->c] != 'q') goto lab1; /* literal, line 47 */
+                z->c++;
                 z->bra = z->c; /* [, line 47 */
-                if (!(eq_s(z, 1, s_9))) goto lab1;
+                if (z->c == z->l || z->p[z->c] != 'u') goto lab1; /* literal, line 47 */
+                z->c++;
                 z->ket = z->c; /* ], line 47 */
-                {   int ret = slice_from_s(z, 1, s_10); /* <-, line 47 */
+                {   int ret = slice_from_s(z, 1, s_4); /* <-, line 47 */
                     if (ret < 0) return ret;
                 }
             }
@@ -487,21 +479,21 @@ static int r_prelude(struct SN_env * z) {
     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;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 52 */
+    z->I[1] = z->l; /* $p1 = <integer expression>, line 53 */
+    z->I[2] = z->l; /* $p2 = <integer expression>, line 54 */
     {   int c1 = z->c; /* do, line 56 */
         {   int c2 = z->c; /* or, line 58 */
-            if (in_grouping(z, g_v, 97, 251, 0)) goto lab2;
-            if (in_grouping(z, g_v, 97, 251, 0)) goto lab2;
+            if (in_grouping(z, g_v, 97, 251, 0)) goto lab2; /* grouping v, line 57 */
+            if (in_grouping(z, g_v, 97, 251, 0)) goto lab2; /* grouping v, line 57 */
             if (z->c >= z->l) goto lab2;
             z->c++; /* next, line 57 */
             goto lab1;
         lab2:
             z->c = c2;
-            if (z->c + 2 >= z->l || z->p[z->c + 2] >> 5 != 3 || !((331776 >> (z->p[z->c + 2] & 0x1f)) & 1)) goto lab3;
-            if (!(find_among(z, a_0, 3))) goto lab3; /* among, line 59 */
+            if (z->c + 2 >= z->l || z->p[z->c + 2] >> 5 != 3 || !((331776 >> (z->p[z->c + 2] & 0x1f)) & 1)) goto lab3; /* among, line 59 */
+            if (!(find_among(z, a_0, 3))) goto lab3;
             goto lab1;
         lab3:
             z->c = c2;
@@ -547,29 +539,28 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 75 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 77 */
-        if (z->c >= z->l || z->p[z->c + 0] >> 5 != 2 || !((35652096 >> (z->p[z->c + 0] & 0x1f)) & 1)) among_var = 4; else
-        among_var = find_among(z, a_1, 4); /* substring, line 77 */
+        if (z->c >= z->l || z->p[z->c + 0] >> 5 != 2 || !((35652096 >> (z->p[z->c + 0] & 0x1f)) & 1)) among_var = 4; else /* substring, line 77 */
+        among_var = find_among(z, a_1, 4);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 77 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 77 */
             case 1:
-                {   int ret = slice_from_s(z, 1, s_11); /* <-, line 78 */
+                {   int ret = slice_from_s(z, 1, s_5); /* <-, line 78 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_12); /* <-, line 79 */
+                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 79 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 3:
-                {   int ret = slice_from_s(z, 1, s_13); /* <-, line 80 */
+                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 80 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -586,53 +577,50 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_RV(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_RV(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 87 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 88 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[2] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[2] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 89 */
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 92 */
     among_var = find_among_b(z, a_4, 43); /* substring, line 92 */
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 92 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 92 */
         case 1:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 96 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 96 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 96 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 99 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 99 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 99 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 100 */
+            {   int m1 = z->l - z->c; (void)m1; /* try, line 100 */
                 z->ket = z->c; /* [, line 100 */
-                if (!(eq_s_b(z, 2, s_14))) { z->c = z->l - m_keep; goto lab0; }
+                if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m1; goto lab0; } /* literal, line 100 */
                 z->bra = z->c; /* ], line 100 */
-                {   int m1 = z->l - z->c; (void)m1; /* or, line 100 */
-                    {   int ret = r_R2(z);
-                        if (ret == 0) goto lab2; /* call R2, line 100 */
+                {   int m2 = z->l - z->c; (void)m2; /* or, line 100 */
+                    {   int ret = r_R2(z); /* call R2, line 100 */
+                        if (ret == 0) goto lab2;
                         if (ret < 0) return ret;
                     }
                     {   int ret = slice_del(z); /* delete, line 100 */
@@ -640,8 +628,8 @@ static int r_standard_suffix(struct SN_env * z) {
                     }
                     goto lab1;
                 lab2:
-                    z->c = z->l - m1;
-                    {   int ret = slice_from_s(z, 3, s_15); /* <-, line 100 */
+                    z->c = z->l - m2;
+                    {   int ret = slice_from_s(z, 3, s_9); /* <-, line 100 */
                         if (ret < 0) return ret;
                     }
                 }
@@ -651,60 +639,55 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 3:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 104 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 104 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_16); /* <-, line 104 */
+            {   int ret = slice_from_s(z, 3, s_10); /* <-, line 104 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 107 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 107 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 1, s_17); /* <-, line 107 */
+            {   int ret = slice_from_s(z, 1, s_11); /* <-, line 107 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 110 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 110 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 110 */
+            {   int ret = slice_from_s(z, 3, s_12); /* <-, line 110 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 114 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 114 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 114 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 115 */
+            {   int m3 = z->l - z->c; (void)m3; /* try, line 115 */
                 z->ket = z->c; /* [, line 116 */
                 among_var = find_among_b(z, a_2, 6); /* substring, line 116 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab3; }
+                if (!(among_var)) { z->c = z->l - m3; goto lab3; }
                 z->bra = z->c; /* ], line 116 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab3; }
+                switch (among_var) { /* among, line 116 */
                     case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 117 */
+                        {   int ret = r_R2(z); /* call R2, line 117 */
+                            if (ret == 0) { z->c = z->l - m3; goto lab3; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 117 */
                             if (ret < 0) return ret;
                         }
                         z->ket = z->c; /* [, line 117 */
-                        if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m_keep; goto lab3; }
+                        if (!(eq_s_b(z, 2, s_13))) { z->c = z->l - m3; goto lab3; } /* literal, line 117 */
                         z->bra = z->c; /* ], line 117 */
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 117 */
+                        {   int ret = r_R2(z); /* call R2, line 117 */
+                            if (ret == 0) { z->c = z->l - m3; goto lab3; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 117 */
@@ -712,9 +695,9 @@ static int r_standard_suffix(struct SN_env * z) {
                         }
                         break;
                     case 2:
-                        {   int m2 = z->l - z->c; (void)m2; /* or, line 118 */
-                            {   int ret = r_R2(z);
-                                if (ret == 0) goto lab5; /* call R2, line 118 */
+                        {   int m4 = z->l - z->c; (void)m4; /* or, line 118 */
+                            {   int ret = r_R2(z); /* call R2, line 118 */
+                                if (ret == 0) goto lab5;
                                 if (ret < 0) return ret;
                             }
                             {   int ret = slice_del(z); /* delete, line 118 */
@@ -722,20 +705,20 @@ static int r_standard_suffix(struct SN_env * z) {
                             }
                             goto lab4;
                         lab5:
-                            z->c = z->l - m2;
-                            {   int ret = r_R1(z);
-                                if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R1, line 118 */
+                            z->c = z->l - m4;
+                            {   int ret = r_R1(z); /* call R1, line 118 */
+                                if (ret == 0) { z->c = z->l - m3; goto lab3; }
                                 if (ret < 0) return ret;
                             }
-                            {   int ret = slice_from_s(z, 3, s_20); /* <-, line 118 */
+                            {   int ret = slice_from_s(z, 3, s_14); /* <-, line 118 */
                                 if (ret < 0) return ret;
                             }
                         }
                     lab4:
                         break;
                     case 3:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 120 */
+                        {   int ret = r_R2(z); /* call R2, line 120 */
+                            if (ret == 0) { z->c = z->l - m3; goto lab3; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 120 */
@@ -743,11 +726,11 @@ static int r_standard_suffix(struct SN_env * z) {
                         }
                         break;
                     case 4:
-                        {   int ret = r_RV(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call RV, line 122 */
+                        {   int ret = r_RV(z); /* call RV, line 122 */
+                            if (ret == 0) { z->c = z->l - m3; goto lab3; }
                             if (ret < 0) return ret;
                         }
-                        {   int ret = slice_from_s(z, 1, s_21); /* <-, line 122 */
+                        {   int ret = slice_from_s(z, 1, s_15); /* <-, line 122 */
                             if (ret < 0) return ret;
                         }
                         break;
@@ -757,25 +740,23 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 7:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 129 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 129 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 129 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 130 */
+            {   int m5 = z->l - z->c; (void)m5; /* try, line 130 */
                 z->ket = z->c; /* [, line 131 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab6; }
-                among_var = find_among_b(z, a_3, 3); /* substring, line 131 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab6; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m5; goto lab6; } /* substring, line 131 */
+                among_var = find_among_b(z, a_3, 3);
+                if (!(among_var)) { z->c = z->l - m5; goto lab6; }
                 z->bra = z->c; /* ], line 131 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab6; }
+                switch (among_var) { /* among, line 131 */
                     case 1:
-                        {   int m3 = z->l - z->c; (void)m3; /* or, line 132 */
-                            {   int ret = r_R2(z);
-                                if (ret == 0) goto lab8; /* call R2, line 132 */
+                        {   int m6 = z->l - z->c; (void)m6; /* or, line 132 */
+                            {   int ret = r_R2(z); /* call R2, line 132 */
+                                if (ret == 0) goto lab8;
                                 if (ret < 0) return ret;
                             }
                             {   int ret = slice_del(z); /* delete, line 132 */
@@ -783,17 +764,17 @@ static int r_standard_suffix(struct SN_env * z) {
                             }
                             goto lab7;
                         lab8:
-                            z->c = z->l - m3;
-                            {   int ret = slice_from_s(z, 3, s_22); /* <-, line 132 */
+                            z->c = z->l - m6;
+                            {   int ret = slice_from_s(z, 3, s_16); /* <-, line 132 */
                                 if (ret < 0) return ret;
                             }
                         }
                     lab7:
                         break;
                     case 2:
-                        {   int m4 = z->l - z->c; (void)m4; /* or, line 133 */
-                            {   int ret = r_R2(z);
-                                if (ret == 0) goto lab10; /* call R2, line 133 */
+                        {   int m7 = z->l - z->c; (void)m7; /* or, line 133 */
+                            {   int ret = r_R2(z); /* call R2, line 133 */
+                                if (ret == 0) goto lab10;
                                 if (ret < 0) return ret;
                             }
                             {   int ret = slice_del(z); /* delete, line 133 */
@@ -801,16 +782,16 @@ static int r_standard_suffix(struct SN_env * z) {
                             }
                             goto lab9;
                         lab10:
-                            z->c = z->l - m4;
-                            {   int ret = slice_from_s(z, 3, s_23); /* <-, line 133 */
+                            z->c = z->l - m7;
+                            {   int ret = slice_from_s(z, 3, s_17); /* <-, line 133 */
                                 if (ret < 0) return ret;
                             }
                         }
                     lab9:
                         break;
                     case 3:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab6; } /* call R2, line 134 */
+                        {   int ret = r_R2(z); /* call R2, line 134 */
+                            if (ret == 0) { z->c = z->l - m5; goto lab6; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 134 */
@@ -823,30 +804,29 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 8:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 141 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 141 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 141 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 142 */
+            {   int m8 = z->l - z->c; (void)m8; /* try, line 142 */
                 z->ket = z->c; /* [, line 142 */
-                if (!(eq_s_b(z, 2, s_24))) { z->c = z->l - m_keep; goto lab11; }
+                if (!(eq_s_b(z, 2, s_18))) { z->c = z->l - m8; goto lab11; } /* literal, line 142 */
                 z->bra = z->c; /* ], line 142 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab11; } /* call R2, line 142 */
+                {   int ret = r_R2(z); /* call R2, line 142 */
+                    if (ret == 0) { z->c = z->l - m8; goto lab11; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 142 */
                     if (ret < 0) return ret;
                 }
                 z->ket = z->c; /* [, line 142 */
-                if (!(eq_s_b(z, 2, s_25))) { z->c = z->l - m_keep; goto lab11; }
+                if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m8; goto lab11; } /* literal, line 142 */
                 z->bra = z->c; /* ], line 142 */
-                {   int m5 = z->l - z->c; (void)m5; /* or, line 142 */
-                    {   int ret = r_R2(z);
-                        if (ret == 0) goto lab13; /* call R2, line 142 */
+                {   int m9 = z->l - z->c; (void)m9; /* or, line 142 */
+                    {   int ret = r_R2(z); /* call R2, line 142 */
+                        if (ret == 0) goto lab13;
                         if (ret < 0) return ret;
                     }
                     {   int ret = slice_del(z); /* delete, line 142 */
@@ -854,8 +834,8 @@ static int r_standard_suffix(struct SN_env * z) {
                     }
                     goto lab12;
                 lab13:
-                    z->c = z->l - m5;
-                    {   int ret = slice_from_s(z, 3, s_26); /* <-, line 142 */
+                    z->c = z->l - m9;
+                    {   int ret = slice_from_s(z, 3, s_20); /* <-, line 142 */
                         if (ret < 0) return ret;
                     }
                 }
@@ -865,23 +845,22 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 9:
-            {   int ret = slice_from_s(z, 3, s_27); /* <-, line 144 */
+            {   int ret = slice_from_s(z, 3, s_21); /* <-, line 144 */
                 if (ret < 0) return ret;
             }
             break;
         case 10:
-            {   int ret = r_R1(z);
-                if (ret == 0) return 0; /* call R1, line 145 */
-                if (ret < 0) return ret;
+            {   int ret = r_R1(z); /* call R1, line 145 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 2, s_28); /* <-, line 145 */
+            {   int ret = slice_from_s(z, 2, s_22); /* <-, line 145 */
                 if (ret < 0) return ret;
             }
             break;
         case 11:
-            {   int m6 = z->l - z->c; (void)m6; /* or, line 147 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab15; /* call R2, line 147 */
+            {   int m10 = z->l - z->c; (void)m10; /* or, line 147 */
+                {   int ret = r_R2(z); /* call R2, line 147 */
+                    if (ret == 0) goto lab15;
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 147 */
@@ -889,55 +868,50 @@ static int r_standard_suffix(struct SN_env * z) {
                 }
                 goto lab14;
             lab15:
-                z->c = z->l - m6;
-                {   int ret = r_R1(z);
-                    if (ret == 0) return 0; /* call R1, line 147 */
-                    if (ret < 0) return ret;
+                z->c = z->l - m10;
+                {   int ret = r_R1(z); /* call R1, line 147 */
+                    if (ret <= 0) return ret;
                 }
-                {   int ret = slice_from_s(z, 3, s_29); /* <-, line 147 */
+                {   int ret = slice_from_s(z, 3, s_23); /* <-, line 147 */
                     if (ret < 0) return ret;
                 }
             }
         lab14:
             break;
         case 12:
-            {   int ret = r_R1(z);
-                if (ret == 0) return 0; /* call R1, line 150 */
-                if (ret < 0) return ret;
+            {   int ret = r_R1(z); /* call R1, line 150 */
+                if (ret <= 0) return ret;
             }
-            if (out_grouping_b(z, g_v, 97, 251, 0)) return 0;
+            if (out_grouping_b(z, g_v, 97, 251, 0)) return 0; /* non v, line 150 */
             {   int ret = slice_del(z); /* delete, line 150 */
                 if (ret < 0) return ret;
             }
             break;
         case 13:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 155 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 155 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_30); /* <-, line 155 */
+            {   int ret = slice_from_s(z, 3, s_24); /* <-, line 155 */
                 if (ret < 0) return ret;
             }
             return 0; /* fail, line 155 */
             break;
         case 14:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 156 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 156 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_31); /* <-, line 156 */
+            {   int ret = slice_from_s(z, 3, s_25); /* <-, line 156 */
                 if (ret < 0) return ret;
             }
             return 0; /* fail, line 156 */
             break;
         case 15:
-            {   int m_test = z->l - z->c; /* test, line 158 */
-                if (in_grouping_b(z, g_v, 97, 251, 0)) return 0;
-                {   int ret = r_RV(z);
-                    if (ret == 0) return 0; /* call RV, line 158 */
-                    if (ret < 0) return ret;
+            {   int m_test11 = z->l - z->c; /* test, line 158 */
+                if (in_grouping_b(z, g_v, 97, 251, 0)) return 0; /* grouping v, line 158 */
+                {   int ret = r_RV(z); /* call RV, line 158 */
+                    if (ret <= 0) return ret;
                 }
-                z->c = z->l - m_test;
+                z->c = z->l - m_test11;
             }
             {   int ret = slice_del(z); /* delete, line 158 */
                 if (ret < 0) return ret;
@@ -948,50 +922,38 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_i_verb_suffix(struct SN_env * z) {
-    int among_var;
-    {   int mlimit; /* setlimit, line 163 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_i_verb_suffix(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 163 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 163 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 164 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68944418 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_5, 35); /* substring, line 164 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68944418 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 164 */
+        if (!(find_among_b(z, a_5, 35))) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 164 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
-            case 1:
-                if (out_grouping_b(z, g_v, 97, 251, 0)) { z->lb = mlimit; return 0; }
-                {   int ret = slice_del(z); /* delete, line 170 */
-                    if (ret < 0) return ret;
-                }
-                break;
+        if (out_grouping_b(z, g_v, 97, 251, 0)) { z->lb = mlimit1; return 0; } /* non v, line 170 */
+        {   int ret = slice_del(z); /* delete, line 170 */
+            if (ret < 0) return ret;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_verb_suffix(struct SN_env * z) {
+static int r_verb_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 174 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 174 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 174 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 175 */
         among_var = find_among_b(z, a_6, 38); /* substring, line 175 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 175 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
+        switch (among_var) { /* among, line 175 */
             case 1:
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->lb = mlimit; return 0; } /* call R2, line 177 */
+                {   int ret = r_R2(z); /* call R2, line 177 */
+                    if (ret == 0) { z->lb = mlimit1; return 0; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 177 */
@@ -1007,9 +969,10 @@ static int r_verb_suffix(struct SN_env * z) {
                 {   int ret = slice_del(z); /* delete, line 190 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 191 */
+                {   int m2 = z->l - z->c; (void)m2; /* try, line 191 */
                     z->ket = z->c; /* [, line 191 */
-                    if (!(eq_s_b(z, 1, s_32))) { z->c = z->l - m_keep; goto lab0; }
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'e') { z->c = z->l - m2; goto lab0; } /* literal, line 191 */
+                    z->c--;
                     z->bra = z->c; /* ], line 191 */
                     {   int ret = slice_del(z); /* delete, line 191 */
                         if (ret < 0) return ret;
@@ -1019,20 +982,21 @@ static int r_verb_suffix(struct SN_env * z) {
                 }
                 break;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_residual_suffix(struct SN_env * z) {
+static int r_residual_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 199 */
+    {   int m1 = z->l - z->c; (void)m1; /* try, line 199 */
         z->ket = z->c; /* [, line 199 */
-        if (!(eq_s_b(z, 1, s_33))) { z->c = z->l - m_keep; goto lab0; }
+        if (z->c <= z->lb || z->p[z->c - 1] != 's') { z->c = z->l - m1; goto lab0; } /* literal, line 199 */
+        z->c--;
         z->bra = z->c; /* ], line 199 */
-        {   int m_test = z->l - z->c; /* test, line 199 */
-            if (out_grouping_b(z, g_keep_with_s, 97, 232, 0)) { z->c = z->l - m_keep; goto lab0; }
-            z->c = z->l - m_test;
+        {   int m_test2 = z->l - z->c; /* test, line 199 */
+            if (out_grouping_b(z, g_keep_with_s, 97, 232, 0)) { z->c = z->l - m1; goto lab0; } /* non keep_with_s, line 199 */
+            z->c = z->l - m_test2;
         }
         {   int ret = slice_del(z); /* delete, line 199 */
             if (ret < 0) return ret;
@@ -1040,29 +1004,28 @@ static int r_residual_suffix(struct SN_env * z) {
     lab0:
         ;
     }
-    {   int mlimit; /* setlimit, line 200 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit3; /* setlimit, line 200 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 200 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit3 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 201 */
         among_var = find_among_b(z, a_7, 7); /* substring, line 201 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(among_var)) { z->lb = mlimit3; return 0; }
         z->bra = z->c; /* ], line 201 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
+        switch (among_var) { /* among, line 201 */
             case 1:
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->lb = mlimit; return 0; } /* call R2, line 202 */
+                {   int ret = r_R2(z); /* call R2, line 202 */
+                    if (ret == 0) { z->lb = mlimit3; return 0; }
                     if (ret < 0) return ret;
                 }
-                {   int m2 = z->l - z->c; (void)m2; /* or, line 202 */
-                    if (!(eq_s_b(z, 1, s_34))) goto lab2;
+                {   int m4 = z->l - z->c; (void)m4; /* or, line 202 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 's') goto lab2; /* literal, line 202 */
+                    z->c--;
                     goto lab1;
                 lab2:
-                    z->c = z->l - m2;
-                    if (!(eq_s_b(z, 1, s_35))) { z->lb = mlimit; return 0; }
+                    z->c = z->l - m4;
+                    if (z->c <= z->lb || z->p[z->c - 1] != 't') { z->lb = mlimit3; return 0; } /* literal, line 202 */
+                    z->c--;
                 }
             lab1:
                 {   int ret = slice_del(z); /* delete, line 202 */
@@ -1070,7 +1033,7 @@ static int r_residual_suffix(struct SN_env * z) {
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_36); /* <-, line 204 */
+                {   int ret = slice_from_s(z, 1, s_26); /* <-, line 204 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -1080,22 +1043,22 @@ static int r_residual_suffix(struct SN_env * z) {
                 }
                 break;
             case 4:
-                if (!(eq_s_b(z, 2, s_37))) { z->lb = mlimit; return 0; }
+                if (!(eq_s_b(z, 2, s_27))) { z->lb = mlimit3; return 0; } /* literal, line 206 */
                 {   int ret = slice_del(z); /* delete, line 206 */
                     if (ret < 0) return ret;
                 }
                 break;
         }
-        z->lb = mlimit;
+        z->lb = mlimit3;
     }
     return 1;
 }
 
-static int r_un_double(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 212 */
-        if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1069056 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-        if (!(find_among_b(z, a_8, 5))) return 0; /* among, line 212 */
-        z->c = z->l - m_test;
+static int r_un_double(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 212 */
+        if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1069056 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* among, line 212 */
+        if (!(find_among_b(z, a_8, 5))) return 0;
+        z->c = z->l - m_test1;
     }
     z->ket = z->c; /* [, line 212 */
     if (z->c <= z->lb) return 0;
@@ -1107,10 +1070,10 @@ static int r_un_double(struct SN_env * z) {
     return 1;
 }
 
-static int r_un_accent(struct SN_env * z) {
+static int r_un_accent(struct SN_env * z) { /* backwardmode */
     {   int i = 1;
         while(1) { /* atleast, line 216 */
-            if (out_grouping_b(z, g_v, 97, 251, 0)) goto lab0;
+            if (out_grouping_b(z, g_v, 97, 251, 0)) goto lab0; /* non v, line 216 */
             i--;
             continue;
         lab0:
@@ -1120,78 +1083,80 @@ static int r_un_accent(struct SN_env * z) {
     }
     z->ket = z->c; /* [, line 217 */
     {   int m1 = z->l - z->c; (void)m1; /* or, line 217 */
-        if (!(eq_s_b(z, 1, s_38))) goto lab2;
+        if (z->c <= z->lb || z->p[z->c - 1] != 0xE9) goto lab2; /* literal, line 217 */
+        z->c--;
         goto lab1;
     lab2:
         z->c = z->l - m1;
-        if (!(eq_s_b(z, 1, s_39))) return 0;
+        if (z->c <= z->lb || z->p[z->c - 1] != 0xE8) return 0; /* literal, line 217 */
+        z->c--;
     }
 lab1:
     z->bra = z->c; /* ], line 217 */
-    {   int ret = slice_from_s(z, 1, s_40); /* <-, line 217 */
+    {   int ret = slice_from_s(z, 1, s_28); /* <-, line 217 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-extern int french_ISO_8859_1_stem(struct SN_env * z) {
+extern int french_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 223 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 223 */
+        {   int ret = r_prelude(z); /* call prelude, line 223 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    {   int c2 = z->c; /* do, line 224 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab1; /* call mark_regions, line 224 */
-            if (ret < 0) return ret;
-        }
-    lab1:
-        z->c = c2;
+    /* do, line 224 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 224 */
+        if (ret == 0) goto lab1;
+        if (ret < 0) return ret;
     }
+lab1:
     z->lb = z->c; z->c = z->l; /* backwards, line 225 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 227 */
-        {   int m4 = z->l - z->c; (void)m4; /* or, line 237 */
-            {   int m5 = z->l - z->c; (void)m5; /* and, line 233 */
-                {   int m6 = z->l - z->c; (void)m6; /* or, line 229 */
-                    {   int ret = r_standard_suffix(z);
-                        if (ret == 0) goto lab6; /* call standard_suffix, line 229 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 227 */
+        {   int m3 = z->l - z->c; (void)m3; /* or, line 237 */
+            {   int m4 = z->l - z->c; (void)m4; /* and, line 233 */
+                {   int m5 = z->l - z->c; (void)m5; /* or, line 229 */
+                    {   int ret = r_standard_suffix(z); /* call standard_suffix, line 229 */
+                        if (ret == 0) goto lab6;
                         if (ret < 0) return ret;
                     }
                     goto lab5;
                 lab6:
-                    z->c = z->l - m6;
-                    {   int ret = r_i_verb_suffix(z);
-                        if (ret == 0) goto lab7; /* call i_verb_suffix, line 230 */
+                    z->c = z->l - m5;
+                    {   int ret = r_i_verb_suffix(z); /* call i_verb_suffix, line 230 */
+                        if (ret == 0) goto lab7;
                         if (ret < 0) return ret;
                     }
                     goto lab5;
                 lab7:
-                    z->c = z->l - m6;
-                    {   int ret = r_verb_suffix(z);
-                        if (ret == 0) goto lab4; /* call verb_suffix, line 231 */
+                    z->c = z->l - m5;
+                    {   int ret = r_verb_suffix(z); /* call verb_suffix, line 231 */
+                        if (ret == 0) goto lab4;
                         if (ret < 0) return ret;
                     }
                 }
             lab5:
-                z->c = z->l - m5;
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 234 */
+                z->c = z->l - m4;
+                {   int m6 = z->l - z->c; (void)m6; /* try, line 234 */
                     z->ket = z->c; /* [, line 234 */
                     {   int m7 = z->l - z->c; (void)m7; /* or, line 234 */
-                        if (!(eq_s_b(z, 1, s_41))) goto lab10;
+                        if (z->c <= z->lb || z->p[z->c - 1] != 'Y') goto lab10; /* literal, line 234 */
+                        z->c--;
                         z->bra = z->c; /* ], line 234 */
-                        {   int ret = slice_from_s(z, 1, s_42); /* <-, line 234 */
+                        {   int ret = slice_from_s(z, 1, s_29); /* <-, line 234 */
                             if (ret < 0) return ret;
                         }
                         goto lab9;
                     lab10:
                         z->c = z->l - m7;
-                        if (!(eq_s_b(z, 1, s_43))) { z->c = z->l - m_keep; goto lab8; }
+                        if (z->c <= z->lb || z->p[z->c - 1] != 0xE7) { z->c = z->l - m6; goto lab8; } /* literal, line 235 */
+                        z->c--;
                         z->bra = z->c; /* ], line 235 */
-                        {   int ret = slice_from_s(z, 1, s_44); /* <-, line 235 */
+                        {   int ret = slice_from_s(z, 1, s_30); /* <-, line 235 */
                             if (ret < 0) return ret;
                         }
                     }
@@ -1202,27 +1167,27 @@ extern int french_ISO_8859_1_stem(struct SN_env * z) {
             }
             goto lab3;
         lab4:
-            z->c = z->l - m4;
-            {   int ret = r_residual_suffix(z);
-                if (ret == 0) goto lab2; /* call residual_suffix, line 238 */
+            z->c = z->l - m3;
+            {   int ret = r_residual_suffix(z); /* call residual_suffix, line 238 */
+                if (ret == 0) goto lab2;
                 if (ret < 0) return ret;
             }
         }
     lab3:
     lab2:
-        z->c = z->l - m3;
+        z->c = z->l - m2;
     }
     {   int m8 = z->l - z->c; (void)m8; /* do, line 243 */
-        {   int ret = r_un_double(z);
-            if (ret == 0) goto lab11; /* call un_double, line 243 */
+        {   int ret = r_un_double(z); /* call un_double, line 243 */
+            if (ret == 0) goto lab11;
             if (ret < 0) return ret;
         }
     lab11:
         z->c = z->l - m8;
     }
     {   int m9 = z->l - z->c; (void)m9; /* do, line 244 */
-        {   int ret = r_un_accent(z);
-            if (ret == 0) goto lab12; /* call un_accent, line 244 */
+        {   int ret = r_un_accent(z); /* call un_accent, line 244 */
+            if (ret == 0) goto lab12;
             if (ret < 0) return ret;
         }
     lab12:
@@ -1230,8 +1195,8 @@ extern int french_ISO_8859_1_stem(struct SN_env * z) {
     }
     z->c = z->lb;
     {   int c10 = z->c; /* do, line 246 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab13; /* call postlude, line 246 */
+        {   int ret = r_postlude(z); /* call postlude, line 246 */
+            if (ret == 0) goto lab13;
             if (ret < 0) return ret;
         }
     lab13:
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_german.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_german.c
index 13c2423092..ae334f80bf 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_german.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_german.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -36,12 +36,12 @@ static const symbol s_0_5[1] = { 0xFC };
 
 static const struct among a_0[6] =
 {
-/*  0 */ { 0, 0, -1, 6, 0},
+/*  0 */ { 0, 0, -1, 5, 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}
+/*  5 */ { 1, s_0_5, 0, 2, 0}
 };
 
 static const symbol s_1_0[1] = { 'e' };
@@ -54,13 +54,13 @@ static const symbol s_1_6[2] = { 'e', 's' };
 
 static const struct among a_1[7] =
 {
-/*  0 */ { 1, s_1_0, -1, 1, 0},
+/*  0 */ { 1, s_1_0, -1, 2, 0},
 /*  1 */ { 2, s_1_1, -1, 1, 0},
-/*  2 */ { 2, s_1_2, -1, 1, 0},
+/*  2 */ { 2, s_1_2, -1, 2, 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}
+/*  5 */ { 1, s_1_5, -1, 3, 0},
+/*  6 */ { 2, s_1_6, 5, 2, 0}
 };
 
 static const symbol s_2_0[2] = { 'e', 'n' };
@@ -112,165 +112,157 @@ static const unsigned char g_s_ending[] = { 117, 30, 5 };
 
 static const unsigned char g_st_ending[] = { 117, 30, 4 };
 
-static const symbol s_0[] = { 0xDF };
-static const symbol s_1[] = { 's', 's' };
-static const symbol s_2[] = { 'u' };
-static const symbol s_3[] = { 'U' };
-static const symbol s_4[] = { 'y' };
-static const symbol s_5[] = { 'Y' };
-static const symbol s_6[] = { 'y' };
-static const symbol s_7[] = { 'u' };
-static const symbol s_8[] = { 'a' };
-static const symbol s_9[] = { 'o' };
-static const symbol s_10[] = { 'u' };
-static const symbol s_11[] = { 'i', 'g' };
-static const symbol s_12[] = { 'e' };
-static const symbol s_13[] = { 'e' };
-static const symbol s_14[] = { 'e', 'r' };
-static const symbol s_15[] = { 'e', 'n' };
+static const symbol s_0[] = { 's', 's' };
+static const symbol s_1[] = { 'U' };
+static const symbol s_2[] = { 'Y' };
+static const symbol s_3[] = { 'y' };
+static const symbol s_4[] = { 'u' };
+static const symbol s_5[] = { 'a' };
+static const symbol s_6[] = { 'o' };
+static const symbol s_7[] = { 'n', 'i', 's' };
+static const symbol s_8[] = { 'i', 'g' };
+static const symbol s_9[] = { 'e', 'r' };
+static const symbol s_10[] = { 'e', 'n' };
 
-static int r_prelude(struct SN_env * z) {
-    {   int c_test = z->c; /* test, line 30 */
-        while(1) { /* repeat, line 30 */
-            int c1 = z->c;
-            {   int c2 = 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 = slice_from_s(z, 2, s_1); /* <-, line 32 */
+static int r_prelude(struct SN_env * z) { /* forwardmode */
+    {   int c_test1 = z->c; /* test, line 35 */
+        while(1) { /* repeat, line 35 */
+            int c2 = z->c;
+            {   int c3 = z->c; /* or, line 38 */
+                z->bra = z->c; /* [, line 37 */
+                if (z->c == z->l || z->p[z->c] != 0xDF) goto lab2; /* literal, line 37 */
+                z->c++;
+                z->ket = z->c; /* ], line 37 */
+                {   int ret = slice_from_s(z, 2, s_0); /* <-, line 37 */
                     if (ret < 0) return ret;
                 }
                 goto lab1;
             lab2:
-                z->c = c2;
+                z->c = c3;
                 if (z->c >= z->l) goto lab0;
-                z->c++; /* next, line 33 */
+                z->c++; /* next, line 38 */
             }
         lab1:
             continue;
         lab0:
-            z->c = c1;
+            z->c = c2;
             break;
         }
-        z->c = c_test;
+        z->c = c_test1;
     }
-    while(1) { /* repeat, line 36 */
-        int c3 = z->c;
-        while(1) { /* goto, line 36 */
-            int c4 = z->c;
-            if (in_grouping(z, g_v, 97, 252, 0)) goto lab4;
-            z->bra = z->c; /* [, line 37 */
-            {   int c5 = 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, 0)) goto lab6;
-                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 37 */
+    while(1) { /* repeat, line 41 */
+        int c4 = z->c;
+        while(1) { /* goto, line 41 */
+            int c5 = z->c;
+            if (in_grouping(z, g_v, 97, 252, 0)) goto lab4; /* grouping v, line 42 */
+            z->bra = z->c; /* [, line 42 */
+            {   int c6 = z->c; /* or, line 42 */
+                if (z->c == z->l || z->p[z->c] != 'u') goto lab6; /* literal, line 42 */
+                z->c++;
+                z->ket = z->c; /* ], line 42 */
+                if (in_grouping(z, g_v, 97, 252, 0)) goto lab6; /* grouping v, line 42 */
+                {   int ret = slice_from_s(z, 1, s_1); /* <-, line 42 */
                     if (ret < 0) return ret;
                 }
                 goto lab5;
             lab6:
-                z->c = c5;
-                if (!(eq_s(z, 1, s_4))) goto lab4;
-                z->ket = z->c; /* ], line 38 */
-                if (in_grouping(z, g_v, 97, 252, 0)) goto lab4;
-                {   int ret = slice_from_s(z, 1, s_5); /* <-, line 38 */
+                z->c = c6;
+                if (z->c == z->l || z->p[z->c] != 'y') goto lab4; /* literal, line 43 */
+                z->c++;
+                z->ket = z->c; /* ], line 43 */
+                if (in_grouping(z, g_v, 97, 252, 0)) goto lab4; /* grouping v, line 43 */
+                {   int ret = slice_from_s(z, 1, s_2); /* <-, line 43 */
                     if (ret < 0) return ret;
                 }
             }
         lab5:
-            z->c = c4;
+            z->c = c5;
             break;
         lab4:
-            z->c = c4;
+            z->c = c5;
             if (z->c >= z->l) goto lab3;
-            z->c++; /* goto, line 36 */
+            z->c++; /* goto, line 41 */
         }
         continue;
     lab3:
-        z->c = c3;
+        z->c = c4;
         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 ret = z->c + 3;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 49 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 50 */
+    {   int c_test1 = z->c; /* test, line 52 */
+        {   int ret = z->c + 3; /* hop, line 52 */
             if (0 > ret || ret > z->l) return 0;
-            z->c = ret; /* hop, line 47 */
+            z->c = ret;
         }
-        z->I[2] = z->c; /* setmark x, line 47 */
-        z->c = c_test;
+        z->I[2] = z->c; /* setmark x, line 52 */
+        z->c = c_test1;
     }
-    {    /* gopast */ /* grouping v, line 49 */
+    {    /* gopast */ /* grouping v, line 54 */
         int ret = out_grouping(z, g_v, 97, 252, 1);
         if (ret < 0) return 0;
         z->c += ret;
     }
-    {    /* gopast */ /* non v, line 49 */
+    {    /* gopast */ /* non v, line 54 */
         int ret = in_grouping(z, g_v, 97, 252, 1);
         if (ret < 0) return 0;
         z->c += ret;
     }
-    z->I[0] = z->c; /* setmark p1, line 49 */
-     /* try, line 50 */
-    if (!(z->I[0] < z->I[2])) goto lab0;
-    z->I[0] = z->I[2];
+    z->I[0] = z->c; /* setmark p1, line 54 */
+    /* try, line 55 */
+    if (!(z->I[0] < z->I[2])) goto lab0; /* $(<integer expression> < <integer expression>), line 55 */
+    z->I[0] = z->I[2]; /* $p1 = <integer expression>, line 55 */
 lab0:
-    {    /* gopast */ /* grouping v, line 51 */
+    {    /* gopast */ /* grouping v, line 56 */
         int ret = out_grouping(z, g_v, 97, 252, 1);
         if (ret < 0) return 0;
         z->c += ret;
     }
-    {    /* gopast */ /* non v, line 51 */
+    {    /* gopast */ /* non v, line 56 */
         int ret = in_grouping(z, g_v, 97, 252, 1);
         if (ret < 0) return 0;
         z->c += ret;
     }
-    z->I[1] = z->c; /* setmark p2, line 51 */
+    z->I[1] = z->c; /* setmark p2, line 56 */
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
-    while(1) { /* repeat, line 55 */
+    while(1) { /* repeat, line 60 */
         int c1 = z->c;
-        z->bra = z->c; /* [, line 57 */
-        among_var = find_among(z, a_0, 6); /* substring, line 57 */
+        z->bra = z->c; /* [, line 62 */
+        among_var = find_among(z, a_0, 6); /* substring, line 62 */
         if (!(among_var)) goto lab0;
-        z->ket = z->c; /* ], line 57 */
-        switch(among_var) {
-            case 0: goto lab0;
+        z->ket = z->c; /* ], line 62 */
+        switch (among_var) { /* among, line 62 */
             case 1:
-                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 58 */
+                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 63 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 59 */
+                {   int ret = slice_from_s(z, 1, s_4); /* <-, line 64 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 3:
-                {   int ret = slice_from_s(z, 1, s_8); /* <-, line 60 */
+                {   int ret = slice_from_s(z, 1, s_5); /* <-, line 65 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 4:
-                {   int ret = slice_from_s(z, 1, s_9); /* <-, line 61 */
+                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 66 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 5:
-                {   int 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 */
+                z->c++; /* next, line 68 */
                 break;
         }
         continue;
@@ -281,38 +273,54 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 75 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 76 */
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int m1 = z->l - z->c; (void)m1; /* do, line 74 */
-        z->ket = z->c; /* [, line 75 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((811040 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab0;
-        among_var = find_among_b(z, a_1, 7); /* substring, line 75 */
+    {   int m1 = z->l - z->c; (void)m1; /* do, line 79 */
+        z->ket = z->c; /* [, line 80 */
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((811040 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab0; /* substring, line 80 */
+        among_var = find_among_b(z, a_1, 7);
         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 */
+        z->bra = z->c; /* ], line 80 */
+        {   int ret = r_R1(z); /* call R1, line 80 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 80 */
             case 1:
-                {   int ret = slice_del(z); /* delete, line 77 */
+                {   int ret = slice_del(z); /* delete, line 82 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                if (in_grouping_b(z, g_s_ending, 98, 116, 0)) goto lab0;
-                {   int ret = slice_del(z); /* delete, line 80 */
+                {   int ret = slice_del(z); /* delete, line 85 */
+                    if (ret < 0) return ret;
+                }
+                {   int m2 = z->l - z->c; (void)m2; /* try, line 86 */
+                    z->ket = z->c; /* [, line 86 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 's') { z->c = z->l - m2; goto lab1; } /* literal, line 86 */
+                    z->c--;
+                    z->bra = z->c; /* ], line 86 */
+                    if (!(eq_s_b(z, 3, s_7))) { z->c = z->l - m2; goto lab1; } /* literal, line 86 */
+                    {   int ret = slice_del(z); /* delete, line 86 */
+                        if (ret < 0) return ret;
+                    }
+                lab1:
+                    ;
+                }
+                break;
+            case 3:
+                if (in_grouping_b(z, g_s_ending, 98, 116, 0)) goto lab0; /* grouping s_ending, line 89 */
+                {   int ret = slice_del(z); /* delete, line 89 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -320,179 +328,171 @@ static int r_standard_suffix(struct SN_env * z) {
     lab0:
         z->c = z->l - m1;
     }
-    {   int m2 = z->l - z->c; (void)m2; /* do, line 84 */
-        z->ket = z->c; /* [, line 85 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1327104 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab1;
-        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 = slice_del(z); /* delete, line 87 */
-                    if (ret < 0) return ret;
-                }
-                break;
-            case 2:
-                if (in_grouping_b(z, g_st_ending, 98, 116, 0)) goto lab1;
-                {   int ret = z->c - 3;
-                    if (z->lb > ret || ret > z->l) goto lab1;
-                    z->c = ret; /* hop, line 90 */
-                }
-                {   int ret = slice_del(z); /* delete, line 90 */
-                    if (ret < 0) return ret;
-                }
-                break;
-        }
-    lab1:
-        z->c = z->l - m2;
-    }
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 94 */
-        z->ket = z->c; /* [, line 95 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1051024 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab2;
-        among_var = find_among_b(z, a_4, 8); /* substring, line 95 */
+    {   int m3 = z->l - z->c; (void)m3; /* do, line 93 */
+        z->ket = z->c; /* [, line 94 */
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1327104 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab2; /* substring, line 94 */
+        among_var = find_among_b(z, a_2, 4);
         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 */
+        z->bra = z->c; /* ], line 94 */
+        {   int ret = r_R1(z); /* call R1, line 94 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
-        switch(among_var) {
-            case 0: goto lab2;
+        switch (among_var) { /* among, line 94 */
             case 1:
-                {   int ret = slice_del(z); /* delete, line 97 */
+                {   int ret = slice_del(z); /* delete, line 96 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 98 */
-                    z->ket = z->c; /* [, line 98 */
-                    if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m_keep; goto lab3; }
-                    z->bra = z->c; /* ], line 98 */
-                    {   int m4 = z->l - z->c; (void)m4; /* not, line 98 */
-                        if (!(eq_s_b(z, 1, s_12))) goto lab4;
-                        { z->c = z->l - m_keep; goto lab3; }
-                    lab4:
-                        z->c = z->l - m4;
-                    }
-                    {   int ret = r_R2(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 98 */
-                        if (ret < 0) return ret;
-                    }
-                    {   int ret = slice_del(z); /* delete, line 98 */
-                        if (ret < 0) return ret;
-                    }
-                lab3:
-                    ;
-                }
                 break;
             case 2:
-                {   int m5 = z->l - z->c; (void)m5; /* not, line 101 */
-                    if (!(eq_s_b(z, 1, s_13))) goto lab5;
-                    goto lab2;
-                lab5:
-                    z->c = z->l - m5;
+                if (in_grouping_b(z, g_st_ending, 98, 116, 0)) goto lab2; /* grouping st_ending, line 99 */
+                {   int ret = z->c - 3; /* hop, line 99 */
+                    if (z->lb > ret || ret > z->l) goto lab2;
+                    z->c = ret;
                 }
-                {   int ret = slice_del(z); /* delete, line 101 */
+                {   int ret = slice_del(z); /* delete, line 99 */
                     if (ret < 0) return ret;
                 }
                 break;
-            case 3:
-                {   int ret = slice_del(z); /* delete, line 104 */
+        }
+    lab2:
+        z->c = z->l - m3;
+    }
+    {   int m4 = z->l - z->c; (void)m4; /* do, line 103 */
+        z->ket = z->c; /* [, line 104 */
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1051024 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab3; /* substring, line 104 */
+        among_var = find_among_b(z, a_4, 8);
+        if (!(among_var)) goto lab3;
+        z->bra = z->c; /* ], line 104 */
+        {   int ret = r_R2(z); /* call R2, line 104 */
+            if (ret == 0) goto lab3;
+            if (ret < 0) return ret;
+        }
+        switch (among_var) { /* among, line 104 */
+            case 1:
+                {   int ret = slice_del(z); /* delete, line 106 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 105 */
-                    z->ket = z->c; /* [, line 106 */
-                    {   int m6 = z->l - z->c; (void)m6; /* or, line 106 */
-                        if (!(eq_s_b(z, 2, s_14))) goto lab8;
-                        goto lab7;
-                    lab8:
+                {   int m5 = z->l - z->c; (void)m5; /* try, line 107 */
+                    z->ket = z->c; /* [, line 107 */
+                    if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m5; goto lab4; } /* literal, line 107 */
+                    z->bra = z->c; /* ], line 107 */
+                    {   int m6 = z->l - z->c; (void)m6; /* not, line 107 */
+                        if (z->c <= z->lb || z->p[z->c - 1] != 'e') goto lab5; /* literal, line 107 */
+                        z->c--;
+                        { z->c = z->l - m5; goto lab4; }
+                    lab5:
                         z->c = z->l - m6;
-                        if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m_keep; goto lab6; }
                     }
-                lab7:
-                    z->bra = z->c; /* ], line 106 */
-                    {   int ret = r_R1(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab6; } /* call R1, line 106 */
+                    {   int ret = r_R2(z); /* call R2, line 107 */
+                        if (ret == 0) { z->c = z->l - m5; goto lab4; }
                         if (ret < 0) return ret;
                     }
-                    {   int ret = slice_del(z); /* delete, line 106 */
+                    {   int ret = slice_del(z); /* delete, line 107 */
                         if (ret < 0) return ret;
                     }
+                lab4:
+                    ;
+                }
+                break;
+            case 2:
+                {   int m7 = z->l - z->c; (void)m7; /* not, line 110 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'e') goto lab6; /* literal, line 110 */
+                    z->c--;
+                    goto lab3;
                 lab6:
-                    ;
+                    z->c = z->l - m7;
                 }
-                break;
-            case 4:
                 {   int ret = slice_del(z); /* delete, line 110 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 111 */
-                    z->ket = z->c; /* [, line 112 */
-                    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 103 && z->p[z->c - 1] != 104)) { z->c = z->l - m_keep; goto lab9; }
-                    among_var = find_among_b(z, a_3, 2); /* substring, line 112 */
-                    if (!(among_var)) { z->c = z->l - m_keep; goto lab9; }
-                    z->bra = z->c; /* ], line 112 */
-                    {   int ret = r_R2(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab9; } /* call R2, line 112 */
+                break;
+            case 3:
+                {   int ret = slice_del(z); /* delete, line 113 */
+                    if (ret < 0) return ret;
+                }
+                {   int m8 = z->l - z->c; (void)m8; /* try, line 114 */
+                    z->ket = z->c; /* [, line 115 */
+                    {   int m9 = z->l - z->c; (void)m9; /* or, line 115 */
+                        if (!(eq_s_b(z, 2, s_9))) goto lab9; /* literal, line 115 */
+                        goto lab8;
+                    lab9:
+                        z->c = z->l - m9;
+                        if (!(eq_s_b(z, 2, s_10))) { z->c = z->l - m8; goto lab7; } /* literal, line 115 */
+                    }
+                lab8:
+                    z->bra = z->c; /* ], line 115 */
+                    {   int ret = r_R1(z); /* call R1, line 115 */
+                        if (ret == 0) { z->c = z->l - m8; goto lab7; }
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret = slice_del(z); /* delete, line 115 */
                         if (ret < 0) return ret;
                     }
-                    switch(among_var) {
-                        case 0: { z->c = z->l - m_keep; goto lab9; }
-                        case 1:
-                            {   int ret = slice_del(z); /* delete, line 114 */
-                                if (ret < 0) return ret;
-                            }
-                            break;
+                lab7:
+                    ;
+                }
+                break;
+            case 4:
+                {   int ret = slice_del(z); /* delete, line 119 */
+                    if (ret < 0) return ret;
+                }
+                {   int m10 = z->l - z->c; (void)m10; /* try, line 120 */
+                    z->ket = z->c; /* [, line 121 */
+                    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 103 && z->p[z->c - 1] != 104)) { z->c = z->l - m10; goto lab10; } /* substring, line 121 */
+                    if (!(find_among_b(z, a_3, 2))) { z->c = z->l - m10; goto lab10; }
+                    z->bra = z->c; /* ], line 121 */
+                    {   int ret = r_R2(z); /* call R2, line 121 */
+                        if (ret == 0) { z->c = z->l - m10; goto lab10; }
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret = slice_del(z); /* delete, line 123 */
+                        if (ret < 0) return ret;
                     }
-                lab9:
+                lab10:
                     ;
                 }
                 break;
         }
-    lab2:
-        z->c = z->l - m3;
+    lab3:
+        z->c = z->l - m4;
     }
     return 1;
 }
 
-extern int german_ISO_8859_1_stem(struct SN_env * z) {
-    {   int c1 = z->c; /* do, line 125 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 125 */
+extern int german_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
+    {   int c1 = z->c; /* do, line 134 */
+        {   int ret = r_prelude(z); /* call prelude, line 134 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    {   int c2 = z->c; /* do, line 126 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab1; /* call mark_regions, line 126 */
+    {   int c2 = z->c; /* do, line 135 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 135 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = c2;
     }
-    z->lb = z->c; z->c = z->l; /* backwards, line 127 */
+    z->lb = z->c; z->c = z->l; /* backwards, line 136 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* 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 - m3;
+    /* do, line 137 */
+    {   int ret = r_standard_suffix(z); /* call standard_suffix, line 137 */
+        if (ret == 0) goto lab2;
+        if (ret < 0) return ret;
     }
+lab2:
     z->c = z->lb;
-    {   int c4 = z->c; /* do, line 129 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab3; /* call postlude, line 129 */
+    {   int c3 = z->c; /* do, line 138 */
+        {   int ret = r_postlude(z); /* call postlude, line 138 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
-        z->c = c4;
+        z->c = c3;
     }
     return 1;
 }
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_hungarian.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_hungarian.c
deleted file mode 100644
index ff4b23e060..0000000000
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_hungarian.c
+++ /dev/null
@@ -1,1230 +0,0 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
-
-#include "header.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern int hungarian_ISO_8859_1_stem(struct SN_env * z);
-#ifdef __cplusplus
-}
-#endif
-static int r_double(struct SN_env * z);
-static int r_undouble(struct SN_env * z);
-static int r_factive(struct SN_env * z);
-static int r_instrum(struct SN_env * z);
-static int r_plur_owner(struct SN_env * z);
-static int r_sing_owner(struct SN_env * z);
-static int r_owned(struct SN_env * z);
-static int r_plural(struct SN_env * z);
-static int r_case_other(struct SN_env * z);
-static int r_case_special(struct SN_env * z);
-static int r_case(struct SN_env * z);
-static int r_v_ending(struct SN_env * z);
-static int r_R1(struct SN_env * z);
-static int r_mark_regions(struct SN_env * z);
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-extern struct SN_env * hungarian_ISO_8859_1_create_env(void);
-extern void hungarian_ISO_8859_1_close_env(struct SN_env * z);
-
-
-#ifdef __cplusplus
-}
-#endif
-static const symbol s_0_0[2] = { 'c', 's' };
-static const symbol s_0_1[3] = { 'd', 'z', 's' };
-static const symbol s_0_2[2] = { 'g', 'y' };
-static const symbol s_0_3[2] = { 'l', 'y' };
-static const symbol s_0_4[2] = { 'n', 'y' };
-static const symbol s_0_5[2] = { 's', 'z' };
-static const symbol s_0_6[2] = { 't', 'y' };
-static const symbol s_0_7[2] = { 'z', 's' };
-
-static const struct among a_0[8] =
-{
-/*  0 */ { 2, s_0_0, -1, -1, 0},
-/*  1 */ { 3, s_0_1, -1, -1, 0},
-/*  2 */ { 2, s_0_2, -1, -1, 0},
-/*  3 */ { 2, s_0_3, -1, -1, 0},
-/*  4 */ { 2, s_0_4, -1, -1, 0},
-/*  5 */ { 2, s_0_5, -1, -1, 0},
-/*  6 */ { 2, s_0_6, -1, -1, 0},
-/*  7 */ { 2, s_0_7, -1, -1, 0}
-};
-
-static const symbol s_1_0[1] = { 0xE1 };
-static const symbol s_1_1[1] = { 0xE9 };
-
-static const struct among a_1[2] =
-{
-/*  0 */ { 1, s_1_0, -1, 1, 0},
-/*  1 */ { 1, s_1_1, -1, 2, 0}
-};
-
-static const symbol s_2_0[2] = { 'b', 'b' };
-static const symbol s_2_1[2] = { 'c', 'c' };
-static const symbol s_2_2[2] = { 'd', 'd' };
-static const symbol s_2_3[2] = { 'f', 'f' };
-static const symbol s_2_4[2] = { 'g', 'g' };
-static const symbol s_2_5[2] = { 'j', 'j' };
-static const symbol s_2_6[2] = { 'k', 'k' };
-static const symbol s_2_7[2] = { 'l', 'l' };
-static const symbol s_2_8[2] = { 'm', 'm' };
-static const symbol s_2_9[2] = { 'n', 'n' };
-static const symbol s_2_10[2] = { 'p', 'p' };
-static const symbol s_2_11[2] = { 'r', 'r' };
-static const symbol s_2_12[3] = { 'c', 'c', 's' };
-static const symbol s_2_13[2] = { 's', 's' };
-static const symbol s_2_14[3] = { 'z', 'z', 's' };
-static const symbol s_2_15[2] = { 't', 't' };
-static const symbol s_2_16[2] = { 'v', 'v' };
-static const symbol s_2_17[3] = { 'g', 'g', 'y' };
-static const symbol s_2_18[3] = { 'l', 'l', 'y' };
-static const symbol s_2_19[3] = { 'n', 'n', 'y' };
-static const symbol s_2_20[3] = { 't', 't', 'y' };
-static const symbol s_2_21[3] = { 's', 's', 'z' };
-static const symbol s_2_22[2] = { 'z', 'z' };
-
-static const struct among a_2[23] =
-{
-/*  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},
-/*  4 */ { 2, s_2_4, -1, -1, 0},
-/*  5 */ { 2, s_2_5, -1, -1, 0},
-/*  6 */ { 2, s_2_6, -1, -1, 0},
-/*  7 */ { 2, s_2_7, -1, -1, 0},
-/*  8 */ { 2, s_2_8, -1, -1, 0},
-/*  9 */ { 2, s_2_9, -1, -1, 0},
-/* 10 */ { 2, s_2_10, -1, -1, 0},
-/* 11 */ { 2, s_2_11, -1, -1, 0},
-/* 12 */ { 3, s_2_12, -1, -1, 0},
-/* 13 */ { 2, s_2_13, -1, -1, 0},
-/* 14 */ { 3, s_2_14, -1, -1, 0},
-/* 15 */ { 2, s_2_15, -1, -1, 0},
-/* 16 */ { 2, s_2_16, -1, -1, 0},
-/* 17 */ { 3, s_2_17, -1, -1, 0},
-/* 18 */ { 3, s_2_18, -1, -1, 0},
-/* 19 */ { 3, s_2_19, -1, -1, 0},
-/* 20 */ { 3, s_2_20, -1, -1, 0},
-/* 21 */ { 3, s_2_21, -1, -1, 0},
-/* 22 */ { 2, s_2_22, -1, -1, 0}
-};
-
-static const symbol s_3_0[2] = { 'a', 'l' };
-static const symbol s_3_1[2] = { 'e', 'l' };
-
-static const struct among a_3[2] =
-{
-/*  0 */ { 2, s_3_0, -1, 1, 0},
-/*  1 */ { 2, s_3_1, -1, 2, 0}
-};
-
-static const symbol s_4_0[2] = { 'b', 'a' };
-static const symbol s_4_1[2] = { 'r', 'a' };
-static const symbol s_4_2[2] = { 'b', 'e' };
-static const symbol s_4_3[2] = { 'r', 'e' };
-static const symbol s_4_4[2] = { 'i', 'g' };
-static const symbol s_4_5[3] = { 'n', 'a', 'k' };
-static const symbol s_4_6[3] = { 'n', 'e', 'k' };
-static const symbol s_4_7[3] = { 'v', 'a', 'l' };
-static const symbol s_4_8[3] = { 'v', 'e', 'l' };
-static const symbol s_4_9[2] = { 'u', 'l' };
-static const symbol s_4_10[3] = { 'n', 0xE1, 'l' };
-static const symbol s_4_11[3] = { 'n', 0xE9, 'l' };
-static const symbol s_4_12[3] = { 'b', 0xF3, 'l' };
-static const symbol s_4_13[3] = { 'r', 0xF3, 'l' };
-static const symbol s_4_14[3] = { 't', 0xF3, 'l' };
-static const symbol s_4_15[3] = { 'b', 0xF5, 'l' };
-static const symbol s_4_16[3] = { 'r', 0xF5, 'l' };
-static const symbol s_4_17[3] = { 't', 0xF5, 'l' };
-static const symbol s_4_18[2] = { 0xFC, 'l' };
-static const symbol s_4_19[1] = { 'n' };
-static const symbol s_4_20[2] = { 'a', 'n' };
-static const symbol s_4_21[3] = { 'b', 'a', 'n' };
-static const symbol s_4_22[2] = { 'e', 'n' };
-static const symbol s_4_23[3] = { 'b', 'e', 'n' };
-static const symbol s_4_24[6] = { 'k', 0xE9, 'p', 'p', 'e', 'n' };
-static const symbol s_4_25[2] = { 'o', 'n' };
-static const symbol s_4_26[2] = { 0xF6, 'n' };
-static const symbol s_4_27[4] = { 'k', 0xE9, 'p', 'p' };
-static const symbol s_4_28[3] = { 'k', 'o', 'r' };
-static const symbol s_4_29[1] = { 't' };
-static const symbol s_4_30[2] = { 'a', 't' };
-static const symbol s_4_31[2] = { 'e', 't' };
-static const symbol s_4_32[4] = { 'k', 0xE9, 'n', 't' };
-static const symbol s_4_33[6] = { 'a', 'n', 'k', 0xE9, 'n', 't' };
-static const symbol s_4_34[6] = { 'e', 'n', 'k', 0xE9, 'n', 't' };
-static const symbol s_4_35[6] = { 'o', 'n', 'k', 0xE9, 'n', 't' };
-static const symbol s_4_36[2] = { 'o', 't' };
-static const symbol s_4_37[3] = { 0xE9, 'r', 't' };
-static const symbol s_4_38[2] = { 0xF6, 't' };
-static const symbol s_4_39[3] = { 'h', 'e', 'z' };
-static const symbol s_4_40[3] = { 'h', 'o', 'z' };
-static const symbol s_4_41[3] = { 'h', 0xF6, 'z' };
-static const symbol s_4_42[2] = { 'v', 0xE1 };
-static const symbol s_4_43[2] = { 'v', 0xE9 };
-
-static const struct among a_4[44] =
-{
-/*  0 */ { 2, s_4_0, -1, -1, 0},
-/*  1 */ { 2, s_4_1, -1, -1, 0},
-/*  2 */ { 2, s_4_2, -1, -1, 0},
-/*  3 */ { 2, s_4_3, -1, -1, 0},
-/*  4 */ { 2, s_4_4, -1, -1, 0},
-/*  5 */ { 3, s_4_5, -1, -1, 0},
-/*  6 */ { 3, s_4_6, -1, -1, 0},
-/*  7 */ { 3, s_4_7, -1, -1, 0},
-/*  8 */ { 3, s_4_8, -1, -1, 0},
-/*  9 */ { 2, s_4_9, -1, -1, 0},
-/* 10 */ { 3, s_4_10, -1, -1, 0},
-/* 11 */ { 3, s_4_11, -1, -1, 0},
-/* 12 */ { 3, s_4_12, -1, -1, 0},
-/* 13 */ { 3, s_4_13, -1, -1, 0},
-/* 14 */ { 3, s_4_14, -1, -1, 0},
-/* 15 */ { 3, s_4_15, -1, -1, 0},
-/* 16 */ { 3, s_4_16, -1, -1, 0},
-/* 17 */ { 3, s_4_17, -1, -1, 0},
-/* 18 */ { 2, s_4_18, -1, -1, 0},
-/* 19 */ { 1, s_4_19, -1, -1, 0},
-/* 20 */ { 2, s_4_20, 19, -1, 0},
-/* 21 */ { 3, s_4_21, 20, -1, 0},
-/* 22 */ { 2, s_4_22, 19, -1, 0},
-/* 23 */ { 3, s_4_23, 22, -1, 0},
-/* 24 */ { 6, s_4_24, 22, -1, 0},
-/* 25 */ { 2, s_4_25, 19, -1, 0},
-/* 26 */ { 2, s_4_26, 19, -1, 0},
-/* 27 */ { 4, s_4_27, -1, -1, 0},
-/* 28 */ { 3, s_4_28, -1, -1, 0},
-/* 29 */ { 1, s_4_29, -1, -1, 0},
-/* 30 */ { 2, s_4_30, 29, -1, 0},
-/* 31 */ { 2, s_4_31, 29, -1, 0},
-/* 32 */ { 4, s_4_32, 29, -1, 0},
-/* 33 */ { 6, s_4_33, 32, -1, 0},
-/* 34 */ { 6, s_4_34, 32, -1, 0},
-/* 35 */ { 6, s_4_35, 32, -1, 0},
-/* 36 */ { 2, s_4_36, 29, -1, 0},
-/* 37 */ { 3, s_4_37, 29, -1, 0},
-/* 38 */ { 2, s_4_38, 29, -1, 0},
-/* 39 */ { 3, s_4_39, -1, -1, 0},
-/* 40 */ { 3, s_4_40, -1, -1, 0},
-/* 41 */ { 3, s_4_41, -1, -1, 0},
-/* 42 */ { 2, s_4_42, -1, -1, 0},
-/* 43 */ { 2, s_4_43, -1, -1, 0}
-};
-
-static const symbol s_5_0[2] = { 0xE1, 'n' };
-static const symbol s_5_1[2] = { 0xE9, 'n' };
-static const symbol s_5_2[6] = { 0xE1, 'n', 'k', 0xE9, 'n', 't' };
-
-static const struct among a_5[3] =
-{
-/*  0 */ { 2, s_5_0, -1, 2, 0},
-/*  1 */ { 2, s_5_1, -1, 1, 0},
-/*  2 */ { 6, s_5_2, -1, 3, 0}
-};
-
-static const symbol s_6_0[4] = { 's', 't', 'u', 'l' };
-static const symbol s_6_1[5] = { 'a', 's', 't', 'u', 'l' };
-static const symbol s_6_2[5] = { 0xE1, 's', 't', 'u', 'l' };
-static const symbol s_6_3[4] = { 's', 't', 0xFC, 'l' };
-static const symbol s_6_4[5] = { 'e', 's', 't', 0xFC, 'l' };
-static const symbol s_6_5[5] = { 0xE9, 's', 't', 0xFC, 'l' };
-
-static const struct among a_6[6] =
-{
-/*  0 */ { 4, s_6_0, -1, 2, 0},
-/*  1 */ { 5, s_6_1, 0, 1, 0},
-/*  2 */ { 5, s_6_2, 0, 3, 0},
-/*  3 */ { 4, s_6_3, -1, 2, 0},
-/*  4 */ { 5, s_6_4, 3, 1, 0},
-/*  5 */ { 5, s_6_5, 3, 4, 0}
-};
-
-static const symbol s_7_0[1] = { 0xE1 };
-static const symbol s_7_1[1] = { 0xE9 };
-
-static const struct among a_7[2] =
-{
-/*  0 */ { 1, s_7_0, -1, 1, 0},
-/*  1 */ { 1, s_7_1, -1, 2, 0}
-};
-
-static const symbol s_8_0[1] = { 'k' };
-static const symbol s_8_1[2] = { 'a', 'k' };
-static const symbol s_8_2[2] = { 'e', 'k' };
-static const symbol s_8_3[2] = { 'o', 'k' };
-static const symbol s_8_4[2] = { 0xE1, 'k' };
-static const symbol s_8_5[2] = { 0xE9, 'k' };
-static const symbol s_8_6[2] = { 0xF6, 'k' };
-
-static const struct among a_8[7] =
-{
-/*  0 */ { 1, s_8_0, -1, 7, 0},
-/*  1 */ { 2, s_8_1, 0, 4, 0},
-/*  2 */ { 2, s_8_2, 0, 6, 0},
-/*  3 */ { 2, s_8_3, 0, 5, 0},
-/*  4 */ { 2, s_8_4, 0, 1, 0},
-/*  5 */ { 2, s_8_5, 0, 2, 0},
-/*  6 */ { 2, s_8_6, 0, 3, 0}
-};
-
-static const symbol s_9_0[2] = { 0xE9, 'i' };
-static const symbol s_9_1[3] = { 0xE1, 0xE9, 'i' };
-static const symbol s_9_2[3] = { 0xE9, 0xE9, 'i' };
-static const symbol s_9_3[1] = { 0xE9 };
-static const symbol s_9_4[2] = { 'k', 0xE9 };
-static const symbol s_9_5[3] = { 'a', 'k', 0xE9 };
-static const symbol s_9_6[3] = { 'e', 'k', 0xE9 };
-static const symbol s_9_7[3] = { 'o', 'k', 0xE9 };
-static const symbol s_9_8[3] = { 0xE1, 'k', 0xE9 };
-static const symbol s_9_9[3] = { 0xE9, 'k', 0xE9 };
-static const symbol s_9_10[3] = { 0xF6, 'k', 0xE9 };
-static const symbol s_9_11[2] = { 0xE9, 0xE9 };
-
-static const struct among a_9[12] =
-{
-/*  0 */ { 2, s_9_0, -1, 7, 0},
-/*  1 */ { 3, s_9_1, 0, 6, 0},
-/*  2 */ { 3, s_9_2, 0, 5, 0},
-/*  3 */ { 1, s_9_3, -1, 9, 0},
-/*  4 */ { 2, s_9_4, 3, 4, 0},
-/*  5 */ { 3, s_9_5, 4, 1, 0},
-/*  6 */ { 3, s_9_6, 4, 1, 0},
-/*  7 */ { 3, s_9_7, 4, 1, 0},
-/*  8 */ { 3, s_9_8, 4, 3, 0},
-/*  9 */ { 3, s_9_9, 4, 2, 0},
-/* 10 */ { 3, s_9_10, 4, 1, 0},
-/* 11 */ { 2, s_9_11, 3, 8, 0}
-};
-
-static const symbol s_10_0[1] = { 'a' };
-static const symbol s_10_1[2] = { 'j', 'a' };
-static const symbol s_10_2[1] = { 'd' };
-static const symbol s_10_3[2] = { 'a', 'd' };
-static const symbol s_10_4[2] = { 'e', 'd' };
-static const symbol s_10_5[2] = { 'o', 'd' };
-static const symbol s_10_6[2] = { 0xE1, 'd' };
-static const symbol s_10_7[2] = { 0xE9, 'd' };
-static const symbol s_10_8[2] = { 0xF6, 'd' };
-static const symbol s_10_9[1] = { 'e' };
-static const symbol s_10_10[2] = { 'j', 'e' };
-static const symbol s_10_11[2] = { 'n', 'k' };
-static const symbol s_10_12[3] = { 'u', 'n', 'k' };
-static const symbol s_10_13[3] = { 0xE1, 'n', 'k' };
-static const symbol s_10_14[3] = { 0xE9, 'n', 'k' };
-static const symbol s_10_15[3] = { 0xFC, 'n', 'k' };
-static const symbol s_10_16[2] = { 'u', 'k' };
-static const symbol s_10_17[3] = { 'j', 'u', 'k' };
-static const symbol s_10_18[4] = { 0xE1, 'j', 'u', 'k' };
-static const symbol s_10_19[2] = { 0xFC, 'k' };
-static const symbol s_10_20[3] = { 'j', 0xFC, 'k' };
-static const symbol s_10_21[4] = { 0xE9, 'j', 0xFC, 'k' };
-static const symbol s_10_22[1] = { 'm' };
-static const symbol s_10_23[2] = { 'a', 'm' };
-static const symbol s_10_24[2] = { 'e', 'm' };
-static const symbol s_10_25[2] = { 'o', 'm' };
-static const symbol s_10_26[2] = { 0xE1, 'm' };
-static const symbol s_10_27[2] = { 0xE9, 'm' };
-static const symbol s_10_28[1] = { 'o' };
-static const symbol s_10_29[1] = { 0xE1 };
-static const symbol s_10_30[1] = { 0xE9 };
-
-static const struct among a_10[31] =
-{
-/*  0 */ { 1, s_10_0, -1, 18, 0},
-/*  1 */ { 2, s_10_1, 0, 17, 0},
-/*  2 */ { 1, s_10_2, -1, 16, 0},
-/*  3 */ { 2, s_10_3, 2, 13, 0},
-/*  4 */ { 2, s_10_4, 2, 13, 0},
-/*  5 */ { 2, s_10_5, 2, 13, 0},
-/*  6 */ { 2, s_10_6, 2, 14, 0},
-/*  7 */ { 2, s_10_7, 2, 15, 0},
-/*  8 */ { 2, s_10_8, 2, 13, 0},
-/*  9 */ { 1, s_10_9, -1, 18, 0},
-/* 10 */ { 2, s_10_10, 9, 17, 0},
-/* 11 */ { 2, s_10_11, -1, 4, 0},
-/* 12 */ { 3, s_10_12, 11, 1, 0},
-/* 13 */ { 3, s_10_13, 11, 2, 0},
-/* 14 */ { 3, s_10_14, 11, 3, 0},
-/* 15 */ { 3, s_10_15, 11, 1, 0},
-/* 16 */ { 2, s_10_16, -1, 8, 0},
-/* 17 */ { 3, s_10_17, 16, 7, 0},
-/* 18 */ { 4, s_10_18, 17, 5, 0},
-/* 19 */ { 2, s_10_19, -1, 8, 0},
-/* 20 */ { 3, s_10_20, 19, 7, 0},
-/* 21 */ { 4, s_10_21, 20, 6, 0},
-/* 22 */ { 1, s_10_22, -1, 12, 0},
-/* 23 */ { 2, s_10_23, 22, 9, 0},
-/* 24 */ { 2, s_10_24, 22, 9, 0},
-/* 25 */ { 2, s_10_25, 22, 9, 0},
-/* 26 */ { 2, s_10_26, 22, 10, 0},
-/* 27 */ { 2, s_10_27, 22, 11, 0},
-/* 28 */ { 1, s_10_28, -1, 18, 0},
-/* 29 */ { 1, s_10_29, -1, 19, 0},
-/* 30 */ { 1, s_10_30, -1, 20, 0}
-};
-
-static const symbol s_11_0[2] = { 'i', 'd' };
-static const symbol s_11_1[3] = { 'a', 'i', 'd' };
-static const symbol s_11_2[4] = { 'j', 'a', 'i', 'd' };
-static const symbol s_11_3[3] = { 'e', 'i', 'd' };
-static const symbol s_11_4[4] = { 'j', 'e', 'i', 'd' };
-static const symbol s_11_5[3] = { 0xE1, 'i', 'd' };
-static const symbol s_11_6[3] = { 0xE9, 'i', 'd' };
-static const symbol s_11_7[1] = { 'i' };
-static const symbol s_11_8[2] = { 'a', 'i' };
-static const symbol s_11_9[3] = { 'j', 'a', 'i' };
-static const symbol s_11_10[2] = { 'e', 'i' };
-static const symbol s_11_11[3] = { 'j', 'e', 'i' };
-static const symbol s_11_12[2] = { 0xE1, 'i' };
-static const symbol s_11_13[2] = { 0xE9, 'i' };
-static const symbol s_11_14[4] = { 'i', 't', 'e', 'k' };
-static const symbol s_11_15[5] = { 'e', 'i', 't', 'e', 'k' };
-static const symbol s_11_16[6] = { 'j', 'e', 'i', 't', 'e', 'k' };
-static const symbol s_11_17[5] = { 0xE9, 'i', 't', 'e', 'k' };
-static const symbol s_11_18[2] = { 'i', 'k' };
-static const symbol s_11_19[3] = { 'a', 'i', 'k' };
-static const symbol s_11_20[4] = { 'j', 'a', 'i', 'k' };
-static const symbol s_11_21[3] = { 'e', 'i', 'k' };
-static const symbol s_11_22[4] = { 'j', 'e', 'i', 'k' };
-static const symbol s_11_23[3] = { 0xE1, 'i', 'k' };
-static const symbol s_11_24[3] = { 0xE9, 'i', 'k' };
-static const symbol s_11_25[3] = { 'i', 'n', 'k' };
-static const symbol s_11_26[4] = { 'a', 'i', 'n', 'k' };
-static const symbol s_11_27[5] = { 'j', 'a', 'i', 'n', 'k' };
-static const symbol s_11_28[4] = { 'e', 'i', 'n', 'k' };
-static const symbol s_11_29[5] = { 'j', 'e', 'i', 'n', 'k' };
-static const symbol s_11_30[4] = { 0xE1, 'i', 'n', 'k' };
-static const symbol s_11_31[4] = { 0xE9, 'i', 'n', 'k' };
-static const symbol s_11_32[5] = { 'a', 'i', 't', 'o', 'k' };
-static const symbol s_11_33[6] = { 'j', 'a', 'i', 't', 'o', 'k' };
-static const symbol s_11_34[5] = { 0xE1, 'i', 't', 'o', 'k' };
-static const symbol s_11_35[2] = { 'i', 'm' };
-static const symbol s_11_36[3] = { 'a', 'i', 'm' };
-static const symbol s_11_37[4] = { 'j', 'a', 'i', 'm' };
-static const symbol s_11_38[3] = { 'e', 'i', 'm' };
-static const symbol s_11_39[4] = { 'j', 'e', 'i', 'm' };
-static const symbol s_11_40[3] = { 0xE1, 'i', 'm' };
-static const symbol s_11_41[3] = { 0xE9, 'i', 'm' };
-
-static const struct among a_11[42] =
-{
-/*  0 */ { 2, s_11_0, -1, 10, 0},
-/*  1 */ { 3, s_11_1, 0, 9, 0},
-/*  2 */ { 4, s_11_2, 1, 6, 0},
-/*  3 */ { 3, s_11_3, 0, 9, 0},
-/*  4 */ { 4, s_11_4, 3, 6, 0},
-/*  5 */ { 3, s_11_5, 0, 7, 0},
-/*  6 */ { 3, s_11_6, 0, 8, 0},
-/*  7 */ { 1, s_11_7, -1, 15, 0},
-/*  8 */ { 2, s_11_8, 7, 14, 0},
-/*  9 */ { 3, s_11_9, 8, 11, 0},
-/* 10 */ { 2, s_11_10, 7, 14, 0},
-/* 11 */ { 3, s_11_11, 10, 11, 0},
-/* 12 */ { 2, s_11_12, 7, 12, 0},
-/* 13 */ { 2, s_11_13, 7, 13, 0},
-/* 14 */ { 4, s_11_14, -1, 24, 0},
-/* 15 */ { 5, s_11_15, 14, 21, 0},
-/* 16 */ { 6, s_11_16, 15, 20, 0},
-/* 17 */ { 5, s_11_17, 14, 23, 0},
-/* 18 */ { 2, s_11_18, -1, 29, 0},
-/* 19 */ { 3, s_11_19, 18, 26, 0},
-/* 20 */ { 4, s_11_20, 19, 25, 0},
-/* 21 */ { 3, s_11_21, 18, 26, 0},
-/* 22 */ { 4, s_11_22, 21, 25, 0},
-/* 23 */ { 3, s_11_23, 18, 27, 0},
-/* 24 */ { 3, s_11_24, 18, 28, 0},
-/* 25 */ { 3, s_11_25, -1, 20, 0},
-/* 26 */ { 4, s_11_26, 25, 17, 0},
-/* 27 */ { 5, s_11_27, 26, 16, 0},
-/* 28 */ { 4, s_11_28, 25, 17, 0},
-/* 29 */ { 5, s_11_29, 28, 16, 0},
-/* 30 */ { 4, s_11_30, 25, 18, 0},
-/* 31 */ { 4, s_11_31, 25, 19, 0},
-/* 32 */ { 5, s_11_32, -1, 21, 0},
-/* 33 */ { 6, s_11_33, 32, 20, 0},
-/* 34 */ { 5, s_11_34, -1, 22, 0},
-/* 35 */ { 2, s_11_35, -1, 5, 0},
-/* 36 */ { 3, s_11_36, 35, 4, 0},
-/* 37 */ { 4, s_11_37, 36, 1, 0},
-/* 38 */ { 3, s_11_38, 35, 4, 0},
-/* 39 */ { 4, s_11_39, 38, 1, 0},
-/* 40 */ { 3, s_11_40, 35, 2, 0},
-/* 41 */ { 3, s_11_41, 35, 3, 0}
-};
-
-static const unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 52, 14 };
-
-static const symbol s_0[] = { 'a' };
-static const symbol s_1[] = { 'e' };
-static const symbol s_2[] = { 'e' };
-static const symbol s_3[] = { 'a' };
-static const symbol s_4[] = { 'a' };
-static const symbol s_5[] = { 'a' };
-static const symbol s_6[] = { 'e' };
-static const symbol s_7[] = { 'a' };
-static const symbol s_8[] = { 'e' };
-static const symbol s_9[] = { 'e' };
-static const symbol s_10[] = { 'a' };
-static const symbol s_11[] = { 'e' };
-static const symbol s_12[] = { 'a' };
-static const symbol s_13[] = { 'e' };
-static const symbol s_14[] = { 'a' };
-static const symbol s_15[] = { 'e' };
-static const symbol s_16[] = { 'a' };
-static const symbol s_17[] = { 'e' };
-static const symbol s_18[] = { 'a' };
-static const symbol s_19[] = { 'e' };
-static const symbol s_20[] = { 'a' };
-static const symbol s_21[] = { 'e' };
-static const symbol s_22[] = { 'a' };
-static const symbol s_23[] = { 'e' };
-static const symbol s_24[] = { 'a' };
-static const symbol s_25[] = { 'e' };
-static const symbol s_26[] = { 'a' };
-static const symbol s_27[] = { 'e' };
-static const symbol s_28[] = { 'a' };
-static const symbol s_29[] = { 'e' };
-static const symbol s_30[] = { 'a' };
-static const symbol s_31[] = { 'e' };
-static const symbol s_32[] = { 'a' };
-static const symbol s_33[] = { 'e' };
-static const symbol s_34[] = { 'a' };
-static const symbol s_35[] = { 'e' };
-
-static int r_mark_regions(struct SN_env * z) {
-    z->I[0] = z->l;
-    {   int c1 = z->c; /* or, line 51 */
-        if (in_grouping(z, g_v, 97, 252, 0)) goto lab1;
-        if (in_grouping(z, g_v, 97, 252, 1) < 0) goto lab1; /* goto */ /* non v, line 48 */
-        {   int c2 = z->c; /* or, line 49 */
-            if (z->c + 1 >= z->l || z->p[z->c + 1] >> 5 != 3 || !((101187584 >> (z->p[z->c + 1] & 0x1f)) & 1)) goto lab3;
-            if (!(find_among(z, a_0, 8))) goto lab3; /* among, line 49 */
-            goto lab2;
-        lab3:
-            z->c = c2;
-            if (z->c >= z->l) goto lab1;
-            z->c++; /* next, line 49 */
-        }
-    lab2:
-        z->I[0] = z->c; /* setmark p1, line 50 */
-        goto lab0;
-    lab1:
-        z->c = c1;
-        if (out_grouping(z, g_v, 97, 252, 0)) return 0;
-        {    /* gopast */ /* grouping v, line 53 */
-            int ret = out_grouping(z, g_v, 97, 252, 1);
-            if (ret < 0) return 0;
-            z->c += ret;
-        }
-        z->I[0] = z->c; /* setmark p1, line 53 */
-    }
-lab0:
-    return 1;
-}
-
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
-    return 1;
-}
-
-static int r_v_ending(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 61 */
-    if (z->c <= z->lb || (z->p[z->c - 1] != 225 && z->p[z->c - 1] != 233)) return 0;
-    among_var = find_among_b(z, a_1, 2); /* substring, line 61 */
-    if (!(among_var)) return 0;
-    z->bra = z->c; /* ], line 61 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 61 */
-        if (ret < 0) return ret;
-    }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_from_s(z, 1, s_0); /* <-, line 62 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = slice_from_s(z, 1, s_1); /* <-, line 63 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
-    return 1;
-}
-
-static int r_double(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 68 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((106790108 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-        if (!(find_among_b(z, a_2, 23))) return 0; /* among, line 68 */
-        z->c = z->l - m_test;
-    }
-    return 1;
-}
-
-static int r_undouble(struct SN_env * z) {
-    if (z->c <= z->lb) return 0;
-    z->c--; /* next, line 73 */
-    z->ket = z->c; /* [, line 73 */
-    {   int ret = z->c - 1;
-        if (z->lb > ret || ret > z->l) return 0;
-        z->c = ret; /* hop, line 73 */
-    }
-    z->bra = z->c; /* ], line 73 */
-    {   int ret = slice_del(z); /* delete, line 73 */
-        if (ret < 0) return ret;
-    }
-    return 1;
-}
-
-static int r_instrum(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 77 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] != 108) return 0;
-    among_var = find_among_b(z, a_3, 2); /* substring, line 77 */
-    if (!(among_var)) return 0;
-    z->bra = z->c; /* ], line 77 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 77 */
-        if (ret < 0) return ret;
-    }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = r_double(z);
-                if (ret == 0) return 0; /* call double, line 78 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = r_double(z);
-                if (ret == 0) return 0; /* call double, line 79 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
-    {   int ret = slice_del(z); /* delete, line 81 */
-        if (ret < 0) return ret;
-    }
-    {   int ret = r_undouble(z);
-        if (ret == 0) return 0; /* call undouble, line 82 */
-        if (ret < 0) return ret;
-    }
-    return 1;
-}
-
-static int r_case(struct SN_env * z) {
-    z->ket = z->c; /* [, line 87 */
-    if (!(find_among_b(z, a_4, 44))) return 0; /* substring, line 87 */
-    z->bra = z->c; /* ], line 87 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 87 */
-        if (ret < 0) return ret;
-    }
-    {   int ret = slice_del(z); /* delete, line 111 */
-        if (ret < 0) return ret;
-    }
-    {   int ret = r_v_ending(z);
-        if (ret == 0) return 0; /* call v_ending, line 112 */
-        if (ret < 0) return ret;
-    }
-    return 1;
-}
-
-static int r_case_special(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 116 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 110 && z->p[z->c - 1] != 116)) return 0;
-    among_var = find_among_b(z, a_5, 3); /* substring, line 116 */
-    if (!(among_var)) return 0;
-    z->bra = z->c; /* ], line 116 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 116 */
-        if (ret < 0) return ret;
-    }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_from_s(z, 1, s_2); /* <-, line 117 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = slice_from_s(z, 1, s_3); /* <-, line 118 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 3:
-            {   int ret = slice_from_s(z, 1, s_4); /* <-, line 119 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
-    return 1;
-}
-
-static int r_case_other(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 124 */
-    if (z->c - 3 <= z->lb || z->p[z->c - 1] != 108) return 0;
-    among_var = find_among_b(z, a_6, 6); /* substring, line 124 */
-    if (!(among_var)) return 0;
-    z->bra = z->c; /* ], line 124 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 124 */
-        if (ret < 0) return ret;
-    }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 125 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = slice_del(z); /* delete, line 126 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 3:
-            {   int ret = slice_from_s(z, 1, s_5); /* <-, line 127 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 4:
-            {   int ret = slice_from_s(z, 1, s_6); /* <-, line 128 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
-    return 1;
-}
-
-static int r_factive(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 133 */
-    if (z->c <= z->lb || (z->p[z->c - 1] != 225 && z->p[z->c - 1] != 233)) return 0;
-    among_var = find_among_b(z, a_7, 2); /* substring, line 133 */
-    if (!(among_var)) return 0;
-    z->bra = z->c; /* ], line 133 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 133 */
-        if (ret < 0) return ret;
-    }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = r_double(z);
-                if (ret == 0) return 0; /* call double, line 134 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = r_double(z);
-                if (ret == 0) return 0; /* call double, line 135 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
-    {   int ret = slice_del(z); /* delete, line 137 */
-        if (ret < 0) return ret;
-    }
-    {   int ret = r_undouble(z);
-        if (ret == 0) return 0; /* call undouble, line 138 */
-        if (ret < 0) return ret;
-    }
-    return 1;
-}
-
-static int r_plural(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 142 */
-    if (z->c <= z->lb || z->p[z->c - 1] != 107) return 0;
-    among_var = find_among_b(z, a_8, 7); /* substring, line 142 */
-    if (!(among_var)) return 0;
-    z->bra = z->c; /* ], line 142 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 142 */
-        if (ret < 0) return ret;
-    }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_from_s(z, 1, s_7); /* <-, line 143 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = slice_from_s(z, 1, s_8); /* <-, line 144 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 3:
-            {   int ret = slice_del(z); /* delete, line 145 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 4:
-            {   int ret = slice_del(z); /* delete, line 146 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 5:
-            {   int ret = slice_del(z); /* delete, line 147 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 6:
-            {   int ret = slice_del(z); /* delete, line 148 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 7:
-            {   int ret = slice_del(z); /* delete, line 149 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
-    return 1;
-}
-
-static int r_owned(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 154 */
-    if (z->c <= z->lb || (z->p[z->c - 1] != 105 && z->p[z->c - 1] != 233)) return 0;
-    among_var = find_among_b(z, a_9, 12); /* substring, line 154 */
-    if (!(among_var)) return 0;
-    z->bra = z->c; /* ], line 154 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 154 */
-        if (ret < 0) return ret;
-    }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 155 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = slice_from_s(z, 1, s_9); /* <-, line 156 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 3:
-            {   int ret = slice_from_s(z, 1, s_10); /* <-, line 157 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 4:
-            {   int ret = slice_del(z); /* delete, line 158 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 5:
-            {   int ret = slice_from_s(z, 1, s_11); /* <-, line 159 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 6:
-            {   int ret = slice_from_s(z, 1, s_12); /* <-, line 160 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 7:
-            {   int ret = slice_del(z); /* delete, line 161 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 8:
-            {   int ret = slice_from_s(z, 1, s_13); /* <-, line 162 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 9:
-            {   int ret = slice_del(z); /* delete, line 163 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
-    return 1;
-}
-
-static int r_sing_owner(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 168 */
-    among_var = find_among_b(z, a_10, 31); /* substring, line 168 */
-    if (!(among_var)) return 0;
-    z->bra = z->c; /* ], line 168 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 168 */
-        if (ret < 0) return ret;
-    }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 169 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = slice_from_s(z, 1, s_14); /* <-, line 170 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 3:
-            {   int ret = slice_from_s(z, 1, s_15); /* <-, line 171 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 4:
-            {   int ret = slice_del(z); /* delete, line 172 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 5:
-            {   int ret = slice_from_s(z, 1, s_16); /* <-, line 173 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 6:
-            {   int ret = slice_from_s(z, 1, s_17); /* <-, line 174 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 7:
-            {   int ret = slice_del(z); /* delete, line 175 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 8:
-            {   int ret = slice_del(z); /* delete, line 176 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 9:
-            {   int ret = slice_del(z); /* delete, line 177 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 10:
-            {   int ret = slice_from_s(z, 1, s_18); /* <-, line 178 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 11:
-            {   int ret = slice_from_s(z, 1, s_19); /* <-, line 179 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 12:
-            {   int ret = slice_del(z); /* delete, line 180 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 13:
-            {   int ret = slice_del(z); /* delete, line 181 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 14:
-            {   int ret = slice_from_s(z, 1, s_20); /* <-, line 182 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 15:
-            {   int ret = slice_from_s(z, 1, s_21); /* <-, line 183 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 16:
-            {   int ret = slice_del(z); /* delete, line 184 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 17:
-            {   int ret = slice_del(z); /* delete, line 185 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 18:
-            {   int ret = slice_del(z); /* delete, line 186 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 19:
-            {   int ret = slice_from_s(z, 1, s_22); /* <-, line 187 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 20:
-            {   int ret = slice_from_s(z, 1, s_23); /* <-, line 188 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
-    return 1;
-}
-
-static int r_plur_owner(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 193 */
-    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((10768 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_11, 42); /* substring, line 193 */
-    if (!(among_var)) return 0;
-    z->bra = z->c; /* ], line 193 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 193 */
-        if (ret < 0) return ret;
-    }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 194 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = slice_from_s(z, 1, s_24); /* <-, line 195 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 3:
-            {   int ret = slice_from_s(z, 1, s_25); /* <-, line 196 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 4:
-            {   int ret = slice_del(z); /* delete, line 197 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 5:
-            {   int ret = slice_del(z); /* delete, line 198 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 6:
-            {   int ret = slice_del(z); /* delete, line 199 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 7:
-            {   int ret = slice_from_s(z, 1, s_26); /* <-, line 200 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 8:
-            {   int ret = slice_from_s(z, 1, s_27); /* <-, line 201 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 9:
-            {   int ret = slice_del(z); /* delete, line 202 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 10:
-            {   int ret = slice_del(z); /* delete, line 203 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 11:
-            {   int ret = slice_del(z); /* delete, line 204 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 12:
-            {   int ret = slice_from_s(z, 1, s_28); /* <-, line 205 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 13:
-            {   int ret = slice_from_s(z, 1, s_29); /* <-, line 206 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 14:
-            {   int ret = slice_del(z); /* delete, line 207 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 15:
-            {   int ret = slice_del(z); /* delete, line 208 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 16:
-            {   int ret = slice_del(z); /* delete, line 209 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 17:
-            {   int ret = slice_del(z); /* delete, line 210 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 18:
-            {   int ret = slice_from_s(z, 1, s_30); /* <-, line 211 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 19:
-            {   int ret = slice_from_s(z, 1, s_31); /* <-, line 212 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 20:
-            {   int ret = slice_del(z); /* delete, line 214 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 21:
-            {   int ret = slice_del(z); /* delete, line 215 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 22:
-            {   int ret = slice_from_s(z, 1, s_32); /* <-, line 216 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 23:
-            {   int ret = slice_from_s(z, 1, s_33); /* <-, line 217 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 24:
-            {   int ret = slice_del(z); /* delete, line 218 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 25:
-            {   int ret = slice_del(z); /* delete, line 219 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 26:
-            {   int ret = slice_del(z); /* delete, line 220 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 27:
-            {   int ret = slice_from_s(z, 1, s_34); /* <-, line 221 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 28:
-            {   int ret = slice_from_s(z, 1, s_35); /* <-, line 222 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 29:
-            {   int ret = slice_del(z); /* delete, line 223 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
-    return 1;
-}
-
-extern int hungarian_ISO_8859_1_stem(struct SN_env * z) {
-    {   int c1 = z->c; /* do, line 229 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab0; /* call mark_regions, line 229 */
-            if (ret < 0) return ret;
-        }
-    lab0:
-        z->c = c1;
-    }
-    z->lb = z->c; z->c = z->l; /* backwards, line 230 */
-
-    {   int m2 = z->l - z->c; (void)m2; /* do, line 231 */
-        {   int ret = r_instrum(z);
-            if (ret == 0) goto lab1; /* call instrum, line 231 */
-            if (ret < 0) return ret;
-        }
-    lab1:
-        z->c = z->l - m2;
-    }
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 232 */
-        {   int ret = r_case(z);
-            if (ret == 0) goto lab2; /* call case, line 232 */
-            if (ret < 0) return ret;
-        }
-    lab2:
-        z->c = z->l - m3;
-    }
-    {   int m4 = z->l - z->c; (void)m4; /* do, line 233 */
-        {   int ret = r_case_special(z);
-            if (ret == 0) goto lab3; /* call case_special, line 233 */
-            if (ret < 0) return ret;
-        }
-    lab3:
-        z->c = z->l - m4;
-    }
-    {   int m5 = z->l - z->c; (void)m5; /* do, line 234 */
-        {   int ret = r_case_other(z);
-            if (ret == 0) goto lab4; /* call case_other, line 234 */
-            if (ret < 0) return ret;
-        }
-    lab4:
-        z->c = z->l - m5;
-    }
-    {   int m6 = z->l - z->c; (void)m6; /* do, line 235 */
-        {   int ret = r_factive(z);
-            if (ret == 0) goto lab5; /* call factive, line 235 */
-            if (ret < 0) return ret;
-        }
-    lab5:
-        z->c = z->l - m6;
-    }
-    {   int m7 = z->l - z->c; (void)m7; /* do, line 236 */
-        {   int ret = r_owned(z);
-            if (ret == 0) goto lab6; /* call owned, line 236 */
-            if (ret < 0) return ret;
-        }
-    lab6:
-        z->c = z->l - m7;
-    }
-    {   int m8 = z->l - z->c; (void)m8; /* do, line 237 */
-        {   int ret = r_sing_owner(z);
-            if (ret == 0) goto lab7; /* call sing_owner, line 237 */
-            if (ret < 0) return ret;
-        }
-    lab7:
-        z->c = z->l - m8;
-    }
-    {   int m9 = z->l - z->c; (void)m9; /* do, line 238 */
-        {   int ret = r_plur_owner(z);
-            if (ret == 0) goto lab8; /* call plur_owner, line 238 */
-            if (ret < 0) return ret;
-        }
-    lab8:
-        z->c = z->l - m9;
-    }
-    {   int m10 = z->l - z->c; (void)m10; /* do, line 239 */
-        {   int ret = r_plural(z);
-            if (ret == 0) goto lab9; /* call plural, line 239 */
-            if (ret < 0) return ret;
-        }
-    lab9:
-        z->c = z->l - m10;
-    }
-    z->c = z->lb;
-    return 1;
-}
-
-extern struct SN_env * hungarian_ISO_8859_1_create_env(void) { return SN_create_env(0, 1, 0); }
-
-extern void hungarian_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z, 0); }
-
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_italian.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_italian.c
index d941b0f036..fca2e3af1c 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_italian.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_italian.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -476,34 +476,29 @@ static const symbol s_2[] = { 0xEC };
 static const symbol s_3[] = { 0xF2 };
 static const symbol s_4[] = { 0xF9 };
 static const symbol s_5[] = { 'q', 'U' };
-static const symbol s_6[] = { 'u' };
-static const symbol s_7[] = { 'U' };
+static const symbol s_6[] = { 'U' };
+static const symbol s_7[] = { 'I' };
 static const symbol s_8[] = { 'i' };
-static const symbol s_9[] = { 'I' };
-static const symbol s_10[] = { 'i' };
-static const symbol s_11[] = { 'u' };
-static const symbol s_12[] = { 'e' };
-static const symbol s_13[] = { 'i', 'c' };
-static const symbol s_14[] = { 'l', 'o', 'g' };
-static const symbol s_15[] = { 'u' };
-static const symbol s_16[] = { 'e', 'n', 't', 'e' };
-static const symbol s_17[] = { 'a', 't' };
-static const symbol s_18[] = { 'a', 't' };
-static const symbol s_19[] = { 'i', 'c' };
-static const symbol s_20[] = { 'i' };
-static const symbol s_21[] = { 'h' };
+static const symbol s_9[] = { 'u' };
+static const symbol s_10[] = { 'e' };
+static const symbol s_11[] = { 'i', 'c' };
+static const symbol s_12[] = { 'l', 'o', 'g' };
+static const symbol s_13[] = { 'u' };
+static const symbol s_14[] = { 'e', 'n', 't', 'e' };
+static const symbol s_15[] = { 'a', 't' };
+static const symbol s_16[] = { 'a', 't' };
+static const symbol s_17[] = { 'i', 'c' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     int among_var;
-    {   int c_test = z->c; /* test, line 35 */
+    {   int c_test1 = z->c; /* test, line 35 */
         while(1) { /* repeat, line 35 */
-            int c1 = z->c;
+            int c2 = 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;
+            switch (among_var) { /* among, line 36 */
                 case 1:
                     {   int ret = slice_from_s(z, 1, s_0); /* <-, line 37 */
                         if (ret < 0) return ret;
@@ -541,59 +536,61 @@ static int r_prelude(struct SN_env * z) {
             }
             continue;
         lab0:
-            z->c = c1;
+            z->c = c2;
             break;
         }
-        z->c = c_test;
+        z->c = c_test1;
     }
     while(1) { /* repeat, line 46 */
-        int c2 = z->c;
+        int c3 = z->c;
         while(1) { /* goto, line 46 */
-            int c3 = z->c;
-            if (in_grouping(z, g_v, 97, 249, 0)) goto lab2;
+            int c4 = z->c;
+            if (in_grouping(z, g_v, 97, 249, 0)) goto lab2; /* grouping v, line 47 */
             z->bra = z->c; /* [, line 47 */
-            {   int c4 = z->c; /* or, line 47 */
-                if (!(eq_s(z, 1, s_6))) goto lab4;
+            {   int c5 = z->c; /* or, line 47 */
+                if (z->c == z->l || z->p[z->c] != 'u') goto lab4; /* literal, line 47 */
+                z->c++;
                 z->ket = z->c; /* ], line 47 */
-                if (in_grouping(z, g_v, 97, 249, 0)) goto lab4;
-                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 47 */
+                if (in_grouping(z, g_v, 97, 249, 0)) goto lab4; /* grouping v, line 47 */
+                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 47 */
                     if (ret < 0) return ret;
                 }
                 goto lab3;
             lab4:
-                z->c = c4;
-                if (!(eq_s(z, 1, s_8))) goto lab2;
+                z->c = c5;
+                if (z->c == z->l || z->p[z->c] != 'i') goto lab2; /* literal, line 48 */
+                z->c++;
                 z->ket = z->c; /* ], line 48 */
-                if (in_grouping(z, g_v, 97, 249, 0)) goto lab2;
-                {   int ret = slice_from_s(z, 1, s_9); /* <-, line 48 */
+                if (in_grouping(z, g_v, 97, 249, 0)) goto lab2; /* grouping v, line 48 */
+                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 48 */
                     if (ret < 0) return ret;
                 }
             }
         lab3:
-            z->c = c3;
+            z->c = c4;
             break;
         lab2:
-            z->c = c3;
+            z->c = c4;
             if (z->c >= z->l) goto lab1;
             z->c++; /* goto, line 46 */
         }
         continue;
     lab1:
-        z->c = c2;
+        z->c = c3;
         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;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 54 */
+    z->I[1] = z->l; /* $p1 = <integer expression>, line 55 */
+    z->I[2] = z->l; /* $p2 = <integer expression>, line 56 */
     {   int c1 = z->c; /* do, line 58 */
         {   int c2 = z->c; /* or, line 60 */
-            if (in_grouping(z, g_v, 97, 249, 0)) goto lab2;
+            if (in_grouping(z, g_v, 97, 249, 0)) goto lab2; /* grouping v, line 59 */
             {   int c3 = z->c; /* or, line 59 */
-                if (out_grouping(z, g_v, 97, 249, 0)) goto lab4;
+                if (out_grouping(z, g_v, 97, 249, 0)) goto lab4; /* non v, line 59 */
                 {    /* gopast */ /* grouping v, line 59 */
                     int ret = out_grouping(z, g_v, 97, 249, 1);
                     if (ret < 0) goto lab4;
@@ -602,7 +599,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab3;
             lab4:
                 z->c = c3;
-                if (in_grouping(z, g_v, 97, 249, 0)) goto lab2;
+                if (in_grouping(z, g_v, 97, 249, 0)) goto lab2; /* grouping v, line 59 */
                 {    /* gopast */ /* non v, line 59 */
                     int ret = in_grouping(z, g_v, 97, 249, 1);
                     if (ret < 0) goto lab2;
@@ -613,9 +610,9 @@ static int r_mark_regions(struct SN_env * z) {
             goto lab1;
         lab2:
             z->c = c2;
-            if (out_grouping(z, g_v, 97, 249, 0)) goto lab0;
+            if (out_grouping(z, g_v, 97, 249, 0)) goto lab0; /* non v, line 61 */
             {   int c4 = z->c; /* or, line 61 */
-                if (out_grouping(z, g_v, 97, 249, 0)) goto lab6;
+                if (out_grouping(z, g_v, 97, 249, 0)) goto lab6; /* non v, line 61 */
                 {    /* gopast */ /* grouping v, line 61 */
                     int ret = out_grouping(z, g_v, 97, 249, 1);
                     if (ret < 0) goto lab6;
@@ -624,7 +621,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab5;
             lab6:
                 z->c = c4;
-                if (in_grouping(z, g_v, 97, 249, 0)) goto lab0;
+                if (in_grouping(z, g_v, 97, 249, 0)) goto lab0; /* grouping v, line 61 */
                 if (z->c >= z->l) goto lab0;
                 z->c++; /* next, line 61 */
             }
@@ -665,24 +662,23 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 70 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 72 */
-        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 85)) among_var = 3; else
-        among_var = find_among(z, a_1, 3); /* substring, line 72 */
+        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 85)) among_var = 3; else /* substring, line 72 */
+        among_var = find_among(z, a_1, 3);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 72 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 72 */
             case 1:
-                {   int ret = slice_from_s(z, 1, s_10); /* <-, line 73 */
+                {   int ret = slice_from_s(z, 1, s_8); /* <-, line 73 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_11); /* <-, line 74 */
+                {   int ret = slice_from_s(z, 1, s_9); /* <-, line 74 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -699,43 +695,41 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_RV(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_RV(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 82 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 83 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[2] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[2] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 84 */
     return 1;
 }
 
-static int r_attached_pronoun(struct SN_env * z) {
+static int r_attached_pronoun(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 87 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((33314 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    if (!(find_among_b(z, a_2, 37))) return 0; /* substring, line 87 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((33314 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 87 */
+    if (!(find_among_b(z, a_2, 37))) return 0;
     z->bra = z->c; /* ], line 87 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 111 && z->p[z->c - 1] != 114)) return 0;
-    among_var = find_among_b(z, a_3, 5); /* among, line 97 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 111 && z->p[z->c - 1] != 114)) return 0; /* among, line 97 */
+    among_var = find_among_b(z, a_3, 5);
     if (!(among_var)) return 0;
-    {   int ret = r_RV(z);
-        if (ret == 0) return 0; /* call RV, line 97 */
-        if (ret < 0) return ret;
+    {   int ret = r_RV(z); /* call RV, line 97 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 97 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 98 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 1, s_12); /* <-, line 99 */
+            {   int ret = slice_from_s(z, 1, s_10); /* <-, line 99 */
                 if (ret < 0) return ret;
             }
             break;
@@ -743,37 +737,34 @@ static int r_attached_pronoun(struct SN_env * z) {
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     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;
+    switch (among_var) { /* among, line 104 */
         case 1:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 111 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 111 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R2(z); /* call R2, line 113 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 113 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 114 */
+            {   int m1 = z->l - z->c; (void)m1; /* try, line 114 */
                 z->ket = z->c; /* [, line 114 */
-                if (!(eq_s_b(z, 2, s_13))) { z->c = z->l - m_keep; goto lab0; }
+                if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m1; goto lab0; } /* literal, line 114 */
                 z->bra = z->c; /* ], line 114 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call R2, line 114 */
+                {   int ret = r_R2(z); /* call R2, line 114 */
+                    if (ret == 0) { z->c = z->l - m1; goto lab0; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 114 */
@@ -784,70 +775,64 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 3:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 117 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 117 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_14); /* <-, line 117 */
+            {   int ret = slice_from_s(z, 3, s_12); /* <-, 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 = r_R2(z); /* call R2, line 119 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 1, s_15); /* <-, line 119 */
+            {   int ret = slice_from_s(z, 1, s_13); /* <-, 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 = r_R2(z); /* call R2, line 121 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 4, s_16); /* <-, line 121 */
+            {   int ret = slice_from_s(z, 4, s_14); /* <-, 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 = r_RV(z); /* call RV, line 123 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R1(z); /* call R1, line 125 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 125 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 126 */
+            {   int m2 = z->l - z->c; (void)m2; /* try, line 126 */
                 z->ket = z->c; /* [, line 127 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4722696 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab1; }
-                among_var = find_among_b(z, a_4, 4); /* substring, line 127 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab1; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4722696 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m2; goto lab1; } /* substring, line 127 */
+                among_var = find_among_b(z, a_4, 4);
+                if (!(among_var)) { z->c = z->l - m2; goto lab1; }
                 z->bra = z->c; /* ], line 127 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call R2, line 127 */
+                {   int ret = r_R2(z); /* call R2, line 127 */
+                    if (ret == 0) { z->c = z->l - m2; goto lab1; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 127 */
                     if (ret < 0) return ret;
                 }
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab1; }
+                switch (among_var) { /* among, line 127 */
                     case 1:
                         z->ket = z->c; /* [, line 128 */
-                        if (!(eq_s_b(z, 2, s_17))) { z->c = z->l - m_keep; goto lab1; }
+                        if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m2; goto lab1; } /* literal, line 128 */
                         z->bra = z->c; /* ], line 128 */
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call R2, line 128 */
+                        {   int ret = r_R2(z); /* call R2, line 128 */
+                            if (ret == 0) { z->c = z->l - m2; goto lab1; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 128 */
@@ -860,59 +845,51 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 8:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 134 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 134 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 134 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 135 */
+            {   int m3 = z->l - z->c; (void)m3; /* try, line 135 */
                 z->ket = z->c; /* [, line 136 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab2; }
-                among_var = find_among_b(z, a_5, 3); /* substring, line 136 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab2; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m3; goto lab2; } /* substring, line 136 */
+                if (!(find_among_b(z, a_5, 3))) { z->c = z->l - m3; goto lab2; }
                 z->bra = z->c; /* ], line 136 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab2; }
-                    case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab2; } /* call R2, line 137 */
-                            if (ret < 0) return ret;
-                        }
-                        {   int ret = slice_del(z); /* delete, line 137 */
-                            if (ret < 0) return ret;
-                        }
-                        break;
+                {   int ret = r_R2(z); /* call R2, line 137 */
+                    if (ret == 0) { z->c = z->l - m3; goto lab2; }
+                    if (ret < 0) return ret;
+                }
+                {   int ret = slice_del(z); /* delete, line 137 */
+                    if (ret < 0) return ret;
                 }
             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 = r_R2(z); /* call R2, line 142 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 142 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 143 */
+            {   int m4 = z->l - z->c; (void)m4; /* try, line 143 */
                 z->ket = z->c; /* [, line 143 */
-                if (!(eq_s_b(z, 2, s_18))) { z->c = z->l - m_keep; goto lab3; }
+                if (!(eq_s_b(z, 2, s_16))) { z->c = z->l - m4; goto lab3; } /* literal, line 143 */
                 z->bra = z->c; /* ], line 143 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 143 */
+                {   int ret = r_R2(z); /* call R2, line 143 */
+                    if (ret == 0) { z->c = z->l - m4; goto lab3; }
                     if (ret < 0) return ret;
                 }
                 {   int 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_keep; goto lab3; }
+                if (!(eq_s_b(z, 2, s_17))) { z->c = z->l - m4; goto lab3; } /* literal, line 143 */
                 z->bra = z->c; /* ], line 143 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 143 */
+                {   int ret = r_R2(z); /* call R2, line 143 */
+                    if (ret == 0) { z->c = z->l - m4; goto lab3; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 143 */
@@ -926,48 +903,40 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_verb_suffix(struct SN_env * z) {
-    int among_var;
-    {   int mlimit; /* setlimit, line 148 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_verb_suffix(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 148 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 148 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 149 */
-        among_var = find_among_b(z, a_7, 87); /* substring, line 149 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(find_among_b(z, a_7, 87))) { z->lb = mlimit1; return 0; } /* substring, line 149 */
         z->bra = z->c; /* ], line 149 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
-            case 1:
-                {   int ret = slice_del(z); /* delete, line 163 */
-                    if (ret < 0) return ret;
-                }
-                break;
+        {   int ret = slice_del(z); /* delete, line 163 */
+            if (ret < 0) return ret;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_vowel_suffix(struct SN_env * z) {
-    {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 171 */
+static int r_vowel_suffix(struct SN_env * z) { /* backwardmode */
+    {   int m1 = z->l - z->c; (void)m1; /* try, line 171 */
         z->ket = z->c; /* [, line 172 */
-        if (in_grouping_b(z, g_AEIO, 97, 242, 0)) { z->c = z->l - m_keep; goto lab0; }
+        if (in_grouping_b(z, g_AEIO, 97, 242, 0)) { z->c = z->l - m1; goto lab0; } /* grouping AEIO, line 172 */
         z->bra = z->c; /* ], line 172 */
-        {   int ret = r_RV(z);
-            if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call RV, line 172 */
+        {   int ret = r_RV(z); /* call RV, line 172 */
+            if (ret == 0) { z->c = z->l - m1; goto lab0; }
             if (ret < 0) return ret;
         }
         {   int 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_keep; goto lab0; }
+        if (z->c <= z->lb || z->p[z->c - 1] != 'i') { z->c = z->l - m1; goto lab0; } /* literal, line 173 */
+        z->c--;
         z->bra = z->c; /* ], line 173 */
-        {   int ret = r_RV(z);
-            if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call RV, line 173 */
+        {   int ret = r_RV(z); /* call RV, line 173 */
+            if (ret == 0) { z->c = z->l - m1; goto lab0; }
             if (ret < 0) return ret;
         }
         {   int ret = slice_del(z); /* delete, line 173 */
@@ -976,13 +945,14 @@ static int r_vowel_suffix(struct SN_env * z) {
     lab0:
         ;
     }
-    {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 175 */
+    {   int m2 = z->l - z->c; (void)m2; /* try, line 175 */
         z->ket = z->c; /* [, line 176 */
-        if (!(eq_s_b(z, 1, s_21))) { z->c = z->l - m_keep; goto lab1; }
+        if (z->c <= z->lb || z->p[z->c - 1] != 'h') { z->c = z->l - m2; goto lab1; } /* literal, line 176 */
+        z->c--;
         z->bra = z->c; /* ], line 176 */
-        if (in_grouping_b(z, g_CG, 99, 103, 0)) { z->c = z->l - m_keep; goto lab1; }
-        {   int ret = r_RV(z);
-            if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call RV, line 176 */
+        if (in_grouping_b(z, g_CG, 99, 103, 0)) { z->c = z->l - m2; goto lab1; } /* grouping CG, line 176 */
+        {   int ret = r_RV(z); /* call RV, line 176 */
+            if (ret == 0) { z->c = z->l - m2; goto lab1; }
             if (ret < 0) return ret;
         }
         {   int ret = slice_del(z); /* delete, line 176 */
@@ -994,67 +964,65 @@ static int r_vowel_suffix(struct SN_env * z) {
     return 1;
 }
 
-extern int italian_ISO_8859_1_stem(struct SN_env * z) {
+extern int italian_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 182 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 182 */
+        {   int ret = r_prelude(z); /* call prelude, line 182 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    {   int c2 = 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 = c2;
+    /* do, line 183 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 183 */
+        if (ret == 0) goto lab1;
+        if (ret < 0) return ret;
     }
+lab1:
     z->lb = z->c; z->c = z->l; /* backwards, line 184 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 185 */
-        {   int ret = r_attached_pronoun(z);
-            if (ret == 0) goto lab2; /* call attached_pronoun, line 185 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 185 */
+        {   int ret = r_attached_pronoun(z); /* call attached_pronoun, line 185 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
-        z->c = z->l - m3;
+        z->c = z->l - m2;
     }
-    {   int m4 = z->l - z->c; (void)m4; /* do, line 186 */
-        {   int m5 = z->l - z->c; (void)m5; /* or, line 186 */
-            {   int ret = r_standard_suffix(z);
-                if (ret == 0) goto lab5; /* call standard_suffix, line 186 */
+    {   int m3 = z->l - z->c; (void)m3; /* do, line 186 */
+        {   int m4 = z->l - z->c; (void)m4; /* or, line 186 */
+            {   int ret = r_standard_suffix(z); /* call standard_suffix, line 186 */
+                if (ret == 0) goto lab5;
                 if (ret < 0) return ret;
             }
             goto lab4;
         lab5:
-            z->c = z->l - m5;
-            {   int ret = r_verb_suffix(z);
-                if (ret == 0) goto lab3; /* call verb_suffix, line 186 */
+            z->c = z->l - m4;
+            {   int ret = r_verb_suffix(z); /* call verb_suffix, line 186 */
+                if (ret == 0) goto lab3;
                 if (ret < 0) return ret;
             }
         }
     lab4:
     lab3:
-        z->c = z->l - m4;
+        z->c = z->l - m3;
     }
-    {   int m6 = z->l - z->c; (void)m6; /* do, line 187 */
-        {   int ret = r_vowel_suffix(z);
-            if (ret == 0) goto lab6; /* call vowel_suffix, line 187 */
+    {   int m5 = z->l - z->c; (void)m5; /* do, line 187 */
+        {   int ret = r_vowel_suffix(z); /* call vowel_suffix, line 187 */
+            if (ret == 0) goto lab6;
             if (ret < 0) return ret;
         }
     lab6:
-        z->c = z->l - m6;
+        z->c = z->l - m5;
     }
     z->c = z->lb;
-    {   int c7 = z->c; /* do, line 189 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab7; /* call postlude, line 189 */
+    {   int c6 = z->c; /* do, line 189 */
+        {   int ret = r_postlude(z); /* call postlude, line 189 */
+            if (ret == 0) goto lab7;
             if (ret < 0) return ret;
         }
     lab7:
-        z->c = c7;
+        z->c = c6;
     }
     return 1;
 }
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_norwegian.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_norwegian.c
index 2debf1082d..88eb9290e9 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_norwegian.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_norwegian.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -129,18 +129,17 @@ static const unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 
 static const unsigned char g_s_ending[] = { 119, 125, 149, 1 };
 
-static const symbol s_0[] = { 'k' };
-static const symbol s_1[] = { 'e', 'r' };
+static const symbol s_0[] = { '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 ret = z->c + 3;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 28 */
+    {   int c_test1 = z->c; /* test, line 30 */
+        {   int ret = z->c + 3; /* hop, line 30 */
             if (0 > ret || ret > z->l) return 0;
-            z->c = ret; /* hop, line 30 */
+            z->c = ret;
         }
         z->I[1] = z->c; /* setmark x, line 30 */
-        z->c = c_test;
+        z->c = c_test1;
     }
     if (out_grouping(z, g_v, 97, 248, 1) < 0) return 0; /* goto */ /* grouping v, line 31 */
     {    /* gopast */ /* non v, line 31 */
@@ -149,30 +148,27 @@ static int r_mark_regions(struct SN_env * z) {
         z->c += ret;
     }
     z->I[0] = z->c; /* setmark p1, line 31 */
-     /* try, line 32 */
-    if (!(z->I[0] < z->I[1])) goto lab0;
-    z->I[0] = z->I[1];
+    /* try, line 32 */
+    if (!(z->I[0] < z->I[1])) goto lab0; /* $(<integer expression> < <integer expression>), line 32 */
+    z->I[0] = z->I[1]; /* $p1 = <integer expression>, line 32 */
 lab0:
     return 1;
 }
 
-static int r_main_suffix(struct SN_env * z) {
+static int r_main_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 38 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 38 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 38 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 38 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851426 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_0, 29); /* substring, line 38 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851426 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 38 */
+        among_var = find_among_b(z, a_0, 29);
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 38 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 39 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 44 */
                 if (ret < 0) return ret;
@@ -180,12 +176,13 @@ static int r_main_suffix(struct SN_env * z) {
             break;
         case 2:
             {   int m2 = z->l - z->c; (void)m2; /* or, line 46 */
-                if (in_grouping_b(z, g_s_ending, 98, 122, 0)) goto lab1;
+                if (in_grouping_b(z, g_s_ending, 98, 122, 0)) goto lab1; /* grouping s_ending, line 46 */
                 goto lab0;
             lab1:
                 z->c = z->l - m2;
-                if (!(eq_s_b(z, 1, s_0))) return 0;
-                if (out_grouping_b(z, g_v, 97, 248, 0)) return 0;
+                if (z->c <= z->lb || z->p[z->c - 1] != 'k') return 0; /* literal, line 46 */
+                z->c--;
+                if (out_grouping_b(z, g_v, 97, 248, 0)) return 0; /* non v, line 46 */
             }
         lab0:
             {   int ret = slice_del(z); /* delete, line 46 */
@@ -193,7 +190,7 @@ static int r_main_suffix(struct SN_env * z) {
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 2, s_1); /* <-, line 48 */
+            {   int ret = slice_from_s(z, 2, s_0); /* <-, line 48 */
                 if (ret < 0) return ret;
             }
             break;
@@ -201,21 +198,19 @@ static int r_main_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_consonant_pair(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 53 */
-        {   int mlimit; /* setlimit, line 54 */
-            int m1 = z->l - z->c; (void)m1;
+static int r_consonant_pair(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 53 */
+
+        {   int mlimit2; /* setlimit, line 54 */
             if (z->c < z->I[0]) return 0;
-            z->c = z->I[0]; /* tomark, line 54 */
-            mlimit = z->lb; z->lb = z->c;
-            z->c = z->l - m1;
+            mlimit2 = z->lb; z->lb = z->I[0];
             z->ket = z->c; /* [, line 54 */
-            if (z->c - 1 <= z->lb || z->p[z->c - 1] != 116) { z->lb = mlimit; return 0; }
-            if (!(find_among_b(z, a_1, 2))) { z->lb = mlimit; return 0; } /* substring, line 54 */
+            if (z->c - 1 <= z->lb || z->p[z->c - 1] != 116) { z->lb = mlimit2; return 0; } /* substring, line 54 */
+            if (!(find_among_b(z, a_1, 2))) { z->lb = mlimit2; return 0; }
             z->bra = z->c; /* ], line 54 */
-            z->lb = mlimit;
+            z->lb = mlimit2;
         }
-        z->c = z->l - m_test;
+        z->c = z->l - m_test1;
     }
     if (z->c <= z->lb) return 0;
     z->c--; /* next, line 59 */
@@ -226,36 +221,27 @@ static int r_consonant_pair(struct SN_env * z) {
     return 1;
 }
 
-static int r_other_suffix(struct SN_env * z) {
-    int among_var;
-    {   int mlimit; /* setlimit, line 63 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_other_suffix(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 63 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 63 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 63 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718720 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_2, 11); /* substring, line 63 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718720 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 63 */
+        if (!(find_among_b(z, a_2, 11))) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 63 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 67 */
-                if (ret < 0) return ret;
-            }
-            break;
+    {   int ret = slice_del(z); /* delete, line 67 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-extern int norwegian_ISO_8859_1_stem(struct SN_env * z) {
+extern int norwegian_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 74 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab0; /* call mark_regions, line 74 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 74 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
@@ -264,24 +250,24 @@ extern int norwegian_ISO_8859_1_stem(struct SN_env * z) {
     z->lb = z->c; z->c = z->l; /* backwards, line 75 */
 
     {   int m2 = z->l - z->c; (void)m2; /* do, line 76 */
-        {   int ret = r_main_suffix(z);
-            if (ret == 0) goto lab1; /* call main_suffix, line 76 */
+        {   int ret = r_main_suffix(z); /* call main_suffix, line 76 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
     {   int m3 = z->l - z->c; (void)m3; /* do, line 77 */
-        {   int ret = r_consonant_pair(z);
-            if (ret == 0) goto lab2; /* call consonant_pair, line 77 */
+        {   int ret = r_consonant_pair(z); /* call consonant_pair, line 77 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
         z->c = z->l - m3;
     }
     {   int m4 = z->l - z->c; (void)m4; /* do, line 78 */
-        {   int ret = r_other_suffix(z);
-            if (ret == 0) goto lab3; /* call other_suffix, line 78 */
+        {   int ret = r_other_suffix(z); /* call other_suffix, line 78 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_porter.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_porter.c
index 69e4fc4c1f..cc330e0cd7 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_porter.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_porter.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -115,21 +115,21 @@ static const struct among a_3[20] =
 /*  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},
+/*  5 */ { 5, s_3_5, -1, 11, 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},
+/*  7 */ { 5, s_3_7, -1, 9, 0},
+/*  8 */ { 6, s_3_8, -1, 13, 0},
+/*  9 */ { 5, s_3_9, -1, 12, 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},
+/* 12 */ { 5, s_3_12, -1, 9, 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}
+/* 17 */ { 7, s_3_17, -1, 12, 0},
+/* 18 */ { 7, s_3_18, -1, 10, 0},
+/* 19 */ { 7, s_3_19, -1, 11, 0}
 };
 
 static const symbol s_4_0[5] = { 'i', 'c', 'a', 't', 'e' };
@@ -203,63 +203,51 @@ static const symbol s_1[] = { 'i' };
 static const symbol s_2[] = { 'e', 'e' };
 static const symbol s_3[] = { 'e' };
 static const symbol s_4[] = { 'e' };
-static const symbol s_5[] = { 'y' };
-static const symbol s_6[] = { 'Y' };
-static const symbol s_7[] = { 'i' };
-static const symbol s_8[] = { 't', 'i', 'o', 'n' };
-static const symbol s_9[] = { 'e', 'n', 'c', 'e' };
-static const symbol s_10[] = { 'a', 'n', 'c', 'e' };
-static const symbol s_11[] = { 'a', 'b', 'l', 'e' };
-static const symbol s_12[] = { 'e', 'n', 't' };
-static const symbol s_13[] = { 'e' };
-static const symbol s_14[] = { 'i', 'z', 'e' };
-static const symbol s_15[] = { 'a', 't', 'e' };
-static const symbol s_16[] = { 'a', 'l' };
-static const symbol s_17[] = { 'a', 'l' };
-static const symbol s_18[] = { 'f', 'u', 'l' };
-static const symbol s_19[] = { 'o', 'u', 's' };
-static const symbol s_20[] = { 'i', 'v', 'e' };
-static const symbol s_21[] = { 'b', 'l', 'e' };
-static const symbol s_22[] = { 'a', 'l' };
-static const symbol s_23[] = { 'i', 'c' };
-static const symbol s_24[] = { 's' };
-static const symbol s_25[] = { 't' };
-static const symbol s_26[] = { 'e' };
-static const symbol s_27[] = { 'l' };
-static const symbol s_28[] = { 'l' };
-static const symbol s_29[] = { 'y' };
-static const symbol s_30[] = { 'Y' };
-static const symbol s_31[] = { 'y' };
-static const symbol s_32[] = { 'Y' };
-static const symbol s_33[] = { 'Y' };
-static const symbol s_34[] = { 'y' };
+static const symbol s_5[] = { 'i' };
+static const symbol s_6[] = { 't', 'i', 'o', 'n' };
+static const symbol s_7[] = { 'e', 'n', 'c', 'e' };
+static const symbol s_8[] = { 'a', 'n', 'c', 'e' };
+static const symbol s_9[] = { 'a', 'b', 'l', 'e' };
+static const symbol s_10[] = { 'e', 'n', 't' };
+static const symbol s_11[] = { 'e' };
+static const symbol s_12[] = { 'i', 'z', 'e' };
+static const symbol s_13[] = { 'a', 't', 'e' };
+static const symbol s_14[] = { 'a', 'l' };
+static const symbol s_15[] = { 'f', 'u', 'l' };
+static const symbol s_16[] = { 'o', 'u', 's' };
+static const symbol s_17[] = { 'i', 'v', 'e' };
+static const symbol s_18[] = { 'b', 'l', 'e' };
+static const symbol s_19[] = { 'a', 'l' };
+static const symbol s_20[] = { 'i', 'c' };
+static const symbol s_21[] = { 'Y' };
+static const symbol s_22[] = { 'Y' };
+static const symbol s_23[] = { 'y' };
 
-static int r_shortv(struct SN_env * z) {
-    if (out_grouping_b(z, g_v_WXY, 89, 121, 0)) return 0;
-    if (in_grouping_b(z, g_v, 97, 121, 0)) return 0;
-    if (out_grouping_b(z, g_v, 97, 121, 0)) return 0;
+static int r_shortv(struct SN_env * z) { /* backwardmode */
+    if (out_grouping_b(z, g_v_WXY, 89, 121, 0)) return 0; /* non v_WXY, line 19 */
+    if (in_grouping_b(z, g_v, 97, 121, 0)) return 0; /* grouping v, line 19 */
+    if (out_grouping_b(z, g_v, 97, 121, 0)) return 0; /* non v, line 19 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 21 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 22 */
     return 1;
 }
 
-static int r_Step_1a(struct SN_env * z) {
+static int r_Step_1a(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 25 */
-    if (z->c <= z->lb || z->p[z->c - 1] != 115) return 0;
-    among_var = find_among_b(z, a_0, 4); /* substring, line 25 */
+    if (z->c <= z->lb || z->p[z->c - 1] != 115) return 0; /* substring, line 25 */
+    among_var = find_among_b(z, a_0, 4);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 25 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 25 */
         case 1:
             {   int ret = slice_from_s(z, 2, s_0); /* <-, line 26 */
                 if (ret < 0) return ret;
@@ -279,48 +267,47 @@ static int r_Step_1a(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_1b(struct SN_env * z) {
+static int r_Step_1b(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 34 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 103)) return 0;
-    among_var = find_among_b(z, a_2, 3); /* substring, line 34 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 103)) return 0; /* substring, line 34 */
+    among_var = find_among_b(z, a_2, 3);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 34 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 34 */
         case 1:
-            {   int ret = r_R1(z);
-                if (ret == 0) return 0; /* call R1, line 35 */
-                if (ret < 0) return ret;
+            {   int ret = r_R1(z); /* call R1, line 35 */
+                if (ret <= 0) return ret;
             }
             {   int 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 */
+            {   int m_test1 = z->l - z->c; /* test, line 38 */
                 {    /* gopast */ /* grouping v, line 38 */
                     int ret = out_grouping_b(z, g_v, 97, 121, 1);
                     if (ret < 0) return 0;
                     z->c -= ret;
                 }
-                z->c = z->l - m_test;
+                z->c = z->l - m_test1;
             }
             {   int ret = slice_del(z); /* delete, line 38 */
                 if (ret < 0) return ret;
             }
-            {   int m_test = z->l - z->c; /* test, line 39 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68514004 >> (z->p[z->c - 1] & 0x1f)) & 1)) among_var = 3; else
-                among_var = find_among_b(z, a_1, 13); /* substring, line 39 */
+            {   int m_test2 = z->l - z->c; /* test, line 39 */
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68514004 >> (z->p[z->c - 1] & 0x1f)) & 1)) among_var = 3; else /* substring, line 39 */
+                among_var = find_among_b(z, a_1, 13);
                 if (!(among_var)) return 0;
-                z->c = z->l - m_test;
+                z->c = z->l - m_test2;
             }
-            switch(among_var) {
-                case 0: return 0;
+            switch (among_var) { /* among, line 39 */
                 case 1:
-                    {   int c_keep = z->c;
-                        int ret = insert_s(z, z->c, z->c, 1, s_3); /* <+, line 41 */
-                        z->c = c_keep;
+                    {   int ret;
+                        {   int saved_c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_3); /* <+, line 41 */
+                            z->c = saved_c;
+                        }
                         if (ret < 0) return ret;
                     }
                     break;
@@ -335,16 +322,17 @@ static int r_Step_1b(struct SN_env * z) {
                     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;
+                    {   int m_test3 = z->l - z->c; /* test, line 45 */
+                        {   int ret = r_shortv(z); /* call shortv, line 45 */
+                            if (ret <= 0) return ret;
                         }
-                        z->c = z->l - m_test;
+                        z->c = z->l - m_test3;
                     }
-                    {   int c_keep = z->c;
-                        int ret = insert_s(z, z->c, z->c, 1, s_4); /* <+, line 45 */
-                        z->c = c_keep;
+                    {   int ret;
+                        {   int saved_c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_4); /* <+, line 45 */
+                            z->c = saved_c;
+                        }
                         if (ret < 0) return ret;
                     }
                     break;
@@ -354,14 +342,16 @@ static int r_Step_1b(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_1c(struct SN_env * z) {
+static int r_Step_1c(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 52 */
     {   int m1 = z->l - z->c; (void)m1; /* or, line 52 */
-        if (!(eq_s_b(z, 1, s_5))) goto lab1;
+        if (z->c <= z->lb || z->p[z->c - 1] != 'y') goto lab1; /* literal, line 52 */
+        z->c--;
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        if (!(eq_s_b(z, 1, s_6))) return 0;
+        if (z->c <= z->lb || z->p[z->c - 1] != 'Y') return 0; /* literal, line 52 */
+        z->c--;
     }
 lab0:
     z->bra = z->c; /* ], line 52 */
@@ -370,92 +360,85 @@ lab0:
         if (ret < 0) return 0;
         z->c -= ret;
     }
-    {   int ret = slice_from_s(z, 1, s_7); /* <-, line 54 */
+    {   int ret = slice_from_s(z, 1, s_5); /* <-, line 54 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_Step_2(struct SN_env * z) {
+static int r_Step_2(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 58 */
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((815616 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_3, 20); /* substring, line 58 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((815616 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 58 */
+    among_var = find_among_b(z, a_3, 20);
     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;
+    {   int ret = r_R1(z); /* call R1, line 58 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 58 */
         case 1:
-            {   int ret = slice_from_s(z, 4, s_8); /* <-, line 59 */
+            {   int ret = slice_from_s(z, 4, s_6); /* <-, line 59 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 4, s_9); /* <-, line 60 */
+            {   int ret = slice_from_s(z, 4, s_7); /* <-, line 60 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 4, s_10); /* <-, line 61 */
+            {   int ret = slice_from_s(z, 4, s_8); /* <-, line 61 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 4, s_11); /* <-, line 62 */
+            {   int ret = slice_from_s(z, 4, s_9); /* <-, line 62 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
-            {   int ret = slice_from_s(z, 3, s_12); /* <-, line 63 */
+            {   int ret = slice_from_s(z, 3, s_10); /* <-, line 63 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            {   int ret = slice_from_s(z, 1, s_13); /* <-, line 64 */
+            {   int ret = slice_from_s(z, 1, s_11); /* <-, line 64 */
                 if (ret < 0) return ret;
             }
             break;
         case 7:
-            {   int ret = slice_from_s(z, 3, s_14); /* <-, line 66 */
+            {   int ret = slice_from_s(z, 3, s_12); /* <-, line 66 */
                 if (ret < 0) return ret;
             }
             break;
         case 8:
-            {   int ret = slice_from_s(z, 3, s_15); /* <-, line 68 */
+            {   int ret = slice_from_s(z, 3, s_13); /* <-, line 68 */
                 if (ret < 0) return ret;
             }
             break;
         case 9:
-            {   int ret = slice_from_s(z, 2, s_16); /* <-, line 69 */
+            {   int ret = slice_from_s(z, 2, s_14); /* <-, line 69 */
                 if (ret < 0) return ret;
             }
             break;
         case 10:
-            {   int ret = slice_from_s(z, 2, s_17); /* <-, line 71 */
+            {   int ret = slice_from_s(z, 3, s_15); /* <-, line 72 */
                 if (ret < 0) return ret;
             }
             break;
         case 11:
-            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 72 */
+            {   int ret = slice_from_s(z, 3, s_16); /* <-, line 74 */
                 if (ret < 0) return ret;
             }
             break;
         case 12:
-            {   int ret = slice_from_s(z, 3, s_19); /* <-, line 74 */
+            {   int ret = slice_from_s(z, 3, s_17); /* <-, line 76 */
                 if (ret < 0) return ret;
             }
             break;
         case 13:
-            {   int ret = slice_from_s(z, 3, s_20); /* <-, line 76 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 14:
-            {   int ret = slice_from_s(z, 3, s_21); /* <-, line 77 */
+            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 77 */
                 if (ret < 0) return ret;
             }
             break;
@@ -463,26 +446,24 @@ static int r_Step_2(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_3(struct SN_env * z) {
+static int r_Step_3(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 82 */
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((528928 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_4, 7); /* substring, line 82 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((528928 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 82 */
+    among_var = find_among_b(z, a_4, 7);
     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;
+    {   int ret = r_R1(z); /* call R1, line 82 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 82 */
         case 1:
-            {   int ret = slice_from_s(z, 2, s_22); /* <-, line 83 */
+            {   int ret = slice_from_s(z, 2, s_19); /* <-, line 83 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 2, s_23); /* <-, line 85 */
+            {   int ret = slice_from_s(z, 2, s_20); /* <-, line 85 */
                 if (ret < 0) return ret;
             }
             break;
@@ -495,19 +476,17 @@ static int r_Step_3(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_4(struct SN_env * z) {
+static int r_Step_4(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 92 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((3961384 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_5, 19); /* substring, line 92 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((3961384 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 92 */
+    among_var = find_among_b(z, a_5, 19);
     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;
+    {   int ret = r_R2(z); /* call R2, line 92 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 92 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 95 */
                 if (ret < 0) return ret;
@@ -515,11 +494,13 @@ static int r_Step_4(struct SN_env * z) {
             break;
         case 2:
             {   int m1 = z->l - z->c; (void)m1; /* or, line 96 */
-                if (!(eq_s_b(z, 1, s_24))) goto lab1;
+                if (z->c <= z->lb || z->p[z->c - 1] != 's') goto lab1; /* literal, line 96 */
+                z->c--;
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                if (!(eq_s_b(z, 1, s_25))) return 0;
+                if (z->c <= z->lb || z->p[z->c - 1] != 't') return 0; /* literal, line 96 */
+                z->c--;
             }
         lab0:
             {   int ret = slice_del(z); /* delete, line 96 */
@@ -530,25 +511,25 @@ static int r_Step_4(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_5a(struct SN_env * z) {
+static int r_Step_5a(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 101 */
-    if (!(eq_s_b(z, 1, s_26))) return 0;
+    if (z->c <= z->lb || z->p[z->c - 1] != 'e') return 0; /* literal, line 101 */
+    z->c--;
     z->bra = z->c; /* ], line 101 */
     {   int m1 = z->l - z->c; (void)m1; /* or, line 102 */
-        {   int ret = r_R2(z);
-            if (ret == 0) goto lab1; /* call R2, line 102 */
+        {   int ret = r_R2(z); /* call R2, line 102 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        {   int ret = r_R1(z);
-            if (ret == 0) return 0; /* call R1, line 102 */
-            if (ret < 0) return ret;
+        {   int ret = r_R1(z); /* call R1, line 102 */
+            if (ret <= 0) return ret;
         }
         {   int m2 = z->l - z->c; (void)m2; /* not, line 102 */
-            {   int ret = r_shortv(z);
-                if (ret == 0) goto lab2; /* call shortv, line 102 */
+            {   int ret = r_shortv(z); /* call shortv, line 102 */
+                if (ret == 0) goto lab2;
                 if (ret < 0) return ret;
             }
             return 0;
@@ -563,28 +544,30 @@ lab0:
     return 1;
 }
 
-static int r_Step_5b(struct SN_env * z) {
+static int r_Step_5b(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 107 */
-    if (!(eq_s_b(z, 1, s_27))) return 0;
+    if (z->c <= z->lb || z->p[z->c - 1] != 'l') return 0; /* literal, line 107 */
+    z->c--;
     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;
+    {   int ret = r_R2(z); /* call R2, line 108 */
+        if (ret <= 0) return ret;
     }
-    if (!(eq_s_b(z, 1, s_28))) return 0;
+    if (z->c <= z->lb || z->p[z->c - 1] != 'l') return 0; /* literal, line 108 */
+    z->c--;
     {   int 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) {
+extern int porter_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
     z->B[0] = 0; /* unset Y_found, line 115 */
     {   int c1 = z->c; /* do, line 116 */
         z->bra = z->c; /* [, line 116 */
-        if (!(eq_s(z, 1, s_29))) goto lab0;
+        if (z->c == z->l || z->p[z->c] != 'y') goto lab0; /* literal, line 116 */
+        z->c++;
         z->ket = z->c; /* ], line 116 */
-        {   int ret = slice_from_s(z, 1, s_30); /* <-, line 116 */
+        {   int ret = slice_from_s(z, 1, s_21); /* <-, line 116 */
             if (ret < 0) return ret;
         }
         z->B[0] = 1; /* set Y_found, line 116 */
@@ -596,9 +579,10 @@ extern int porter_ISO_8859_1_stem(struct SN_env * z) {
             int c3 = z->c;
             while(1) { /* goto, line 117 */
                 int c4 = z->c;
-                if (in_grouping(z, g_v, 97, 121, 0)) goto lab3;
+                if (in_grouping(z, g_v, 97, 121, 0)) goto lab3; /* grouping v, line 117 */
                 z->bra = z->c; /* [, line 117 */
-                if (!(eq_s(z, 1, s_31))) goto lab3;
+                if (z->c == z->l || z->p[z->c] != 'y') goto lab3; /* literal, line 117 */
+                z->c++;
                 z->ket = z->c; /* ], line 117 */
                 z->c = c4;
                 break;
@@ -607,7 +591,7 @@ extern int porter_ISO_8859_1_stem(struct SN_env * z) {
                 if (z->c >= z->l) goto lab2;
                 z->c++; /* goto, line 117 */
             }
-            {   int ret = slice_from_s(z, 1, s_32); /* <-, line 117 */
+            {   int ret = slice_from_s(z, 1, s_22); /* <-, line 117 */
                 if (ret < 0) return ret;
             }
             z->B[0] = 1; /* set Y_found, line 117 */
@@ -618,8 +602,8 @@ extern int porter_ISO_8859_1_stem(struct SN_env * z) {
         }
         z->c = c2;
     }
-    z->I[0] = z->l;
-    z->I[1] = z->l;
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 119 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 120 */
     {   int c5 = z->c; /* do, line 121 */
         {    /* gopast */ /* grouping v, line 122 */
             int ret = out_grouping(z, g_v, 97, 121, 1);
@@ -649,64 +633,64 @@ extern int porter_ISO_8859_1_stem(struct SN_env * z) {
     z->lb = z->c; z->c = z->l; /* backwards, line 126 */
 
     {   int m6 = z->l - z->c; (void)m6; /* do, line 127 */
-        {   int ret = r_Step_1a(z);
-            if (ret == 0) goto lab5; /* call Step_1a, line 127 */
+        {   int ret = r_Step_1a(z); /* call Step_1a, line 127 */
+            if (ret == 0) goto lab5;
             if (ret < 0) return ret;
         }
     lab5:
         z->c = z->l - m6;
     }
     {   int m7 = z->l - z->c; (void)m7; /* do, line 128 */
-        {   int ret = r_Step_1b(z);
-            if (ret == 0) goto lab6; /* call Step_1b, line 128 */
+        {   int ret = r_Step_1b(z); /* call Step_1b, line 128 */
+            if (ret == 0) goto lab6;
             if (ret < 0) return ret;
         }
     lab6:
         z->c = z->l - m7;
     }
     {   int m8 = z->l - z->c; (void)m8; /* do, line 129 */
-        {   int ret = r_Step_1c(z);
-            if (ret == 0) goto lab7; /* call Step_1c, line 129 */
+        {   int ret = r_Step_1c(z); /* call Step_1c, line 129 */
+            if (ret == 0) goto lab7;
             if (ret < 0) return ret;
         }
     lab7:
         z->c = z->l - m8;
     }
     {   int m9 = z->l - z->c; (void)m9; /* do, line 130 */
-        {   int ret = r_Step_2(z);
-            if (ret == 0) goto lab8; /* call Step_2, line 130 */
+        {   int ret = r_Step_2(z); /* call Step_2, line 130 */
+            if (ret == 0) goto lab8;
             if (ret < 0) return ret;
         }
     lab8:
         z->c = z->l - m9;
     }
     {   int m10 = z->l - z->c; (void)m10; /* do, line 131 */
-        {   int ret = r_Step_3(z);
-            if (ret == 0) goto lab9; /* call Step_3, line 131 */
+        {   int ret = r_Step_3(z); /* call Step_3, line 131 */
+            if (ret == 0) goto lab9;
             if (ret < 0) return ret;
         }
     lab9:
         z->c = z->l - m10;
     }
     {   int m11 = z->l - z->c; (void)m11; /* do, line 132 */
-        {   int ret = r_Step_4(z);
-            if (ret == 0) goto lab10; /* call Step_4, line 132 */
+        {   int ret = r_Step_4(z); /* call Step_4, line 132 */
+            if (ret == 0) goto lab10;
             if (ret < 0) return ret;
         }
     lab10:
         z->c = z->l - m11;
     }
     {   int m12 = z->l - z->c; (void)m12; /* do, line 133 */
-        {   int ret = r_Step_5a(z);
-            if (ret == 0) goto lab11; /* call Step_5a, line 133 */
+        {   int ret = r_Step_5a(z); /* call Step_5a, line 133 */
+            if (ret == 0) goto lab11;
             if (ret < 0) return ret;
         }
     lab11:
         z->c = z->l - m12;
     }
     {   int m13 = z->l - z->c; (void)m13; /* do, line 134 */
-        {   int ret = r_Step_5b(z);
-            if (ret == 0) goto lab12; /* call Step_5b, line 134 */
+        {   int ret = r_Step_5b(z); /* call Step_5b, line 134 */
+            if (ret == 0) goto lab12;
             if (ret < 0) return ret;
         }
     lab12:
@@ -720,7 +704,8 @@ extern int porter_ISO_8859_1_stem(struct SN_env * z) {
             while(1) { /* goto, line 137 */
                 int c16 = z->c;
                 z->bra = z->c; /* [, line 137 */
-                if (!(eq_s(z, 1, s_33))) goto lab15;
+                if (z->c == z->l || z->p[z->c] != 'Y') goto lab15; /* literal, line 137 */
+                z->c++;
                 z->ket = z->c; /* ], line 137 */
                 z->c = c16;
                 break;
@@ -729,7 +714,7 @@ extern int porter_ISO_8859_1_stem(struct SN_env * z) {
                 if (z->c >= z->l) goto lab14;
                 z->c++; /* goto, line 137 */
             }
-            {   int ret = slice_from_s(z, 1, s_34); /* <-, line 137 */
+            {   int ret = slice_from_s(z, 1, s_23); /* <-, line 137 */
                 if (ret < 0) return ret;
             }
             continue;
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_portuguese.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_portuguese.c
index 06d425d008..674d9c2657 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_portuguese.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_portuguese.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -90,42 +90,42 @@ static const struct among a_4[3] =
 static const symbol s_5_0[3] = { 'i', 'c', 'a' };
 static const symbol s_5_1[5] = { 0xE2, 'n', 'c', 'i', 'a' };
 static const symbol s_5_2[5] = { 0xEA, 'n', 'c', 'i', 'a' };
-static const symbol s_5_3[3] = { 'i', 'r', 'a' };
-static const symbol s_5_4[5] = { 'a', 'd', 'o', 'r', 'a' };
-static const symbol s_5_5[3] = { 'o', 's', 'a' };
-static const symbol s_5_6[4] = { 'i', 's', 't', 'a' };
-static const symbol s_5_7[3] = { 'i', 'v', 'a' };
-static const symbol s_5_8[3] = { 'e', 'z', 'a' };
-static const symbol s_5_9[5] = { 'l', 'o', 'g', 0xED, 'a' };
+static const symbol s_5_3[5] = { 'l', 'o', 'g', 'i', 'a' };
+static const symbol s_5_4[3] = { 'i', 'r', 'a' };
+static const symbol s_5_5[5] = { 'a', 'd', 'o', 'r', 'a' };
+static const symbol s_5_6[3] = { 'o', 's', 'a' };
+static const symbol s_5_7[4] = { 'i', 's', 't', 'a' };
+static const symbol s_5_8[3] = { 'i', 'v', 'a' };
+static const symbol s_5_9[3] = { 'e', 'z', 'a' };
 static const symbol s_5_10[5] = { 'i', 'd', 'a', 'd', 'e' };
 static const symbol s_5_11[4] = { 'a', 'n', 't', 'e' };
 static const symbol s_5_12[5] = { 'm', 'e', 'n', 't', 'e' };
 static const symbol s_5_13[6] = { 'a', 'm', 'e', 'n', 't', 'e' };
 static const symbol s_5_14[4] = { 0xE1, 'v', 'e', 'l' };
 static const symbol s_5_15[4] = { 0xED, 'v', 'e', 'l' };
-static const symbol s_5_16[5] = { 'u', 'c', 'i', 0xF3, 'n' };
-static const symbol s_5_17[3] = { 'i', 'c', 'o' };
-static const symbol s_5_18[4] = { 'i', 's', 'm', 'o' };
-static const symbol s_5_19[3] = { 'o', 's', 'o' };
-static const symbol s_5_20[6] = { 'a', 'm', 'e', 'n', 't', 'o' };
-static const symbol s_5_21[6] = { 'i', 'm', 'e', 'n', 't', 'o' };
-static const symbol s_5_22[3] = { 'i', 'v', 'o' };
-static const symbol s_5_23[5] = { 'a', 0xE7, 'a', '~', 'o' };
+static const symbol s_5_16[3] = { 'i', 'c', 'o' };
+static const symbol s_5_17[4] = { 'i', 's', 'm', 'o' };
+static const symbol s_5_18[3] = { 'o', 's', 'o' };
+static const symbol s_5_19[6] = { 'a', 'm', 'e', 'n', 't', 'o' };
+static const symbol s_5_20[6] = { 'i', 'm', 'e', 'n', 't', 'o' };
+static const symbol s_5_21[3] = { 'i', 'v', 'o' };
+static const symbol s_5_22[5] = { 'a', 0xE7, 'a', '~', 'o' };
+static const symbol s_5_23[5] = { 'u', 0xE7, 'a', '~', 'o' };
 static const symbol s_5_24[4] = { 'a', 'd', 'o', 'r' };
 static const symbol s_5_25[4] = { 'i', 'c', 'a', 's' };
 static const symbol s_5_26[6] = { 0xEA, 'n', 'c', 'i', 'a', 's' };
-static const symbol s_5_27[4] = { 'i', 'r', 'a', 's' };
-static const symbol s_5_28[6] = { 'a', 'd', 'o', 'r', 'a', 's' };
-static const symbol s_5_29[4] = { 'o', 's', 'a', 's' };
-static const symbol s_5_30[5] = { 'i', 's', 't', 'a', 's' };
-static const symbol s_5_31[4] = { 'i', 'v', 'a', 's' };
-static const symbol s_5_32[4] = { 'e', 'z', 'a', 's' };
-static const symbol s_5_33[6] = { 'l', 'o', 'g', 0xED, 'a', 's' };
+static const symbol s_5_27[6] = { 'l', 'o', 'g', 'i', 'a', 's' };
+static const symbol s_5_28[4] = { 'i', 'r', 'a', 's' };
+static const symbol s_5_29[6] = { 'a', 'd', 'o', 'r', 'a', 's' };
+static const symbol s_5_30[4] = { 'o', 's', 'a', 's' };
+static const symbol s_5_31[5] = { 'i', 's', 't', 'a', 's' };
+static const symbol s_5_32[4] = { 'i', 'v', 'a', 's' };
+static const symbol s_5_33[4] = { 'e', 'z', 'a', 's' };
 static const symbol s_5_34[6] = { 'i', 'd', 'a', 'd', 'e', 's' };
-static const symbol s_5_35[7] = { 'u', 'c', 'i', 'o', 'n', 'e', 's' };
-static const symbol s_5_36[6] = { 'a', 'd', 'o', 'r', 'e', 's' };
-static const symbol s_5_37[5] = { 'a', 'n', 't', 'e', 's' };
-static const symbol s_5_38[6] = { 'a', 0xE7, 'o', '~', 'e', 's' };
+static const symbol s_5_35[6] = { 'a', 'd', 'o', 'r', 'e', 's' };
+static const symbol s_5_36[5] = { 'a', 'n', 't', 'e', 's' };
+static const symbol s_5_37[6] = { 'a', 0xE7, 'o', '~', 'e', 's' };
+static const symbol s_5_38[6] = { 'u', 0xE7, 'o', '~', 'e', 's' };
 static const symbol s_5_39[4] = { 'i', 'c', 'o', 's' };
 static const symbol s_5_40[5] = { 'i', 's', 'm', 'o', 's' };
 static const symbol s_5_41[4] = { 'o', 's', 'o', 's' };
@@ -138,42 +138,42 @@ static const 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},
+/*  3 */ { 5, s_5_3, -1, 2, 0},
+/*  4 */ { 3, s_5_4, -1, 9, 0},
+/*  5 */ { 5, s_5_5, -1, 1, 0},
+/*  6 */ { 3, s_5_6, -1, 1, 0},
+/*  7 */ { 4, s_5_7, -1, 1, 0},
+/*  8 */ { 3, s_5_8, -1, 8, 0},
+/*  9 */ { 3, s_5_9, -1, 1, 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},
+/* 16 */ { 3, s_5_16, -1, 1, 0},
+/* 17 */ { 4, s_5_17, -1, 1, 0},
+/* 18 */ { 3, s_5_18, -1, 1, 0},
+/* 19 */ { 6, 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},
+/* 21 */ { 3, s_5_21, -1, 8, 0},
+/* 22 */ { 5, s_5_22, -1, 1, 0},
+/* 23 */ { 5, s_5_23, -1, 3, 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},
+/* 27 */ { 6, s_5_27, -1, 2, 0},
+/* 28 */ { 4, s_5_28, -1, 9, 0},
+/* 29 */ { 6, s_5_29, -1, 1, 0},
+/* 30 */ { 4, s_5_30, -1, 1, 0},
+/* 31 */ { 5, s_5_31, -1, 1, 0},
+/* 32 */ { 4, s_5_32, -1, 8, 0},
+/* 33 */ { 4, s_5_33, -1, 1, 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},
+/* 35 */ { 6, s_5_35, -1, 1, 0},
+/* 36 */ { 5, s_5_36, -1, 1, 0},
+/* 37 */ { 6, s_5_37, -1, 1, 0},
+/* 38 */ { 6, s_5_38, -1, 3, 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},
@@ -470,27 +470,19 @@ static const symbol s_5[] = { 'u' };
 static const symbol s_6[] = { 'e', 'n', 't', 'e' };
 static const symbol s_7[] = { 'a', 't' };
 static const symbol s_8[] = { 'a', 't' };
-static const symbol s_9[] = { 'e' };
-static const symbol s_10[] = { 'i', 'r' };
-static const symbol s_11[] = { 'u' };
-static const symbol s_12[] = { 'g' };
-static const symbol s_13[] = { 'i' };
-static const symbol s_14[] = { 'c' };
-static const symbol s_15[] = { 'c' };
-static const symbol s_16[] = { 'i' };
-static const symbol s_17[] = { 'c' };
+static const symbol s_9[] = { 'i', 'r' };
+static const symbol s_10[] = { 'c' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 36 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 37 */
-        if (z->c >= z->l || (z->p[z->c + 0] != 227 && z->p[z->c + 0] != 245)) among_var = 3; else
-        among_var = find_among(z, a_0, 3); /* substring, line 37 */
+        if (z->c >= z->l || (z->p[z->c + 0] != 227 && z->p[z->c + 0] != 245)) among_var = 3; else /* substring, line 37 */
+        among_var = find_among(z, a_0, 3);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 37 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 37 */
             case 1:
                 {   int ret = slice_from_s(z, 2, s_0); /* <-, line 38 */
                     if (ret < 0) return ret;
@@ -514,15 +506,15 @@ static int r_prelude(struct SN_env * z) {
     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;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 46 */
+    z->I[1] = z->l; /* $p1 = <integer expression>, line 47 */
+    z->I[2] = z->l; /* $p2 = <integer expression>, line 48 */
     {   int c1 = z->c; /* do, line 50 */
         {   int c2 = z->c; /* or, line 52 */
-            if (in_grouping(z, g_v, 97, 250, 0)) goto lab2;
+            if (in_grouping(z, g_v, 97, 250, 0)) goto lab2; /* grouping v, line 51 */
             {   int c3 = z->c; /* or, line 51 */
-                if (out_grouping(z, g_v, 97, 250, 0)) goto lab4;
+                if (out_grouping(z, g_v, 97, 250, 0)) goto lab4; /* non v, line 51 */
                 {    /* gopast */ /* grouping v, line 51 */
                     int ret = out_grouping(z, g_v, 97, 250, 1);
                     if (ret < 0) goto lab4;
@@ -531,7 +523,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab3;
             lab4:
                 z->c = c3;
-                if (in_grouping(z, g_v, 97, 250, 0)) goto lab2;
+                if (in_grouping(z, g_v, 97, 250, 0)) goto lab2; /* grouping v, line 51 */
                 {    /* gopast */ /* non v, line 51 */
                     int ret = in_grouping(z, g_v, 97, 250, 1);
                     if (ret < 0) goto lab2;
@@ -542,9 +534,9 @@ static int r_mark_regions(struct SN_env * z) {
             goto lab1;
         lab2:
             z->c = c2;
-            if (out_grouping(z, g_v, 97, 250, 0)) goto lab0;
+            if (out_grouping(z, g_v, 97, 250, 0)) goto lab0; /* non v, line 53 */
             {   int c4 = z->c; /* or, line 53 */
-                if (out_grouping(z, g_v, 97, 250, 0)) goto lab6;
+                if (out_grouping(z, g_v, 97, 250, 0)) goto lab6; /* non v, line 53 */
                 {    /* gopast */ /* grouping v, line 53 */
                     int ret = out_grouping(z, g_v, 97, 250, 1);
                     if (ret < 0) goto lab6;
@@ -553,7 +545,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab5;
             lab6:
                 z->c = c4;
-                if (in_grouping(z, g_v, 97, 250, 0)) goto lab0;
+                if (in_grouping(z, g_v, 97, 250, 0)) goto lab0; /* grouping v, line 53 */
                 if (z->c >= z->l) goto lab0;
                 z->c++; /* next, line 53 */
             }
@@ -594,17 +586,16 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 62 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 63 */
-        if (z->c + 1 >= z->l || z->p[z->c + 1] != 126) among_var = 3; else
-        among_var = find_among(z, a_1, 3); /* substring, line 63 */
+        if (z->c + 1 >= z->l || z->p[z->c + 1] != 126) among_var = 3; else /* substring, line 63 */
+        among_var = find_among(z, a_1, 3);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 63 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 63 */
             case 1:
                 {   int ret = slice_from_s(z, 1, s_2); /* <-, line 64 */
                     if (ret < 0) return ret;
@@ -628,95 +619,88 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_RV(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_RV(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 72 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 73 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[2] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[2] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 74 */
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 77 */
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((839714 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_5, 45); /* substring, line 77 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((823330 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 77 */
+    among_var = find_among_b(z, a_5, 45);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 77 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 77 */
         case 1:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 93 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 93 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R2(z); /* call R2, line 98 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R2(z); /* call R2, line 102 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R2(z); /* call R2, line 106 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R1(z); /* call R1, line 110 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 110 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 111 */
+            {   int m1 = z->l - z->c; (void)m1; /* try, line 111 */
                 z->ket = z->c; /* [, line 112 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718616 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab0; }
-                among_var = find_among_b(z, a_2, 4); /* substring, line 112 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab0; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718616 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m1; goto lab0; } /* substring, line 112 */
+                among_var = find_among_b(z, a_2, 4);
+                if (!(among_var)) { z->c = z->l - m1; goto lab0; }
                 z->bra = z->c; /* ], line 112 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call R2, line 112 */
+                {   int ret = r_R2(z); /* call R2, line 112 */
+                    if (ret == 0) { z->c = z->l - m1; goto lab0; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 112 */
                     if (ret < 0) return ret;
                 }
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab0; }
+                switch (among_var) { /* among, line 112 */
                     case 1:
                         z->ket = z->c; /* [, line 113 */
-                        if (!(eq_s_b(z, 2, s_7))) { z->c = z->l - m_keep; goto lab0; }
+                        if (!(eq_s_b(z, 2, s_7))) { z->c = z->l - m1; goto lab0; } /* literal, line 113 */
                         z->bra = z->c; /* ], line 113 */
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call R2, line 113 */
+                        {   int ret = r_R2(z); /* call R2, line 113 */
+                            if (ret == 0) { z->c = z->l - m1; goto lab0; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 113 */
@@ -729,79 +713,64 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 6:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 122 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 122 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 122 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 123 */
+            {   int m2 = z->l - z->c; (void)m2; /* try, line 123 */
                 z->ket = z->c; /* [, line 124 */
-                if (z->c - 3 <= z->lb || (z->p[z->c - 1] != 101 && z->p[z->c - 1] != 108)) { z->c = z->l - m_keep; goto lab1; }
-                among_var = find_among_b(z, a_3, 3); /* substring, line 124 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab1; }
+                if (z->c - 3 <= z->lb || (z->p[z->c - 1] != 101 && z->p[z->c - 1] != 108)) { z->c = z->l - m2; goto lab1; } /* substring, line 124 */
+                if (!(find_among_b(z, a_3, 3))) { z->c = z->l - m2; goto lab1; }
                 z->bra = z->c; /* ], line 124 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab1; }
-                    case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call R2, line 127 */
-                            if (ret < 0) return ret;
-                        }
-                        {   int ret = slice_del(z); /* delete, line 127 */
-                            if (ret < 0) return ret;
-                        }
-                        break;
+                {   int ret = r_R2(z); /* call R2, line 127 */
+                    if (ret == 0) { z->c = z->l - m2; goto lab1; }
+                    if (ret < 0) return ret;
+                }
+                {   int ret = slice_del(z); /* delete, line 127 */
+                    if (ret < 0) return ret;
                 }
             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 = r_R2(z); /* call R2, line 134 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 134 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 135 */
+            {   int m3 = z->l - z->c; (void)m3; /* try, line 135 */
                 z->ket = z->c; /* [, line 136 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab2; }
-                among_var = find_among_b(z, a_4, 3); /* substring, line 136 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab2; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m3; goto lab2; } /* substring, line 136 */
+                if (!(find_among_b(z, a_4, 3))) { z->c = z->l - m3; goto lab2; }
                 z->bra = z->c; /* ], line 136 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab2; }
-                    case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab2; } /* call R2, line 139 */
-                            if (ret < 0) return ret;
-                        }
-                        {   int ret = slice_del(z); /* delete, line 139 */
-                            if (ret < 0) return ret;
-                        }
-                        break;
+                {   int ret = r_R2(z); /* call R2, line 139 */
+                    if (ret == 0) { z->c = z->l - m3; goto lab2; }
+                    if (ret < 0) return ret;
+                }
+                {   int ret = slice_del(z); /* delete, line 139 */
+                    if (ret < 0) return ret;
                 }
             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 = r_R2(z); /* call R2, line 146 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 146 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 147 */
+            {   int m4 = z->l - z->c; (void)m4; /* try, line 147 */
                 z->ket = z->c; /* [, line 148 */
-                if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m_keep; goto lab3; }
+                if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m4; goto lab3; } /* literal, line 148 */
                 z->bra = z->c; /* ], line 148 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 148 */
+                {   int ret = r_R2(z); /* call R2, line 148 */
+                    if (ret == 0) { z->c = z->l - m4; goto lab3; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 148 */
@@ -812,12 +781,12 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 9:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 153 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 153 */
+                if (ret <= 0) return ret;
             }
-            if (!(eq_s_b(z, 1, s_9))) return 0;
-            {   int ret = slice_from_s(z, 2, s_10); /* <-, line 154 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'e') return 0; /* literal, line 153 */
+            z->c--;
+            {   int ret = slice_from_s(z, 2, s_9); /* <-, line 154 */
                 if (ret < 0) return ret;
             }
             break;
@@ -825,97 +794,81 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_verb_suffix(struct SN_env * z) {
-    int among_var;
-    {   int mlimit; /* setlimit, line 159 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_verb_suffix(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 159 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 159 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 160 */
-        among_var = find_among_b(z, a_6, 120); /* substring, line 160 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(find_among_b(z, a_6, 120))) { z->lb = mlimit1; return 0; } /* substring, line 160 */
         z->bra = z->c; /* ], line 160 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
-            case 1:
-                {   int ret = slice_del(z); /* delete, line 179 */
-                    if (ret < 0) return ret;
-                }
-                break;
+        {   int ret = slice_del(z); /* delete, line 179 */
+            if (ret < 0) return ret;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_residual_suffix(struct SN_env * z) {
-    int among_var;
+static int r_residual_suffix(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 184 */
-    among_var = find_among_b(z, a_7, 7); /* substring, line 184 */
-    if (!(among_var)) return 0;
+    if (!(find_among_b(z, a_7, 7))) return 0; /* substring, line 184 */
     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 = slice_del(z); /* delete, line 187 */
-                if (ret < 0) return ret;
-            }
-            break;
+    {   int ret = r_RV(z); /* call RV, line 187 */
+        if (ret <= 0) return ret;
+    }
+    {   int ret = slice_del(z); /* delete, line 187 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_residual_form(struct SN_env * z) {
+static int r_residual_form(struct SN_env * z) { /* backwardmode */
     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;
+    switch (among_var) { /* among, line 192 */
         case 1:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 194 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 194 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 194 */
                 if (ret < 0) return ret;
             }
             z->ket = z->c; /* [, line 194 */
             {   int m1 = z->l - z->c; (void)m1; /* or, line 194 */
-                if (!(eq_s_b(z, 1, s_11))) goto lab1;
+                if (z->c <= z->lb || z->p[z->c - 1] != 'u') goto lab1; /* literal, line 194 */
+                z->c--;
                 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;
+                {   int m_test2 = z->l - z->c; /* test, line 194 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'g') goto lab1; /* literal, line 194 */
+                    z->c--;
+                    z->c = z->l - m_test2;
                 }
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                if (!(eq_s_b(z, 1, s_13))) return 0;
+                if (z->c <= z->lb || z->p[z->c - 1] != 'i') return 0; /* literal, line 195 */
+                z->c--;
                 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;
+                {   int m_test3 = z->l - z->c; /* test, line 195 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'c') return 0; /* literal, line 195 */
+                    z->c--;
+                    z->c = z->l - m_test3;
                 }
             }
         lab0:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 195 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 195 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 195 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 1, s_15); /* <-, line 196 */
+            {   int ret = slice_from_s(z, 1, s_10); /* <-, line 196 */
                 if (ret < 0) return ret;
             }
             break;
@@ -923,77 +876,77 @@ static int r_residual_form(struct SN_env * z) {
     return 1;
 }
 
-extern int portuguese_ISO_8859_1_stem(struct SN_env * z) {
+extern int portuguese_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 202 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 202 */
+        {   int ret = r_prelude(z); /* call prelude, line 202 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    {   int c2 = 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 = c2;
+    /* do, line 203 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 203 */
+        if (ret == 0) goto lab1;
+        if (ret < 0) return ret;
     }
+lab1:
     z->lb = z->c; z->c = z->l; /* backwards, line 204 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 205 */
-        {   int m4 = z->l - z->c; (void)m4; /* or, line 209 */
-            {   int m5 = z->l - z->c; (void)m5; /* and, line 207 */
-                {   int m6 = z->l - z->c; (void)m6; /* or, line 206 */
-                    {   int ret = r_standard_suffix(z);
-                        if (ret == 0) goto lab6; /* call standard_suffix, line 206 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 205 */
+        {   int m3 = z->l - z->c; (void)m3; /* or, line 209 */
+            {   int m4 = z->l - z->c; (void)m4; /* and, line 207 */
+                {   int m5 = z->l - z->c; (void)m5; /* or, line 206 */
+                    {   int ret = r_standard_suffix(z); /* call standard_suffix, line 206 */
+                        if (ret == 0) goto lab6;
                         if (ret < 0) return ret;
                     }
                     goto lab5;
                 lab6:
-                    z->c = z->l - m6;
-                    {   int ret = r_verb_suffix(z);
-                        if (ret == 0) goto lab4; /* call verb_suffix, line 206 */
+                    z->c = z->l - m5;
+                    {   int ret = r_verb_suffix(z); /* call verb_suffix, line 206 */
+                        if (ret == 0) goto lab4;
                         if (ret < 0) return ret;
                     }
                 }
             lab5:
-                z->c = z->l - m5;
-                {   int m7 = z->l - z->c; (void)m7; /* do, line 207 */
+                z->c = z->l - m4;
+                {   int m6 = z->l - z->c; (void)m6; /* do, line 207 */
                     z->ket = z->c; /* [, line 207 */
-                    if (!(eq_s_b(z, 1, s_16))) goto lab7;
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'i') goto lab7; /* literal, line 207 */
+                    z->c--;
                     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 m_test7 = z->l - z->c; /* test, line 207 */
+                        if (z->c <= z->lb || z->p[z->c - 1] != 'c') goto lab7; /* literal, line 207 */
+                        z->c--;
+                        z->c = z->l - m_test7;
                     }
-                    {   int ret = r_RV(z);
-                        if (ret == 0) goto lab7; /* call RV, line 207 */
+                    {   int ret = r_RV(z); /* call RV, line 207 */
+                        if (ret == 0) goto lab7;
                         if (ret < 0) return ret;
                     }
                     {   int ret = slice_del(z); /* delete, line 207 */
                         if (ret < 0) return ret;
                     }
                 lab7:
-                    z->c = z->l - m7;
+                    z->c = z->l - m6;
                 }
             }
             goto lab3;
         lab4:
-            z->c = z->l - m4;
-            {   int ret = r_residual_suffix(z);
-                if (ret == 0) goto lab2; /* call residual_suffix, line 209 */
+            z->c = z->l - m3;
+            {   int ret = r_residual_suffix(z); /* call residual_suffix, line 209 */
+                if (ret == 0) goto lab2;
                 if (ret < 0) return ret;
             }
         }
     lab3:
     lab2:
-        z->c = z->l - m3;
+        z->c = z->l - m2;
     }
     {   int m8 = z->l - z->c; (void)m8; /* do, line 211 */
-        {   int ret = r_residual_form(z);
-            if (ret == 0) goto lab8; /* call residual_form, line 211 */
+        {   int ret = r_residual_form(z); /* call residual_form, line 211 */
+            if (ret == 0) goto lab8;
             if (ret < 0) return ret;
         }
     lab8:
@@ -1001,8 +954,8 @@ extern int portuguese_ISO_8859_1_stem(struct SN_env * z) {
     }
     z->c = z->lb;
     {   int c9 = z->c; /* do, line 213 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab9; /* call postlude, line 213 */
+        {   int ret = r_postlude(z); /* call postlude, line 213 */
+            if (ret == 0) goto lab9;
             if (ret < 0) return ret;
         }
     lab9:
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_spanish.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_spanish.c
index 27f26e7865..c2f101df3a 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_spanish.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_spanish.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -497,28 +497,22 @@ static const symbol s_6[] = { 'a', 'n', 'd', 'o' };
 static const symbol s_7[] = { 'a', 'r' };
 static const symbol s_8[] = { 'e', 'r' };
 static const symbol s_9[] = { 'i', 'r' };
-static const symbol s_10[] = { 'u' };
-static const symbol s_11[] = { 'i', 'c' };
-static const symbol s_12[] = { 'l', 'o', 'g' };
-static const symbol s_13[] = { 'u' };
-static const symbol s_14[] = { 'e', 'n', 't', 'e' };
+static const symbol s_10[] = { 'i', 'c' };
+static const symbol s_11[] = { 'l', 'o', 'g' };
+static const symbol s_12[] = { 'u' };
+static const symbol s_13[] = { 'e', 'n', 't', 'e' };
+static const symbol s_14[] = { 'a', 't' };
 static const symbol s_15[] = { 'a', 't' };
-static const symbol s_16[] = { 'a', 't' };
-static const symbol s_17[] = { 'u' };
-static const symbol s_18[] = { 'u' };
-static const symbol s_19[] = { 'g' };
-static const symbol s_20[] = { 'u' };
-static const 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;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 33 */
+    z->I[1] = z->l; /* $p1 = <integer expression>, line 34 */
+    z->I[2] = z->l; /* $p2 = <integer expression>, line 35 */
     {   int c1 = z->c; /* do, line 37 */
         {   int c2 = z->c; /* or, line 39 */
-            if (in_grouping(z, g_v, 97, 252, 0)) goto lab2;
+            if (in_grouping(z, g_v, 97, 252, 0)) goto lab2; /* grouping v, line 38 */
             {   int c3 = z->c; /* or, line 38 */
-                if (out_grouping(z, g_v, 97, 252, 0)) goto lab4;
+                if (out_grouping(z, g_v, 97, 252, 0)) goto lab4; /* non v, line 38 */
                 {    /* gopast */ /* grouping v, line 38 */
                     int ret = out_grouping(z, g_v, 97, 252, 1);
                     if (ret < 0) goto lab4;
@@ -527,7 +521,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab3;
             lab4:
                 z->c = c3;
-                if (in_grouping(z, g_v, 97, 252, 0)) goto lab2;
+                if (in_grouping(z, g_v, 97, 252, 0)) goto lab2; /* grouping v, line 38 */
                 {    /* gopast */ /* non v, line 38 */
                     int ret = in_grouping(z, g_v, 97, 252, 1);
                     if (ret < 0) goto lab2;
@@ -538,9 +532,9 @@ static int r_mark_regions(struct SN_env * z) {
             goto lab1;
         lab2:
             z->c = c2;
-            if (out_grouping(z, g_v, 97, 252, 0)) goto lab0;
+            if (out_grouping(z, g_v, 97, 252, 0)) goto lab0; /* non v, line 40 */
             {   int c4 = z->c; /* or, line 40 */
-                if (out_grouping(z, g_v, 97, 252, 0)) goto lab6;
+                if (out_grouping(z, g_v, 97, 252, 0)) goto lab6; /* non v, line 40 */
                 {    /* gopast */ /* grouping v, line 40 */
                     int ret = out_grouping(z, g_v, 97, 252, 1);
                     if (ret < 0) goto lab6;
@@ -549,7 +543,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab5;
             lab6:
                 z->c = c4;
-                if (in_grouping(z, g_v, 97, 252, 0)) goto lab0;
+                if (in_grouping(z, g_v, 97, 252, 0)) goto lab0; /* grouping v, line 40 */
                 if (z->c >= z->l) goto lab0;
                 z->c++; /* next, line 40 */
             }
@@ -590,17 +584,16 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 49 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 50 */
-        if (z->c >= z->l || z->p[z->c + 0] >> 5 != 7 || !((67641858 >> (z->p[z->c + 0] & 0x1f)) & 1)) among_var = 6; else
-        among_var = find_among(z, a_0, 6); /* substring, line 50 */
+        if (z->c >= z->l || z->p[z->c + 0] >> 5 != 7 || !((67641858 >> (z->p[z->c + 0] & 0x1f)) & 1)) among_var = 6; else /* substring, line 50 */
+        among_var = find_among(z, a_0, 6);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 50 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 50 */
             case 1:
                 {   int ret = slice_from_s(z, 1, s_0); /* <-, line 51 */
                     if (ret < 0) return ret;
@@ -639,36 +632,34 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_RV(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_RV(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 63 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 64 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[2] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[2] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 65 */
     return 1;
 }
 
-static int r_attached_pronoun(struct SN_env * z) {
+static int r_attached_pronoun(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 68 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((557090 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    if (!(find_among_b(z, a_1, 13))) return 0; /* substring, line 68 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((557090 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 68 */
+    if (!(find_among_b(z, a_1, 13))) return 0;
     z->bra = z->c; /* ], line 68 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 111 && z->p[z->c - 1] != 114)) return 0;
-    among_var = find_among_b(z, a_2, 11); /* substring, line 72 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 111 && z->p[z->c - 1] != 114)) return 0; /* substring, line 72 */
+    among_var = find_among_b(z, a_2, 11);
     if (!(among_var)) return 0;
-    {   int ret = r_RV(z);
-        if (ret == 0) return 0; /* call RV, line 72 */
-        if (ret < 0) return ret;
+    {   int ret = r_RV(z); /* call RV, line 72 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 72 */
         case 1:
             z->bra = z->c; /* ], line 73 */
             {   int ret = slice_from_s(z, 5, s_5); /* <-, line 73 */
@@ -705,7 +696,8 @@ static int r_attached_pronoun(struct SN_env * z) {
             }
             break;
         case 7:
-            if (!(eq_s_b(z, 1, s_10))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'u') return 0; /* literal, line 82 */
+            z->c--;
             {   int ret = slice_del(z); /* delete, line 82 */
                 if (ret < 0) return ret;
             }
@@ -714,38 +706,35 @@ static int r_attached_pronoun(struct SN_env * z) {
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 87 */
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((835634 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_6, 46); /* substring, line 87 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((835634 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 87 */
+    among_var = find_among_b(z, a_6, 46);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 87 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 87 */
         case 1:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 99 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 99 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R2(z); /* call R2, line 105 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 105 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 106 */
+            {   int m1 = z->l - z->c; (void)m1; /* try, line 106 */
                 z->ket = z->c; /* [, line 106 */
-                if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m_keep; goto lab0; }
+                if (!(eq_s_b(z, 2, s_10))) { z->c = z->l - m1; goto lab0; } /* literal, line 106 */
                 z->bra = z->c; /* ], line 106 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call R2, line 106 */
+                {   int ret = r_R2(z); /* call R2, line 106 */
+                    if (ret == 0) { z->c = z->l - m1; goto lab0; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 106 */
@@ -756,61 +745,56 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 3:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 111 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 111 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_12); /* <-, line 111 */
+            {   int ret = slice_from_s(z, 3, s_11); /* <-, 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 = r_R2(z); /* call R2, line 115 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 1, s_13); /* <-, line 115 */
+            {   int ret = slice_from_s(z, 1, s_12); /* <-, 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 = r_R2(z); /* call R2, line 119 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 4, s_14); /* <-, line 119 */
+            {   int ret = slice_from_s(z, 4, s_13); /* <-, 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 = r_R1(z); /* call R1, line 123 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 123 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 124 */
+            {   int m2 = z->l - z->c; (void)m2; /* try, line 124 */
                 z->ket = z->c; /* [, line 125 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718616 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab1; }
-                among_var = find_among_b(z, a_3, 4); /* substring, line 125 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab1; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718616 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m2; goto lab1; } /* substring, line 125 */
+                among_var = find_among_b(z, a_3, 4);
+                if (!(among_var)) { z->c = z->l - m2; goto lab1; }
                 z->bra = z->c; /* ], line 125 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call R2, line 125 */
+                {   int ret = r_R2(z); /* call R2, line 125 */
+                    if (ret == 0) { z->c = z->l - m2; goto lab1; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 125 */
                     if (ret < 0) return ret;
                 }
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab1; }
+                switch (among_var) { /* among, line 125 */
                     case 1:
                         z->ket = z->c; /* [, line 126 */
-                        if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m_keep; goto lab1; }
+                        if (!(eq_s_b(z, 2, s_14))) { z->c = z->l - m2; goto lab1; } /* literal, line 126 */
                         z->bra = z->c; /* ], line 126 */
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call R2, line 126 */
+                        {   int ret = r_R2(z); /* call R2, line 126 */
+                            if (ret == 0) { z->c = z->l - m2; goto lab1; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 126 */
@@ -823,79 +807,64 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 7:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 135 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 135 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 135 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 136 */
+            {   int m3 = z->l - z->c; (void)m3; /* try, line 136 */
                 z->ket = z->c; /* [, line 137 */
-                if (z->c - 3 <= z->lb || z->p[z->c - 1] != 101) { z->c = z->l - m_keep; goto lab2; }
-                among_var = find_among_b(z, a_4, 3); /* substring, line 137 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab2; }
+                if (z->c - 3 <= z->lb || z->p[z->c - 1] != 101) { z->c = z->l - m3; goto lab2; } /* substring, line 137 */
+                if (!(find_among_b(z, a_4, 3))) { z->c = z->l - m3; goto lab2; }
                 z->bra = z->c; /* ], line 137 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab2; }
-                    case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab2; } /* call R2, line 140 */
-                            if (ret < 0) return ret;
-                        }
-                        {   int ret = slice_del(z); /* delete, line 140 */
-                            if (ret < 0) return ret;
-                        }
-                        break;
+                {   int ret = r_R2(z); /* call R2, line 140 */
+                    if (ret == 0) { z->c = z->l - m3; goto lab2; }
+                    if (ret < 0) return ret;
+                }
+                {   int ret = slice_del(z); /* delete, line 140 */
+                    if (ret < 0) return ret;
                 }
             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 = r_R2(z); /* call R2, line 147 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 147 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 148 */
+            {   int m4 = z->l - z->c; (void)m4; /* try, line 148 */
                 z->ket = z->c; /* [, line 149 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab3; }
-                among_var = find_among_b(z, a_5, 3); /* substring, line 149 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab3; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m4; goto lab3; } /* substring, line 149 */
+                if (!(find_among_b(z, a_5, 3))) { z->c = z->l - m4; goto lab3; }
                 z->bra = z->c; /* ], line 149 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab3; }
-                    case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 152 */
-                            if (ret < 0) return ret;
-                        }
-                        {   int ret = slice_del(z); /* delete, line 152 */
-                            if (ret < 0) return ret;
-                        }
-                        break;
+                {   int ret = r_R2(z); /* call R2, line 152 */
+                    if (ret == 0) { z->c = z->l - m4; goto lab3; }
+                    if (ret < 0) return ret;
+                }
+                {   int ret = slice_del(z); /* delete, line 152 */
+                    if (ret < 0) return ret;
                 }
             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 = r_R2(z); /* call R2, line 159 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 159 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 160 */
+            {   int m5 = z->l - z->c; (void)m5; /* try, line 160 */
                 z->ket = z->c; /* [, line 161 */
-                if (!(eq_s_b(z, 2, s_16))) { z->c = z->l - m_keep; goto lab4; }
+                if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m5; goto lab4; } /* literal, line 161 */
                 z->bra = z->c; /* ], line 161 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab4; } /* call R2, line 161 */
+                {   int ret = r_R2(z); /* call R2, line 161 */
+                    if (ret == 0) { z->c = z->l - m5; goto lab4; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 161 */
@@ -909,54 +878,45 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_y_verb_suffix(struct SN_env * z) {
-    int among_var;
-    {   int mlimit; /* setlimit, line 168 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_y_verb_suffix(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 168 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 168 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 168 */
-        among_var = find_among_b(z, a_7, 12); /* substring, line 168 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(find_among_b(z, a_7, 12))) { z->lb = mlimit1; return 0; } /* substring, line 168 */
         z->bra = z->c; /* ], line 168 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            if (!(eq_s_b(z, 1, s_17))) return 0;
-            {   int ret = slice_del(z); /* delete, line 171 */
-                if (ret < 0) return ret;
-            }
-            break;
+    if (z->c <= z->lb || z->p[z->c - 1] != 'u') return 0; /* literal, line 171 */
+    z->c--;
+    {   int ret = slice_del(z); /* delete, line 171 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_verb_suffix(struct SN_env * z) {
+static int r_verb_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 176 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 176 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 176 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 176 */
         among_var = find_among_b(z, a_8, 96); /* substring, line 176 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 176 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 176 */
         case 1:
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 179 */
-                if (!(eq_s_b(z, 1, s_18))) { z->c = z->l - m_keep; 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_keep; goto lab0; }
-                    z->c = z->l - m_test;
+            {   int m2 = z->l - z->c; (void)m2; /* try, line 179 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'u') { z->c = z->l - m2; goto lab0; } /* literal, line 179 */
+                z->c--;
+                {   int m_test3 = z->l - z->c; /* test, line 179 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'g') { z->c = z->l - m2; goto lab0; } /* literal, line 179 */
+                    z->c--;
+                    z->c = z->l - m_test3;
                 }
             lab0:
                 ;
@@ -975,41 +935,40 @@ static int r_verb_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_residual_suffix(struct SN_env * z) {
+static int r_residual_suffix(struct SN_env * z) { /* backwardmode */
     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;
+    switch (among_var) { /* among, line 205 */
         case 1:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 208 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 208 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_RV(z); /* call RV, line 210 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 210 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 210 */
+            {   int m1 = z->l - z->c; (void)m1; /* try, line 210 */
                 z->ket = z->c; /* [, line 210 */
-                if (!(eq_s_b(z, 1, s_20))) { z->c = z->l - m_keep; goto lab0; }
+                if (z->c <= z->lb || z->p[z->c - 1] != 'u') { z->c = z->l - m1; goto lab0; } /* literal, line 210 */
+                z->c--;
                 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_keep; goto lab0; }
-                    z->c = z->l - m_test;
+                {   int m_test2 = z->l - z->c; /* test, line 210 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'g') { z->c = z->l - m1; goto lab0; } /* literal, line 210 */
+                    z->c--;
+                    z->c = z->l - m_test2;
                 }
-                {   int ret = r_RV(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call RV, line 210 */
+                {   int ret = r_RV(z); /* call RV, line 210 */
+                    if (ret == 0) { z->c = z->l - m1; goto lab0; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 210 */
@@ -1023,66 +982,64 @@ static int r_residual_suffix(struct SN_env * z) {
     return 1;
 }
 
-extern int spanish_ISO_8859_1_stem(struct SN_env * z) {
-    {   int c1 = 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 = c1;
+extern int spanish_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
+    /* do, line 216 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 216 */
+        if (ret == 0) goto lab0;
+        if (ret < 0) return ret;
     }
+lab0:
     z->lb = z->c; z->c = z->l; /* backwards, line 217 */
 
-    {   int m2 = z->l - z->c; (void)m2; /* do, line 218 */
-        {   int ret = r_attached_pronoun(z);
-            if (ret == 0) goto lab1; /* call attached_pronoun, line 218 */
+    {   int m1 = z->l - z->c; (void)m1; /* do, line 218 */
+        {   int ret = r_attached_pronoun(z); /* call attached_pronoun, line 218 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
-        z->c = z->l - m2;
+        z->c = z->l - m1;
     }
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 219 */
-        {   int m4 = z->l - z->c; (void)m4; /* or, line 219 */
-            {   int ret = r_standard_suffix(z);
-                if (ret == 0) goto lab4; /* call standard_suffix, line 219 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 219 */
+        {   int m3 = z->l - z->c; (void)m3; /* or, line 219 */
+            {   int ret = r_standard_suffix(z); /* call standard_suffix, line 219 */
+                if (ret == 0) goto lab4;
                 if (ret < 0) return ret;
             }
             goto lab3;
         lab4:
-            z->c = z->l - m4;
-            {   int ret = r_y_verb_suffix(z);
-                if (ret == 0) goto lab5; /* call y_verb_suffix, line 220 */
+            z->c = z->l - m3;
+            {   int ret = r_y_verb_suffix(z); /* call y_verb_suffix, line 220 */
+                if (ret == 0) goto lab5;
                 if (ret < 0) return ret;
             }
             goto lab3;
         lab5:
-            z->c = z->l - m4;
-            {   int ret = r_verb_suffix(z);
-                if (ret == 0) goto lab2; /* call verb_suffix, line 221 */
+            z->c = z->l - m3;
+            {   int ret = r_verb_suffix(z); /* call verb_suffix, line 221 */
+                if (ret == 0) goto lab2;
                 if (ret < 0) return ret;
             }
         }
     lab3:
     lab2:
-        z->c = z->l - m3;
+        z->c = z->l - m2;
     }
-    {   int m5 = z->l - z->c; (void)m5; /* do, line 223 */
-        {   int ret = r_residual_suffix(z);
-            if (ret == 0) goto lab6; /* call residual_suffix, line 223 */
+    {   int m4 = z->l - z->c; (void)m4; /* do, line 223 */
+        {   int ret = r_residual_suffix(z); /* call residual_suffix, line 223 */
+            if (ret == 0) goto lab6;
             if (ret < 0) return ret;
         }
     lab6:
-        z->c = z->l - m5;
+        z->c = z->l - m4;
     }
     z->c = z->lb;
-    {   int c6 = z->c; /* do, line 225 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab7; /* call postlude, line 225 */
+    {   int c5 = z->c; /* do, line 225 */
+        {   int ret = r_postlude(z); /* call postlude, line 225 */
+            if (ret == 0) goto lab7;
             if (ret < 0) return ret;
         }
     lab7:
-        z->c = c6;
+        z->c = c5;
     }
     return 1;
 }
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_1_swedish.c b/src/backend/snowball/libstemmer/stem_ISO_8859_1_swedish.c
index f9bef1ada5..13be21762c 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_1_swedish.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_1_swedish.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -146,15 +146,15 @@ static const unsigned char g_s_ending[] = { 119, 127, 149 };
 static const symbol s_0[] = { 'l', 0xF6, 's' };
 static const 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 ret = z->c + 3;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 28 */
+    {   int c_test1 = z->c; /* test, line 29 */
+        {   int ret = z->c + 3; /* hop, line 29 */
             if (0 > ret || ret > z->l) return 0;
-            z->c = ret; /* hop, line 29 */
+            z->c = ret;
         }
         z->I[1] = z->c; /* setmark x, line 29 */
-        z->c = c_test;
+        z->c = c_test1;
     }
     if (out_grouping(z, g_v, 97, 246, 1) < 0) return 0; /* goto */ /* grouping v, line 30 */
     {    /* gopast */ /* non v, line 30 */
@@ -163,37 +163,34 @@ static int r_mark_regions(struct SN_env * z) {
         z->c += ret;
     }
     z->I[0] = z->c; /* setmark p1, line 30 */
-     /* try, line 31 */
-    if (!(z->I[0] < z->I[1])) goto lab0;
-    z->I[0] = z->I[1];
+    /* try, line 31 */
+    if (!(z->I[0] < z->I[1])) goto lab0; /* $(<integer expression> < <integer expression>), line 31 */
+    z->I[0] = z->I[1]; /* $p1 = <integer expression>, line 31 */
 lab0:
     return 1;
 }
 
-static int r_main_suffix(struct SN_env * z) {
+static int r_main_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 37 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 37 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 37 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 37 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851442 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_0, 37); /* substring, line 37 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851442 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 37 */
+        among_var = find_among_b(z, a_0, 37);
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 37 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 38 */
         case 1:
             {   int 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, 0)) return 0;
+            if (in_grouping_b(z, g_s_ending, 98, 121, 0)) return 0; /* grouping s_ending, line 46 */
             {   int ret = slice_del(z); /* delete, line 46 */
                 if (ret < 0) return ret;
             }
@@ -202,45 +199,40 @@ static int r_main_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_consonant_pair(struct SN_env * z) {
-    {   int mlimit; /* setlimit, line 50 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_consonant_pair(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 50 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 50 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         {   int m2 = z->l - z->c; (void)m2; /* and, line 52 */
-            if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1064976 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-            if (!(find_among_b(z, a_1, 7))) { z->lb = mlimit; return 0; } /* among, line 51 */
+            if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1064976 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* among, line 51 */
+            if (!(find_among_b(z, a_1, 7))) { z->lb = mlimit1; return 0; }
             z->c = z->l - m2;
             z->ket = z->c; /* [, line 52 */
-            if (z->c <= z->lb) { z->lb = mlimit; return 0; }
+            if (z->c <= z->lb) { z->lb = mlimit1; return 0; }
             z->c--; /* next, line 52 */
             z->bra = z->c; /* ], line 52 */
             {   int ret = slice_del(z); /* delete, line 52 */
                 if (ret < 0) return ret;
             }
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_other_suffix(struct SN_env * z) {
+static int r_other_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 55 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 55 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 55 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 56 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1572992 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_2, 5); /* substring, line 56 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1572992 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 56 */
+        among_var = find_among_b(z, a_2, 5);
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 56 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
+        switch (among_var) { /* among, line 56 */
             case 1:
                 {   int ret = slice_del(z); /* delete, line 57 */
                     if (ret < 0) return ret;
@@ -257,15 +249,15 @@ static int r_other_suffix(struct SN_env * z) {
                 }
                 break;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-extern int swedish_ISO_8859_1_stem(struct SN_env * z) {
+extern int swedish_ISO_8859_1_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 66 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab0; /* call mark_regions, line 66 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 66 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
@@ -274,24 +266,24 @@ extern int swedish_ISO_8859_1_stem(struct SN_env * z) {
     z->lb = z->c; z->c = z->l; /* backwards, line 67 */
 
     {   int m2 = z->l - z->c; (void)m2; /* do, line 68 */
-        {   int ret = r_main_suffix(z);
-            if (ret == 0) goto lab1; /* call main_suffix, line 68 */
+        {   int ret = r_main_suffix(z); /* call main_suffix, line 68 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
     {   int m3 = z->l - z->c; (void)m3; /* do, line 69 */
-        {   int ret = r_consonant_pair(z);
-            if (ret == 0) goto lab2; /* call consonant_pair, line 69 */
+        {   int ret = r_consonant_pair(z); /* call consonant_pair, line 69 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
         z->c = z->l - m3;
     }
     {   int m4 = z->l - z->c; (void)m4; /* do, line 70 */
-        {   int ret = r_other_suffix(z);
-            if (ret == 0) goto lab3; /* call other_suffix, line 70 */
+        {   int ret = r_other_suffix(z); /* call other_suffix, line 70 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_2_hungarian.c b/src/backend/snowball/libstemmer/stem_ISO_8859_2_hungarian.c
new file mode 100644
index 0000000000..ae088a32f7
--- /dev/null
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_2_hungarian.c
@@ -0,0 +1,885 @@
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
+
+#include "header.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern int hungarian_ISO_8859_2_stem(struct SN_env * z);
+#ifdef __cplusplus
+}
+#endif
+static int r_double(struct SN_env * z);
+static int r_undouble(struct SN_env * z);
+static int r_factive(struct SN_env * z);
+static int r_instrum(struct SN_env * z);
+static int r_plur_owner(struct SN_env * z);
+static int r_sing_owner(struct SN_env * z);
+static int r_owned(struct SN_env * z);
+static int r_plural(struct SN_env * z);
+static int r_case_other(struct SN_env * z);
+static int r_case_special(struct SN_env * z);
+static int r_case(struct SN_env * z);
+static int r_v_ending(struct SN_env * z);
+static int r_R1(struct SN_env * z);
+static int r_mark_regions(struct SN_env * z);
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+extern struct SN_env * hungarian_ISO_8859_2_create_env(void);
+extern void hungarian_ISO_8859_2_close_env(struct SN_env * z);
+
+
+#ifdef __cplusplus
+}
+#endif
+static const symbol s_0_0[2] = { 'c', 's' };
+static const symbol s_0_1[3] = { 'd', 'z', 's' };
+static const symbol s_0_2[2] = { 'g', 'y' };
+static const symbol s_0_3[2] = { 'l', 'y' };
+static const symbol s_0_4[2] = { 'n', 'y' };
+static const symbol s_0_5[2] = { 's', 'z' };
+static const symbol s_0_6[2] = { 't', 'y' };
+static const symbol s_0_7[2] = { 'z', 's' };
+
+static const struct among a_0[8] =
+{
+/*  0 */ { 2, s_0_0, -1, -1, 0},
+/*  1 */ { 3, s_0_1, -1, -1, 0},
+/*  2 */ { 2, s_0_2, -1, -1, 0},
+/*  3 */ { 2, s_0_3, -1, -1, 0},
+/*  4 */ { 2, s_0_4, -1, -1, 0},
+/*  5 */ { 2, s_0_5, -1, -1, 0},
+/*  6 */ { 2, s_0_6, -1, -1, 0},
+/*  7 */ { 2, s_0_7, -1, -1, 0}
+};
+
+static const symbol s_1_0[1] = { 0xE1 };
+static const symbol s_1_1[1] = { 0xE9 };
+
+static const struct among a_1[2] =
+{
+/*  0 */ { 1, s_1_0, -1, 1, 0},
+/*  1 */ { 1, s_1_1, -1, 2, 0}
+};
+
+static const symbol s_2_0[2] = { 'b', 'b' };
+static const symbol s_2_1[2] = { 'c', 'c' };
+static const symbol s_2_2[2] = { 'd', 'd' };
+static const symbol s_2_3[2] = { 'f', 'f' };
+static const symbol s_2_4[2] = { 'g', 'g' };
+static const symbol s_2_5[2] = { 'j', 'j' };
+static const symbol s_2_6[2] = { 'k', 'k' };
+static const symbol s_2_7[2] = { 'l', 'l' };
+static const symbol s_2_8[2] = { 'm', 'm' };
+static const symbol s_2_9[2] = { 'n', 'n' };
+static const symbol s_2_10[2] = { 'p', 'p' };
+static const symbol s_2_11[2] = { 'r', 'r' };
+static const symbol s_2_12[3] = { 'c', 'c', 's' };
+static const symbol s_2_13[2] = { 's', 's' };
+static const symbol s_2_14[3] = { 'z', 'z', 's' };
+static const symbol s_2_15[2] = { 't', 't' };
+static const symbol s_2_16[2] = { 'v', 'v' };
+static const symbol s_2_17[3] = { 'g', 'g', 'y' };
+static const symbol s_2_18[3] = { 'l', 'l', 'y' };
+static const symbol s_2_19[3] = { 'n', 'n', 'y' };
+static const symbol s_2_20[3] = { 't', 't', 'y' };
+static const symbol s_2_21[3] = { 's', 's', 'z' };
+static const symbol s_2_22[2] = { 'z', 'z' };
+
+static const struct among a_2[23] =
+{
+/*  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},
+/*  4 */ { 2, s_2_4, -1, -1, 0},
+/*  5 */ { 2, s_2_5, -1, -1, 0},
+/*  6 */ { 2, s_2_6, -1, -1, 0},
+/*  7 */ { 2, s_2_7, -1, -1, 0},
+/*  8 */ { 2, s_2_8, -1, -1, 0},
+/*  9 */ { 2, s_2_9, -1, -1, 0},
+/* 10 */ { 2, s_2_10, -1, -1, 0},
+/* 11 */ { 2, s_2_11, -1, -1, 0},
+/* 12 */ { 3, s_2_12, -1, -1, 0},
+/* 13 */ { 2, s_2_13, -1, -1, 0},
+/* 14 */ { 3, s_2_14, -1, -1, 0},
+/* 15 */ { 2, s_2_15, -1, -1, 0},
+/* 16 */ { 2, s_2_16, -1, -1, 0},
+/* 17 */ { 3, s_2_17, -1, -1, 0},
+/* 18 */ { 3, s_2_18, -1, -1, 0},
+/* 19 */ { 3, s_2_19, -1, -1, 0},
+/* 20 */ { 3, s_2_20, -1, -1, 0},
+/* 21 */ { 3, s_2_21, -1, -1, 0},
+/* 22 */ { 2, s_2_22, -1, -1, 0}
+};
+
+static const symbol s_3_0[2] = { 'a', 'l' };
+static const symbol s_3_1[2] = { 'e', 'l' };
+
+static const struct among a_3[2] =
+{
+/*  0 */ { 2, s_3_0, -1, 1, 0},
+/*  1 */ { 2, s_3_1, -1, 1, 0}
+};
+
+static const symbol s_4_0[2] = { 'b', 'a' };
+static const symbol s_4_1[2] = { 'r', 'a' };
+static const symbol s_4_2[2] = { 'b', 'e' };
+static const symbol s_4_3[2] = { 'r', 'e' };
+static const symbol s_4_4[2] = { 'i', 'g' };
+static const symbol s_4_5[3] = { 'n', 'a', 'k' };
+static const symbol s_4_6[3] = { 'n', 'e', 'k' };
+static const symbol s_4_7[3] = { 'v', 'a', 'l' };
+static const symbol s_4_8[3] = { 'v', 'e', 'l' };
+static const symbol s_4_9[2] = { 'u', 'l' };
+static const symbol s_4_10[3] = { 'n', 0xE1, 'l' };
+static const symbol s_4_11[3] = { 'n', 0xE9, 'l' };
+static const symbol s_4_12[3] = { 'b', 0xF3, 'l' };
+static const symbol s_4_13[3] = { 'r', 0xF3, 'l' };
+static const symbol s_4_14[3] = { 't', 0xF3, 'l' };
+static const symbol s_4_15[3] = { 'b', 0xF5, 'l' };
+static const symbol s_4_16[3] = { 'r', 0xF5, 'l' };
+static const symbol s_4_17[3] = { 't', 0xF5, 'l' };
+static const symbol s_4_18[2] = { 0xFC, 'l' };
+static const symbol s_4_19[1] = { 'n' };
+static const symbol s_4_20[2] = { 'a', 'n' };
+static const symbol s_4_21[3] = { 'b', 'a', 'n' };
+static const symbol s_4_22[2] = { 'e', 'n' };
+static const symbol s_4_23[3] = { 'b', 'e', 'n' };
+static const symbol s_4_24[6] = { 'k', 0xE9, 'p', 'p', 'e', 'n' };
+static const symbol s_4_25[2] = { 'o', 'n' };
+static const symbol s_4_26[2] = { 0xF6, 'n' };
+static const symbol s_4_27[4] = { 'k', 0xE9, 'p', 'p' };
+static const symbol s_4_28[3] = { 'k', 'o', 'r' };
+static const symbol s_4_29[1] = { 't' };
+static const symbol s_4_30[2] = { 'a', 't' };
+static const symbol s_4_31[2] = { 'e', 't' };
+static const symbol s_4_32[4] = { 'k', 0xE9, 'n', 't' };
+static const symbol s_4_33[6] = { 'a', 'n', 'k', 0xE9, 'n', 't' };
+static const symbol s_4_34[6] = { 'e', 'n', 'k', 0xE9, 'n', 't' };
+static const symbol s_4_35[6] = { 'o', 'n', 'k', 0xE9, 'n', 't' };
+static const symbol s_4_36[2] = { 'o', 't' };
+static const symbol s_4_37[3] = { 0xE9, 'r', 't' };
+static const symbol s_4_38[2] = { 0xF6, 't' };
+static const symbol s_4_39[3] = { 'h', 'e', 'z' };
+static const symbol s_4_40[3] = { 'h', 'o', 'z' };
+static const symbol s_4_41[3] = { 'h', 0xF6, 'z' };
+static const symbol s_4_42[2] = { 'v', 0xE1 };
+static const symbol s_4_43[2] = { 'v', 0xE9 };
+
+static const struct among a_4[44] =
+{
+/*  0 */ { 2, s_4_0, -1, -1, 0},
+/*  1 */ { 2, s_4_1, -1, -1, 0},
+/*  2 */ { 2, s_4_2, -1, -1, 0},
+/*  3 */ { 2, s_4_3, -1, -1, 0},
+/*  4 */ { 2, s_4_4, -1, -1, 0},
+/*  5 */ { 3, s_4_5, -1, -1, 0},
+/*  6 */ { 3, s_4_6, -1, -1, 0},
+/*  7 */ { 3, s_4_7, -1, -1, 0},
+/*  8 */ { 3, s_4_8, -1, -1, 0},
+/*  9 */ { 2, s_4_9, -1, -1, 0},
+/* 10 */ { 3, s_4_10, -1, -1, 0},
+/* 11 */ { 3, s_4_11, -1, -1, 0},
+/* 12 */ { 3, s_4_12, -1, -1, 0},
+/* 13 */ { 3, s_4_13, -1, -1, 0},
+/* 14 */ { 3, s_4_14, -1, -1, 0},
+/* 15 */ { 3, s_4_15, -1, -1, 0},
+/* 16 */ { 3, s_4_16, -1, -1, 0},
+/* 17 */ { 3, s_4_17, -1, -1, 0},
+/* 18 */ { 2, s_4_18, -1, -1, 0},
+/* 19 */ { 1, s_4_19, -1, -1, 0},
+/* 20 */ { 2, s_4_20, 19, -1, 0},
+/* 21 */ { 3, s_4_21, 20, -1, 0},
+/* 22 */ { 2, s_4_22, 19, -1, 0},
+/* 23 */ { 3, s_4_23, 22, -1, 0},
+/* 24 */ { 6, s_4_24, 22, -1, 0},
+/* 25 */ { 2, s_4_25, 19, -1, 0},
+/* 26 */ { 2, s_4_26, 19, -1, 0},
+/* 27 */ { 4, s_4_27, -1, -1, 0},
+/* 28 */ { 3, s_4_28, -1, -1, 0},
+/* 29 */ { 1, s_4_29, -1, -1, 0},
+/* 30 */ { 2, s_4_30, 29, -1, 0},
+/* 31 */ { 2, s_4_31, 29, -1, 0},
+/* 32 */ { 4, s_4_32, 29, -1, 0},
+/* 33 */ { 6, s_4_33, 32, -1, 0},
+/* 34 */ { 6, s_4_34, 32, -1, 0},
+/* 35 */ { 6, s_4_35, 32, -1, 0},
+/* 36 */ { 2, s_4_36, 29, -1, 0},
+/* 37 */ { 3, s_4_37, 29, -1, 0},
+/* 38 */ { 2, s_4_38, 29, -1, 0},
+/* 39 */ { 3, s_4_39, -1, -1, 0},
+/* 40 */ { 3, s_4_40, -1, -1, 0},
+/* 41 */ { 3, s_4_41, -1, -1, 0},
+/* 42 */ { 2, s_4_42, -1, -1, 0},
+/* 43 */ { 2, s_4_43, -1, -1, 0}
+};
+
+static const symbol s_5_0[2] = { 0xE1, 'n' };
+static const symbol s_5_1[2] = { 0xE9, 'n' };
+static const symbol s_5_2[6] = { 0xE1, 'n', 'k', 0xE9, 'n', 't' };
+
+static const struct among a_5[3] =
+{
+/*  0 */ { 2, s_5_0, -1, 2, 0},
+/*  1 */ { 2, s_5_1, -1, 1, 0},
+/*  2 */ { 6, s_5_2, -1, 2, 0}
+};
+
+static const symbol s_6_0[4] = { 's', 't', 'u', 'l' };
+static const symbol s_6_1[5] = { 'a', 's', 't', 'u', 'l' };
+static const symbol s_6_2[5] = { 0xE1, 's', 't', 'u', 'l' };
+static const symbol s_6_3[4] = { 's', 't', 0xFC, 'l' };
+static const symbol s_6_4[5] = { 'e', 's', 't', 0xFC, 'l' };
+static const symbol s_6_5[5] = { 0xE9, 's', 't', 0xFC, 'l' };
+
+static const struct among a_6[6] =
+{
+/*  0 */ { 4, s_6_0, -1, 1, 0},
+/*  1 */ { 5, s_6_1, 0, 1, 0},
+/*  2 */ { 5, s_6_2, 0, 2, 0},
+/*  3 */ { 4, s_6_3, -1, 1, 0},
+/*  4 */ { 5, s_6_4, 3, 1, 0},
+/*  5 */ { 5, s_6_5, 3, 3, 0}
+};
+
+static const symbol s_7_0[1] = { 0xE1 };
+static const symbol s_7_1[1] = { 0xE9 };
+
+static const struct among a_7[2] =
+{
+/*  0 */ { 1, s_7_0, -1, 1, 0},
+/*  1 */ { 1, s_7_1, -1, 1, 0}
+};
+
+static const symbol s_8_0[1] = { 'k' };
+static const symbol s_8_1[2] = { 'a', 'k' };
+static const symbol s_8_2[2] = { 'e', 'k' };
+static const symbol s_8_3[2] = { 'o', 'k' };
+static const symbol s_8_4[2] = { 0xE1, 'k' };
+static const symbol s_8_5[2] = { 0xE9, 'k' };
+static const symbol s_8_6[2] = { 0xF6, 'k' };
+
+static const struct among a_8[7] =
+{
+/*  0 */ { 1, s_8_0, -1, 3, 0},
+/*  1 */ { 2, s_8_1, 0, 3, 0},
+/*  2 */ { 2, s_8_2, 0, 3, 0},
+/*  3 */ { 2, s_8_3, 0, 3, 0},
+/*  4 */ { 2, s_8_4, 0, 1, 0},
+/*  5 */ { 2, s_8_5, 0, 2, 0},
+/*  6 */ { 2, s_8_6, 0, 3, 0}
+};
+
+static const symbol s_9_0[2] = { 0xE9, 'i' };
+static const symbol s_9_1[3] = { 0xE1, 0xE9, 'i' };
+static const symbol s_9_2[3] = { 0xE9, 0xE9, 'i' };
+static const symbol s_9_3[1] = { 0xE9 };
+static const symbol s_9_4[2] = { 'k', 0xE9 };
+static const symbol s_9_5[3] = { 'a', 'k', 0xE9 };
+static const symbol s_9_6[3] = { 'e', 'k', 0xE9 };
+static const symbol s_9_7[3] = { 'o', 'k', 0xE9 };
+static const symbol s_9_8[3] = { 0xE1, 'k', 0xE9 };
+static const symbol s_9_9[3] = { 0xE9, 'k', 0xE9 };
+static const symbol s_9_10[3] = { 0xF6, 'k', 0xE9 };
+static const symbol s_9_11[2] = { 0xE9, 0xE9 };
+
+static const struct among a_9[12] =
+{
+/*  0 */ { 2, s_9_0, -1, 1, 0},
+/*  1 */ { 3, s_9_1, 0, 3, 0},
+/*  2 */ { 3, s_9_2, 0, 2, 0},
+/*  3 */ { 1, s_9_3, -1, 1, 0},
+/*  4 */ { 2, s_9_4, 3, 1, 0},
+/*  5 */ { 3, s_9_5, 4, 1, 0},
+/*  6 */ { 3, s_9_6, 4, 1, 0},
+/*  7 */ { 3, s_9_7, 4, 1, 0},
+/*  8 */ { 3, s_9_8, 4, 3, 0},
+/*  9 */ { 3, s_9_9, 4, 2, 0},
+/* 10 */ { 3, s_9_10, 4, 1, 0},
+/* 11 */ { 2, s_9_11, 3, 2, 0}
+};
+
+static const symbol s_10_0[1] = { 'a' };
+static const symbol s_10_1[2] = { 'j', 'a' };
+static const symbol s_10_2[1] = { 'd' };
+static const symbol s_10_3[2] = { 'a', 'd' };
+static const symbol s_10_4[2] = { 'e', 'd' };
+static const symbol s_10_5[2] = { 'o', 'd' };
+static const symbol s_10_6[2] = { 0xE1, 'd' };
+static const symbol s_10_7[2] = { 0xE9, 'd' };
+static const symbol s_10_8[2] = { 0xF6, 'd' };
+static const symbol s_10_9[1] = { 'e' };
+static const symbol s_10_10[2] = { 'j', 'e' };
+static const symbol s_10_11[2] = { 'n', 'k' };
+static const symbol s_10_12[3] = { 'u', 'n', 'k' };
+static const symbol s_10_13[3] = { 0xE1, 'n', 'k' };
+static const symbol s_10_14[3] = { 0xE9, 'n', 'k' };
+static const symbol s_10_15[3] = { 0xFC, 'n', 'k' };
+static const symbol s_10_16[2] = { 'u', 'k' };
+static const symbol s_10_17[3] = { 'j', 'u', 'k' };
+static const symbol s_10_18[4] = { 0xE1, 'j', 'u', 'k' };
+static const symbol s_10_19[2] = { 0xFC, 'k' };
+static const symbol s_10_20[3] = { 'j', 0xFC, 'k' };
+static const symbol s_10_21[4] = { 0xE9, 'j', 0xFC, 'k' };
+static const symbol s_10_22[1] = { 'm' };
+static const symbol s_10_23[2] = { 'a', 'm' };
+static const symbol s_10_24[2] = { 'e', 'm' };
+static const symbol s_10_25[2] = { 'o', 'm' };
+static const symbol s_10_26[2] = { 0xE1, 'm' };
+static const symbol s_10_27[2] = { 0xE9, 'm' };
+static const symbol s_10_28[1] = { 'o' };
+static const symbol s_10_29[1] = { 0xE1 };
+static const symbol s_10_30[1] = { 0xE9 };
+
+static const struct among a_10[31] =
+{
+/*  0 */ { 1, s_10_0, -1, 1, 0},
+/*  1 */ { 2, s_10_1, 0, 1, 0},
+/*  2 */ { 1, s_10_2, -1, 1, 0},
+/*  3 */ { 2, s_10_3, 2, 1, 0},
+/*  4 */ { 2, s_10_4, 2, 1, 0},
+/*  5 */ { 2, s_10_5, 2, 1, 0},
+/*  6 */ { 2, s_10_6, 2, 2, 0},
+/*  7 */ { 2, s_10_7, 2, 3, 0},
+/*  8 */ { 2, s_10_8, 2, 1, 0},
+/*  9 */ { 1, s_10_9, -1, 1, 0},
+/* 10 */ { 2, s_10_10, 9, 1, 0},
+/* 11 */ { 2, s_10_11, -1, 1, 0},
+/* 12 */ { 3, s_10_12, 11, 1, 0},
+/* 13 */ { 3, s_10_13, 11, 2, 0},
+/* 14 */ { 3, s_10_14, 11, 3, 0},
+/* 15 */ { 3, s_10_15, 11, 1, 0},
+/* 16 */ { 2, s_10_16, -1, 1, 0},
+/* 17 */ { 3, s_10_17, 16, 1, 0},
+/* 18 */ { 4, s_10_18, 17, 2, 0},
+/* 19 */ { 2, s_10_19, -1, 1, 0},
+/* 20 */ { 3, s_10_20, 19, 1, 0},
+/* 21 */ { 4, s_10_21, 20, 3, 0},
+/* 22 */ { 1, s_10_22, -1, 1, 0},
+/* 23 */ { 2, s_10_23, 22, 1, 0},
+/* 24 */ { 2, s_10_24, 22, 1, 0},
+/* 25 */ { 2, s_10_25, 22, 1, 0},
+/* 26 */ { 2, s_10_26, 22, 2, 0},
+/* 27 */ { 2, s_10_27, 22, 3, 0},
+/* 28 */ { 1, s_10_28, -1, 1, 0},
+/* 29 */ { 1, s_10_29, -1, 2, 0},
+/* 30 */ { 1, s_10_30, -1, 3, 0}
+};
+
+static const symbol s_11_0[2] = { 'i', 'd' };
+static const symbol s_11_1[3] = { 'a', 'i', 'd' };
+static const symbol s_11_2[4] = { 'j', 'a', 'i', 'd' };
+static const symbol s_11_3[3] = { 'e', 'i', 'd' };
+static const symbol s_11_4[4] = { 'j', 'e', 'i', 'd' };
+static const symbol s_11_5[3] = { 0xE1, 'i', 'd' };
+static const symbol s_11_6[3] = { 0xE9, 'i', 'd' };
+static const symbol s_11_7[1] = { 'i' };
+static const symbol s_11_8[2] = { 'a', 'i' };
+static const symbol s_11_9[3] = { 'j', 'a', 'i' };
+static const symbol s_11_10[2] = { 'e', 'i' };
+static const symbol s_11_11[3] = { 'j', 'e', 'i' };
+static const symbol s_11_12[2] = { 0xE1, 'i' };
+static const symbol s_11_13[2] = { 0xE9, 'i' };
+static const symbol s_11_14[4] = { 'i', 't', 'e', 'k' };
+static const symbol s_11_15[5] = { 'e', 'i', 't', 'e', 'k' };
+static const symbol s_11_16[6] = { 'j', 'e', 'i', 't', 'e', 'k' };
+static const symbol s_11_17[5] = { 0xE9, 'i', 't', 'e', 'k' };
+static const symbol s_11_18[2] = { 'i', 'k' };
+static const symbol s_11_19[3] = { 'a', 'i', 'k' };
+static const symbol s_11_20[4] = { 'j', 'a', 'i', 'k' };
+static const symbol s_11_21[3] = { 'e', 'i', 'k' };
+static const symbol s_11_22[4] = { 'j', 'e', 'i', 'k' };
+static const symbol s_11_23[3] = { 0xE1, 'i', 'k' };
+static const symbol s_11_24[3] = { 0xE9, 'i', 'k' };
+static const symbol s_11_25[3] = { 'i', 'n', 'k' };
+static const symbol s_11_26[4] = { 'a', 'i', 'n', 'k' };
+static const symbol s_11_27[5] = { 'j', 'a', 'i', 'n', 'k' };
+static const symbol s_11_28[4] = { 'e', 'i', 'n', 'k' };
+static const symbol s_11_29[5] = { 'j', 'e', 'i', 'n', 'k' };
+static const symbol s_11_30[4] = { 0xE1, 'i', 'n', 'k' };
+static const symbol s_11_31[4] = { 0xE9, 'i', 'n', 'k' };
+static const symbol s_11_32[5] = { 'a', 'i', 't', 'o', 'k' };
+static const symbol s_11_33[6] = { 'j', 'a', 'i', 't', 'o', 'k' };
+static const symbol s_11_34[5] = { 0xE1, 'i', 't', 'o', 'k' };
+static const symbol s_11_35[2] = { 'i', 'm' };
+static const symbol s_11_36[3] = { 'a', 'i', 'm' };
+static const symbol s_11_37[4] = { 'j', 'a', 'i', 'm' };
+static const symbol s_11_38[3] = { 'e', 'i', 'm' };
+static const symbol s_11_39[4] = { 'j', 'e', 'i', 'm' };
+static const symbol s_11_40[3] = { 0xE1, 'i', 'm' };
+static const symbol s_11_41[3] = { 0xE9, 'i', 'm' };
+
+static const struct among a_11[42] =
+{
+/*  0 */ { 2, s_11_0, -1, 1, 0},
+/*  1 */ { 3, s_11_1, 0, 1, 0},
+/*  2 */ { 4, s_11_2, 1, 1, 0},
+/*  3 */ { 3, s_11_3, 0, 1, 0},
+/*  4 */ { 4, s_11_4, 3, 1, 0},
+/*  5 */ { 3, s_11_5, 0, 2, 0},
+/*  6 */ { 3, s_11_6, 0, 3, 0},
+/*  7 */ { 1, s_11_7, -1, 1, 0},
+/*  8 */ { 2, s_11_8, 7, 1, 0},
+/*  9 */ { 3, s_11_9, 8, 1, 0},
+/* 10 */ { 2, s_11_10, 7, 1, 0},
+/* 11 */ { 3, s_11_11, 10, 1, 0},
+/* 12 */ { 2, s_11_12, 7, 2, 0},
+/* 13 */ { 2, s_11_13, 7, 3, 0},
+/* 14 */ { 4, s_11_14, -1, 1, 0},
+/* 15 */ { 5, s_11_15, 14, 1, 0},
+/* 16 */ { 6, s_11_16, 15, 1, 0},
+/* 17 */ { 5, s_11_17, 14, 3, 0},
+/* 18 */ { 2, s_11_18, -1, 1, 0},
+/* 19 */ { 3, s_11_19, 18, 1, 0},
+/* 20 */ { 4, s_11_20, 19, 1, 0},
+/* 21 */ { 3, s_11_21, 18, 1, 0},
+/* 22 */ { 4, s_11_22, 21, 1, 0},
+/* 23 */ { 3, s_11_23, 18, 2, 0},
+/* 24 */ { 3, s_11_24, 18, 3, 0},
+/* 25 */ { 3, s_11_25, -1, 1, 0},
+/* 26 */ { 4, s_11_26, 25, 1, 0},
+/* 27 */ { 5, s_11_27, 26, 1, 0},
+/* 28 */ { 4, s_11_28, 25, 1, 0},
+/* 29 */ { 5, s_11_29, 28, 1, 0},
+/* 30 */ { 4, s_11_30, 25, 2, 0},
+/* 31 */ { 4, s_11_31, 25, 3, 0},
+/* 32 */ { 5, s_11_32, -1, 1, 0},
+/* 33 */ { 6, s_11_33, 32, 1, 0},
+/* 34 */ { 5, s_11_34, -1, 2, 0},
+/* 35 */ { 2, s_11_35, -1, 1, 0},
+/* 36 */ { 3, s_11_36, 35, 1, 0},
+/* 37 */ { 4, s_11_37, 36, 1, 0},
+/* 38 */ { 3, s_11_38, 35, 1, 0},
+/* 39 */ { 4, s_11_39, 38, 1, 0},
+/* 40 */ { 3, s_11_40, 35, 2, 0},
+/* 41 */ { 3, s_11_41, 35, 3, 0}
+};
+
+static const unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 52, 14 };
+
+static const symbol s_0[] = { 'a' };
+static const symbol s_1[] = { 'e' };
+static const symbol s_2[] = { 'e' };
+static const symbol s_3[] = { 'a' };
+static const symbol s_4[] = { 'a' };
+static const symbol s_5[] = { 'e' };
+static const symbol s_6[] = { 'a' };
+static const symbol s_7[] = { 'e' };
+static const symbol s_8[] = { 'e' };
+static const symbol s_9[] = { 'a' };
+static const symbol s_10[] = { 'a' };
+static const symbol s_11[] = { 'e' };
+static const symbol s_12[] = { 'a' };
+static const symbol s_13[] = { 'e' };
+
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 46 */
+    {   int c1 = z->c; /* or, line 51 */
+        if (in_grouping(z, g_v, 97, 252, 0)) goto lab1; /* grouping v, line 48 */
+        if (in_grouping(z, g_v, 97, 252, 1) < 0) goto lab1; /* goto */ /* non v, line 48 */
+        {   int c2 = z->c; /* or, line 49 */
+            if (z->c + 1 >= z->l || z->p[z->c + 1] >> 5 != 3 || !((101187584 >> (z->p[z->c + 1] & 0x1f)) & 1)) goto lab3; /* among, line 49 */
+            if (!(find_among(z, a_0, 8))) goto lab3;
+            goto lab2;
+        lab3:
+            z->c = c2;
+            if (z->c >= z->l) goto lab1;
+            z->c++; /* next, line 49 */
+        }
+    lab2:
+        z->I[0] = z->c; /* setmark p1, line 50 */
+        goto lab0;
+    lab1:
+        z->c = c1;
+        if (out_grouping(z, g_v, 97, 252, 0)) return 0; /* non v, line 53 */
+        {    /* gopast */ /* grouping v, line 53 */
+            int ret = out_grouping(z, g_v, 97, 252, 1);
+            if (ret < 0) return 0;
+            z->c += ret;
+        }
+        z->I[0] = z->c; /* setmark p1, line 53 */
+    }
+lab0:
+    return 1;
+}
+
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 58 */
+    return 1;
+}
+
+static int r_v_ending(struct SN_env * z) { /* backwardmode */
+    int among_var;
+    z->ket = z->c; /* [, line 61 */
+    if (z->c <= z->lb || (z->p[z->c - 1] != 225 && z->p[z->c - 1] != 233)) return 0; /* substring, line 61 */
+    among_var = find_among_b(z, a_1, 2);
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 61 */
+    {   int ret = r_R1(z); /* call R1, line 61 */
+        if (ret <= 0) return ret;
+    }
+    switch (among_var) { /* among, line 61 */
+        case 1:
+            {   int ret = slice_from_s(z, 1, s_0); /* <-, line 62 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = slice_from_s(z, 1, s_1); /* <-, line 63 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_double(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 68 */
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((106790108 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* among, line 68 */
+        if (!(find_among_b(z, a_2, 23))) return 0;
+        z->c = z->l - m_test1;
+    }
+    return 1;
+}
+
+static int r_undouble(struct SN_env * z) { /* backwardmode */
+    if (z->c <= z->lb) return 0;
+    z->c--; /* next, line 73 */
+    z->ket = z->c; /* [, line 73 */
+    {   int ret = z->c - 1; /* hop, line 73 */
+        if (z->lb > ret || ret > z->l) return 0;
+        z->c = ret;
+    }
+    z->bra = z->c; /* ], line 73 */
+    {   int ret = slice_del(z); /* delete, line 73 */
+        if (ret < 0) return ret;
+    }
+    return 1;
+}
+
+static int r_instrum(struct SN_env * z) { /* backwardmode */
+    z->ket = z->c; /* [, line 77 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] != 108) return 0; /* substring, line 77 */
+    if (!(find_among_b(z, a_3, 2))) return 0;
+    z->bra = z->c; /* ], line 77 */
+    {   int ret = r_R1(z); /* call R1, line 77 */
+        if (ret <= 0) return ret;
+    }
+    {   int ret = r_double(z); /* call double, line 78 */
+        if (ret <= 0) return ret;
+    }
+    {   int ret = slice_del(z); /* delete, line 81 */
+        if (ret < 0) return ret;
+    }
+    {   int ret = r_undouble(z); /* call undouble, line 82 */
+        if (ret <= 0) return ret;
+    }
+    return 1;
+}
+
+static int r_case(struct SN_env * z) { /* backwardmode */
+    z->ket = z->c; /* [, line 87 */
+    if (!(find_among_b(z, a_4, 44))) return 0; /* substring, line 87 */
+    z->bra = z->c; /* ], line 87 */
+    {   int ret = r_R1(z); /* call R1, line 87 */
+        if (ret <= 0) return ret;
+    }
+    {   int ret = slice_del(z); /* delete, line 111 */
+        if (ret < 0) return ret;
+    }
+    {   int ret = r_v_ending(z); /* call v_ending, line 112 */
+        if (ret <= 0) return ret;
+    }
+    return 1;
+}
+
+static int r_case_special(struct SN_env * z) { /* backwardmode */
+    int among_var;
+    z->ket = z->c; /* [, line 116 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 110 && z->p[z->c - 1] != 116)) return 0; /* substring, line 116 */
+    among_var = find_among_b(z, a_5, 3);
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 116 */
+    {   int ret = r_R1(z); /* call R1, line 116 */
+        if (ret <= 0) return ret;
+    }
+    switch (among_var) { /* among, line 116 */
+        case 1:
+            {   int ret = slice_from_s(z, 1, s_2); /* <-, line 117 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = slice_from_s(z, 1, s_3); /* <-, line 118 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_case_other(struct SN_env * z) { /* backwardmode */
+    int among_var;
+    z->ket = z->c; /* [, line 124 */
+    if (z->c - 3 <= z->lb || z->p[z->c - 1] != 108) return 0; /* substring, line 124 */
+    among_var = find_among_b(z, a_6, 6);
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 124 */
+    {   int ret = r_R1(z); /* call R1, line 124 */
+        if (ret <= 0) return ret;
+    }
+    switch (among_var) { /* among, line 124 */
+        case 1:
+            {   int ret = slice_del(z); /* delete, line 125 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = slice_from_s(z, 1, s_4); /* <-, line 127 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret = slice_from_s(z, 1, s_5); /* <-, line 128 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_factive(struct SN_env * z) { /* backwardmode */
+    z->ket = z->c; /* [, line 133 */
+    if (z->c <= z->lb || (z->p[z->c - 1] != 225 && z->p[z->c - 1] != 233)) return 0; /* substring, line 133 */
+    if (!(find_among_b(z, a_7, 2))) return 0;
+    z->bra = z->c; /* ], line 133 */
+    {   int ret = r_R1(z); /* call R1, line 133 */
+        if (ret <= 0) return ret;
+    }
+    {   int ret = r_double(z); /* call double, line 134 */
+        if (ret <= 0) return ret;
+    }
+    {   int ret = slice_del(z); /* delete, line 137 */
+        if (ret < 0) return ret;
+    }
+    {   int ret = r_undouble(z); /* call undouble, line 138 */
+        if (ret <= 0) return ret;
+    }
+    return 1;
+}
+
+static int r_plural(struct SN_env * z) { /* backwardmode */
+    int among_var;
+    z->ket = z->c; /* [, line 142 */
+    if (z->c <= z->lb || z->p[z->c - 1] != 107) return 0; /* substring, line 142 */
+    among_var = find_among_b(z, a_8, 7);
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 142 */
+    {   int ret = r_R1(z); /* call R1, line 142 */
+        if (ret <= 0) return ret;
+    }
+    switch (among_var) { /* among, line 142 */
+        case 1:
+            {   int ret = slice_from_s(z, 1, s_6); /* <-, line 143 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = slice_from_s(z, 1, s_7); /* <-, line 144 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret = slice_del(z); /* delete, line 145 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_owned(struct SN_env * z) { /* backwardmode */
+    int among_var;
+    z->ket = z->c; /* [, line 154 */
+    if (z->c <= z->lb || (z->p[z->c - 1] != 105 && z->p[z->c - 1] != 233)) return 0; /* substring, line 154 */
+    among_var = find_among_b(z, a_9, 12);
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 154 */
+    {   int ret = r_R1(z); /* call R1, line 154 */
+        if (ret <= 0) return ret;
+    }
+    switch (among_var) { /* among, line 154 */
+        case 1:
+            {   int ret = slice_del(z); /* delete, line 155 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = slice_from_s(z, 1, s_8); /* <-, line 156 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret = slice_from_s(z, 1, s_9); /* <-, line 157 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_sing_owner(struct SN_env * z) { /* backwardmode */
+    int among_var;
+    z->ket = z->c; /* [, line 168 */
+    among_var = find_among_b(z, a_10, 31); /* substring, line 168 */
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 168 */
+    {   int ret = r_R1(z); /* call R1, line 168 */
+        if (ret <= 0) return ret;
+    }
+    switch (among_var) { /* among, line 168 */
+        case 1:
+            {   int ret = slice_del(z); /* delete, line 169 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = slice_from_s(z, 1, s_10); /* <-, line 170 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret = slice_from_s(z, 1, s_11); /* <-, line 171 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+static int r_plur_owner(struct SN_env * z) { /* backwardmode */
+    int among_var;
+    z->ket = z->c; /* [, line 193 */
+    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((10768 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 193 */
+    among_var = find_among_b(z, a_11, 42);
+    if (!(among_var)) return 0;
+    z->bra = z->c; /* ], line 193 */
+    {   int ret = r_R1(z); /* call R1, line 193 */
+        if (ret <= 0) return ret;
+    }
+    switch (among_var) { /* among, line 193 */
+        case 1:
+            {   int ret = slice_del(z); /* delete, line 194 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 2:
+            {   int ret = slice_from_s(z, 1, s_12); /* <-, line 195 */
+                if (ret < 0) return ret;
+            }
+            break;
+        case 3:
+            {   int ret = slice_from_s(z, 1, s_13); /* <-, line 196 */
+                if (ret < 0) return ret;
+            }
+            break;
+    }
+    return 1;
+}
+
+extern int hungarian_ISO_8859_2_stem(struct SN_env * z) { /* forwardmode */
+    {   int c1 = z->c; /* do, line 229 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 229 */
+            if (ret == 0) goto lab0;
+            if (ret < 0) return ret;
+        }
+    lab0:
+        z->c = c1;
+    }
+    z->lb = z->c; z->c = z->l; /* backwards, line 230 */
+
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 231 */
+        {   int ret = r_instrum(z); /* call instrum, line 231 */
+            if (ret == 0) goto lab1;
+            if (ret < 0) return ret;
+        }
+    lab1:
+        z->c = z->l - m2;
+    }
+    {   int m3 = z->l - z->c; (void)m3; /* do, line 232 */
+        {   int ret = r_case(z); /* call case, line 232 */
+            if (ret == 0) goto lab2;
+            if (ret < 0) return ret;
+        }
+    lab2:
+        z->c = z->l - m3;
+    }
+    {   int m4 = z->l - z->c; (void)m4; /* do, line 233 */
+        {   int ret = r_case_special(z); /* call case_special, line 233 */
+            if (ret == 0) goto lab3;
+            if (ret < 0) return ret;
+        }
+    lab3:
+        z->c = z->l - m4;
+    }
+    {   int m5 = z->l - z->c; (void)m5; /* do, line 234 */
+        {   int ret = r_case_other(z); /* call case_other, line 234 */
+            if (ret == 0) goto lab4;
+            if (ret < 0) return ret;
+        }
+    lab4:
+        z->c = z->l - m5;
+    }
+    {   int m6 = z->l - z->c; (void)m6; /* do, line 235 */
+        {   int ret = r_factive(z); /* call factive, line 235 */
+            if (ret == 0) goto lab5;
+            if (ret < 0) return ret;
+        }
+    lab5:
+        z->c = z->l - m6;
+    }
+    {   int m7 = z->l - z->c; (void)m7; /* do, line 236 */
+        {   int ret = r_owned(z); /* call owned, line 236 */
+            if (ret == 0) goto lab6;
+            if (ret < 0) return ret;
+        }
+    lab6:
+        z->c = z->l - m7;
+    }
+    {   int m8 = z->l - z->c; (void)m8; /* do, line 237 */
+        {   int ret = r_sing_owner(z); /* call sing_owner, line 237 */
+            if (ret == 0) goto lab7;
+            if (ret < 0) return ret;
+        }
+    lab7:
+        z->c = z->l - m8;
+    }
+    {   int m9 = z->l - z->c; (void)m9; /* do, line 238 */
+        {   int ret = r_plur_owner(z); /* call plur_owner, line 238 */
+            if (ret == 0) goto lab8;
+            if (ret < 0) return ret;
+        }
+    lab8:
+        z->c = z->l - m9;
+    }
+    {   int m10 = z->l - z->c; (void)m10; /* do, line 239 */
+        {   int ret = r_plural(z); /* call plural, line 239 */
+            if (ret == 0) goto lab9;
+            if (ret < 0) return ret;
+        }
+    lab9:
+        z->c = z->l - m10;
+    }
+    z->c = z->lb;
+    return 1;
+}
+
+extern struct SN_env * hungarian_ISO_8859_2_create_env(void) { return SN_create_env(0, 1, 0); }
+
+extern void hungarian_ISO_8859_2_close_env(struct SN_env * z) { SN_close_env(z, 0); }
+
diff --git a/src/backend/snowball/libstemmer/stem_ISO_8859_2_romanian.c b/src/backend/snowball/libstemmer/stem_ISO_8859_2_romanian.c
index d5cc2bec3f..a085e09efe 100644
--- a/src/backend/snowball/libstemmer/stem_ISO_8859_2_romanian.c
+++ b/src/backend/snowball/libstemmer/stem_ISO_8859_2_romanian.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -516,51 +516,49 @@ static const struct among a_5[5] =
 
 static const unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 32 };
 
-static const symbol s_0[] = { 'u' };
-static const symbol s_1[] = { 'U' };
+static const symbol s_0[] = { 'U' };
+static const symbol s_1[] = { 'I' };
 static const symbol s_2[] = { 'i' };
-static const symbol s_3[] = { 'I' };
-static const symbol s_4[] = { 'i' };
-static const symbol s_5[] = { 'u' };
-static const symbol s_6[] = { 'a' };
-static const symbol s_7[] = { 'e' };
+static const symbol s_3[] = { 'u' };
+static const symbol s_4[] = { 'a' };
+static const symbol s_5[] = { 'e' };
+static const symbol s_6[] = { 'i' };
+static const symbol s_7[] = { 'a', 'b' };
 static const symbol s_8[] = { 'i' };
-static const symbol s_9[] = { 'a', 'b' };
-static const symbol s_10[] = { 'i' };
-static const symbol s_11[] = { 'a', 't' };
-static const symbol s_12[] = { 'a', 0xFE, 'i' };
-static const symbol s_13[] = { 'a', 'b', 'i', 'l' };
-static const symbol s_14[] = { 'i', 'b', 'i', 'l' };
-static const symbol s_15[] = { 'i', 'v' };
-static const symbol s_16[] = { 'i', 'c' };
-static const symbol s_17[] = { 'a', 't' };
-static const symbol s_18[] = { 'i', 't' };
-static const symbol s_19[] = { 0xFE };
-static const symbol s_20[] = { 't' };
-static const symbol s_21[] = { 'i', 's', 't' };
-static const symbol s_22[] = { 'u' };
+static const symbol s_9[] = { 'a', 't' };
+static const symbol s_10[] = { 'a', 0xFE, 'i' };
+static const symbol s_11[] = { 'a', 'b', 'i', 'l' };
+static const symbol s_12[] = { 'i', 'b', 'i', 'l' };
+static const symbol s_13[] = { 'i', 'v' };
+static const symbol s_14[] = { 'i', 'c' };
+static const symbol s_15[] = { 'a', 't' };
+static const symbol s_16[] = { 'i', 't' };
+static const symbol s_17[] = { 't' };
+static const symbol s_18[] = { 'i', 's', 't' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     while(1) { /* repeat, line 32 */
         int c1 = z->c;
         while(1) { /* goto, line 32 */
             int c2 = z->c;
-            if (in_grouping(z, g_v, 97, 238, 0)) goto lab1;
+            if (in_grouping(z, g_v, 97, 238, 0)) goto lab1; /* grouping v, line 33 */
             z->bra = z->c; /* [, line 33 */
             {   int c3 = z->c; /* or, line 33 */
-                if (!(eq_s(z, 1, s_0))) goto lab3;
+                if (z->c == z->l || z->p[z->c] != 'u') goto lab3; /* literal, line 33 */
+                z->c++;
                 z->ket = z->c; /* ], line 33 */
-                if (in_grouping(z, g_v, 97, 238, 0)) goto lab3;
-                {   int ret = slice_from_s(z, 1, s_1); /* <-, line 33 */
+                if (in_grouping(z, g_v, 97, 238, 0)) goto lab3; /* grouping v, line 33 */
+                {   int ret = slice_from_s(z, 1, s_0); /* <-, line 33 */
                     if (ret < 0) return ret;
                 }
                 goto lab2;
             lab3:
                 z->c = c3;
-                if (!(eq_s(z, 1, s_2))) goto lab1;
+                if (z->c == z->l || z->p[z->c] != 'i') goto lab1; /* literal, line 34 */
+                z->c++;
                 z->ket = z->c; /* ], line 34 */
-                if (in_grouping(z, g_v, 97, 238, 0)) goto lab1;
-                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 34 */
+                if (in_grouping(z, g_v, 97, 238, 0)) goto lab1; /* grouping v, line 34 */
+                {   int ret = slice_from_s(z, 1, s_1); /* <-, line 34 */
                     if (ret < 0) return ret;
                 }
             }
@@ -580,15 +578,15 @@ static int r_prelude(struct SN_env * z) {
     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;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 40 */
+    z->I[1] = z->l; /* $p1 = <integer expression>, line 41 */
+    z->I[2] = z->l; /* $p2 = <integer expression>, line 42 */
     {   int c1 = z->c; /* do, line 44 */
         {   int c2 = z->c; /* or, line 46 */
-            if (in_grouping(z, g_v, 97, 238, 0)) goto lab2;
+            if (in_grouping(z, g_v, 97, 238, 0)) goto lab2; /* grouping v, line 45 */
             {   int c3 = z->c; /* or, line 45 */
-                if (out_grouping(z, g_v, 97, 238, 0)) goto lab4;
+                if (out_grouping(z, g_v, 97, 238, 0)) goto lab4; /* non v, line 45 */
                 {    /* gopast */ /* grouping v, line 45 */
                     int ret = out_grouping(z, g_v, 97, 238, 1);
                     if (ret < 0) goto lab4;
@@ -597,7 +595,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab3;
             lab4:
                 z->c = c3;
-                if (in_grouping(z, g_v, 97, 238, 0)) goto lab2;
+                if (in_grouping(z, g_v, 97, 238, 0)) goto lab2; /* grouping v, line 45 */
                 {    /* gopast */ /* non v, line 45 */
                     int ret = in_grouping(z, g_v, 97, 238, 1);
                     if (ret < 0) goto lab2;
@@ -608,9 +606,9 @@ static int r_mark_regions(struct SN_env * z) {
             goto lab1;
         lab2:
             z->c = c2;
-            if (out_grouping(z, g_v, 97, 238, 0)) goto lab0;
+            if (out_grouping(z, g_v, 97, 238, 0)) goto lab0; /* non v, line 47 */
             {   int c4 = z->c; /* or, line 47 */
-                if (out_grouping(z, g_v, 97, 238, 0)) goto lab6;
+                if (out_grouping(z, g_v, 97, 238, 0)) goto lab6; /* non v, line 47 */
                 {    /* gopast */ /* grouping v, line 47 */
                     int ret = out_grouping(z, g_v, 97, 238, 1);
                     if (ret < 0) goto lab6;
@@ -619,7 +617,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab5;
             lab6:
                 z->c = c4;
-                if (in_grouping(z, g_v, 97, 238, 0)) goto lab0;
+                if (in_grouping(z, g_v, 97, 238, 0)) goto lab0; /* grouping v, line 47 */
                 if (z->c >= z->l) goto lab0;
                 z->c++; /* next, line 47 */
             }
@@ -660,24 +658,23 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 56 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 58 */
-        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 85)) among_var = 3; else
-        among_var = find_among(z, a_0, 3); /* substring, line 58 */
+        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 85)) among_var = 3; else /* substring, line 58 */
+        among_var = find_among(z, a_0, 3);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 58 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 58 */
             case 1:
-                {   int ret = slice_from_s(z, 1, s_4); /* <-, line 59 */
+                {   int ret = slice_from_s(z, 1, s_2); /* <-, line 59 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_5); /* <-, line 60 */
+                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 60 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -694,72 +691,70 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_RV(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_RV(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 68 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 69 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[2] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[2] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 70 */
     return 1;
 }
 
-static int r_step_0(struct SN_env * z) {
+static int r_step_0(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 73 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((266786 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_1, 16); /* substring, line 73 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((266786 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 73 */
+    among_var = find_among_b(z, a_1, 16);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 73 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 73 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 73 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 73 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 75 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 1, s_6); /* <-, line 77 */
+            {   int ret = slice_from_s(z, 1, s_4); /* <-, line 77 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 1, s_7); /* <-, line 79 */
+            {   int ret = slice_from_s(z, 1, s_5); /* <-, line 79 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 1, s_8); /* <-, line 81 */
+            {   int ret = slice_from_s(z, 1, s_6); /* <-, line 81 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
             {   int m1 = z->l - z->c; (void)m1; /* not, line 83 */
-                if (!(eq_s_b(z, 2, s_9))) goto lab0;
+                if (!(eq_s_b(z, 2, s_7))) goto lab0; /* literal, line 83 */
                 return 0;
             lab0:
                 z->c = z->l - m1;
             }
-            {   int ret = slice_from_s(z, 1, s_10); /* <-, line 83 */
+            {   int ret = slice_from_s(z, 1, s_8); /* <-, line 83 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            {   int ret = slice_from_s(z, 2, s_11); /* <-, line 85 */
+            {   int ret = slice_from_s(z, 2, s_9); /* <-, line 85 */
                 if (ret < 0) return ret;
             }
             break;
         case 7:
-            {   int ret = slice_from_s(z, 3, s_12); /* <-, line 87 */
+            {   int ret = slice_from_s(z, 3, s_10); /* <-, line 87 */
                 if (ret < 0) return ret;
             }
             break;
@@ -767,63 +762,61 @@ static int r_step_0(struct SN_env * z) {
     return 1;
 }
 
-static int r_combo_suffix(struct SN_env * z) {
+static int r_combo_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int m_test = z->l - z->c; /* test, line 91 */
+    {   int m_test1 = z->l - z->c; /* test, line 91 */
         z->ket = z->c; /* [, line 92 */
         among_var = find_among_b(z, a_2, 46); /* substring, line 92 */
         if (!(among_var)) return 0;
         z->bra = z->c; /* ], line 92 */
-        {   int ret = r_R1(z);
-            if (ret == 0) return 0; /* call R1, line 92 */
-            if (ret < 0) return ret;
+        {   int ret = r_R1(z); /* call R1, line 92 */
+            if (ret <= 0) return ret;
         }
-        switch(among_var) {
-            case 0: return 0;
+        switch (among_var) { /* among, line 93 */
             case 1:
-                {   int ret = slice_from_s(z, 4, s_13); /* <-, line 101 */
+                {   int ret = slice_from_s(z, 4, s_11); /* <-, line 101 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 4, s_14); /* <-, line 104 */
+                {   int ret = slice_from_s(z, 4, s_12); /* <-, line 104 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 3:
-                {   int ret = slice_from_s(z, 2, s_15); /* <-, line 107 */
+                {   int ret = slice_from_s(z, 2, s_13); /* <-, line 107 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 4:
-                {   int ret = slice_from_s(z, 2, s_16); /* <-, line 113 */
+                {   int ret = slice_from_s(z, 2, s_14); /* <-, line 113 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 5:
-                {   int ret = slice_from_s(z, 2, s_17); /* <-, line 118 */
+                {   int ret = slice_from_s(z, 2, s_15); /* <-, line 118 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 6:
-                {   int ret = slice_from_s(z, 2, s_18); /* <-, line 122 */
+                {   int ret = slice_from_s(z, 2, s_16); /* <-, line 122 */
                     if (ret < 0) return ret;
                 }
                 break;
         }
         z->B[0] = 1; /* set standard_suffix_removed, line 125 */
-        z->c = z->l - m_test;
+        z->c = z->l - m_test1;
     }
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->B[0] = 0; /* unset standard_suffix_removed, line 130 */
     while(1) { /* repeat, line 131 */
         int m1 = z->l - z->c; (void)m1;
-        {   int ret = r_combo_suffix(z);
-            if (ret == 0) goto lab0; /* call combo_suffix, line 131 */
+        {   int ret = r_combo_suffix(z); /* call combo_suffix, line 131 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
         continue;
@@ -835,26 +828,25 @@ static int r_standard_suffix(struct SN_env * z) {
     among_var = find_among_b(z, a_3, 62); /* substring, line 132 */
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 132 */
-    {   int ret = r_R2(z);
-        if (ret == 0) return 0; /* call R2, line 132 */
-        if (ret < 0) return ret;
+    {   int ret = r_R2(z); /* call R2, line 132 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 133 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 149 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            if (!(eq_s_b(z, 1, s_19))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 0xFE) return 0; /* literal, line 152 */
+            z->c--;
             z->bra = z->c; /* ], line 152 */
-            {   int ret = slice_from_s(z, 1, s_20); /* <-, line 152 */
+            {   int ret = slice_from_s(z, 1, s_17); /* <-, line 152 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 3, s_21); /* <-, line 156 */
+            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 156 */
                 if (ret < 0) return ret;
             }
             break;
@@ -863,27 +855,25 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_verb_suffix(struct SN_env * z) {
+static int r_verb_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 164 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 164 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 164 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 165 */
         among_var = find_among_b(z, a_4, 94); /* substring, line 165 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 165 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
+        switch (among_var) { /* among, line 165 */
             case 1:
                 {   int m2 = z->l - z->c; (void)m2; /* or, line 200 */
-                    if (out_grouping_b(z, g_v, 97, 238, 0)) goto lab1;
+                    if (out_grouping_b(z, g_v, 97, 238, 0)) goto lab1; /* non v, line 200 */
                     goto lab0;
                 lab1:
                     z->c = z->l - m2;
-                    if (!(eq_s_b(z, 1, s_22))) { z->lb = mlimit; return 0; }
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'u') { z->lb = mlimit1; return 0; } /* literal, line 200 */
+                    z->c--;
                 }
             lab0:
                 {   int ret = slice_del(z); /* delete, line 200 */
@@ -896,98 +886,88 @@ static int r_verb_suffix(struct SN_env * z) {
                 }
                 break;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_vowel_suffix(struct SN_env * z) {
-    int among_var;
+static int r_vowel_suffix(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 219 */
-    among_var = find_among_b(z, a_5, 5); /* substring, line 219 */
-    if (!(among_var)) return 0;
+    if (!(find_among_b(z, a_5, 5))) return 0; /* substring, line 219 */
     z->bra = z->c; /* ], line 219 */
-    {   int ret = r_RV(z);
-        if (ret == 0) return 0; /* call RV, line 219 */
+    {   int ret = r_RV(z); /* call RV, line 219 */
+        if (ret <= 0) return ret;
+    }
+    {   int ret = slice_del(z); /* delete, line 220 */
         if (ret < 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 220 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
     return 1;
 }
 
-extern int romanian_ISO_8859_2_stem(struct SN_env * z) {
+extern int romanian_ISO_8859_2_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 226 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 226 */
+        {   int ret = r_prelude(z); /* call prelude, line 226 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    {   int c2 = z->c; /* do, line 227 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab1; /* call mark_regions, line 227 */
-            if (ret < 0) return ret;
-        }
-    lab1:
-        z->c = c2;
+    /* do, line 227 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 227 */
+        if (ret == 0) goto lab1;
+        if (ret < 0) return ret;
     }
+lab1:
     z->lb = z->c; z->c = z->l; /* backwards, line 228 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 229 */
-        {   int ret = r_step_0(z);
-            if (ret == 0) goto lab2; /* call step_0, line 229 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 229 */
+        {   int ret = r_step_0(z); /* call step_0, line 229 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
-        z->c = z->l - m3;
+        z->c = z->l - m2;
     }
-    {   int m4 = z->l - z->c; (void)m4; /* do, line 230 */
-        {   int ret = r_standard_suffix(z);
-            if (ret == 0) goto lab3; /* call standard_suffix, line 230 */
+    {   int m3 = z->l - z->c; (void)m3; /* do, line 230 */
+        {   int ret = r_standard_suffix(z); /* call standard_suffix, line 230 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
-        z->c = z->l - m4;
+        z->c = z->l - m3;
     }
-    {   int m5 = z->l - z->c; (void)m5; /* do, line 231 */
-        {   int m6 = z->l - z->c; (void)m6; /* or, line 231 */
+    {   int m4 = z->l - z->c; (void)m4; /* do, line 231 */
+        {   int m5 = z->l - z->c; (void)m5; /* or, line 231 */
             if (!(z->B[0])) goto lab6; /* Boolean test standard_suffix_removed, line 231 */
             goto lab5;
         lab6:
-            z->c = z->l - m6;
-            {   int ret = r_verb_suffix(z);
-                if (ret == 0) goto lab4; /* call verb_suffix, line 231 */
+            z->c = z->l - m5;
+            {   int ret = r_verb_suffix(z); /* call verb_suffix, line 231 */
+                if (ret == 0) goto lab4;
                 if (ret < 0) return ret;
             }
         }
     lab5:
     lab4:
-        z->c = z->l - m5;
+        z->c = z->l - m4;
     }
-    {   int m7 = z->l - z->c; (void)m7; /* do, line 232 */
-        {   int ret = r_vowel_suffix(z);
-            if (ret == 0) goto lab7; /* call vowel_suffix, line 232 */
+    {   int m6 = z->l - z->c; (void)m6; /* do, line 232 */
+        {   int ret = r_vowel_suffix(z); /* call vowel_suffix, line 232 */
+            if (ret == 0) goto lab7;
             if (ret < 0) return ret;
         }
     lab7:
-        z->c = z->l - m7;
+        z->c = z->l - m6;
     }
     z->c = z->lb;
-    {   int c8 = z->c; /* do, line 234 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab8; /* call postlude, line 234 */
+    {   int c7 = z->c; /* do, line 234 */
+        {   int ret = r_postlude(z); /* call postlude, line 234 */
+            if (ret == 0) goto lab8;
             if (ret < 0) return ret;
         }
     lab8:
-        z->c = c8;
+        z->c = c7;
     }
     return 1;
 }
diff --git a/src/backend/snowball/libstemmer/stem_KOI8_R_russian.c b/src/backend/snowball/libstemmer/stem_KOI8_R_russian.c
index be7feb752e..fea26a66cf 100644
--- a/src/backend/snowball/libstemmer/stem_KOI8_R_russian.c
+++ b/src/backend/snowball/libstemmer/stem_KOI8_R_russian.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -340,20 +340,11 @@ static const struct among a_7[4] =
 
 static const unsigned char g_v[] = { 35, 130, 34, 18 };
 
-static const symbol s_0[] = { 0xC1 };
-static const symbol s_1[] = { 0xD1 };
-static const symbol s_2[] = { 0xC1 };
-static const symbol s_3[] = { 0xD1 };
-static const symbol s_4[] = { 0xC1 };
-static const symbol s_5[] = { 0xD1 };
-static const symbol s_6[] = { 0xCE };
-static const symbol s_7[] = { 0xCE };
-static const symbol s_8[] = { 0xCE };
-static const symbol s_9[] = { 0xC9 };
+static const symbol s_0[] = { 0xC5 };
 
-static int r_mark_regions(struct SN_env * z) {
-    z->I[0] = z->l;
-    z->I[1] = z->l;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 61 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 62 */
     {   int c1 = z->c; /* do, line 63 */
         {    /* gopast */ /* grouping v, line 64 */
             int ret = out_grouping(z, g_v, 192, 220, 1);
@@ -383,27 +374,28 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 71 */
     return 1;
 }
 
-static int r_perfective_gerund(struct SN_env * z) {
+static int r_perfective_gerund(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 74 */
-    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((25166336 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_0, 9); /* substring, line 74 */
+    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((25166336 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 74 */
+    among_var = find_among_b(z, a_0, 9);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 74 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 74 */
         case 1:
             {   int m1 = z->l - z->c; (void)m1; /* or, line 78 */
-                if (!(eq_s_b(z, 1, s_0))) goto lab1;
+                if (z->c <= z->lb || z->p[z->c - 1] != 0xC1) goto lab1; /* literal, line 78 */
+                z->c--;
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                if (!(eq_s_b(z, 1, s_1))) return 0;
+                if (z->c <= z->lb || z->p[z->c - 1] != 0xD1) return 0; /* literal, line 78 */
+                z->c--;
             }
         lab0:
             {   int ret = slice_del(z); /* delete, line 78 */
@@ -419,45 +411,38 @@ static int r_perfective_gerund(struct SN_env * z) {
     return 1;
 }
 
-static int r_adjective(struct SN_env * z) {
-    int among_var;
+static int r_adjective(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 90 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((2271009 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_1, 26); /* substring, line 90 */
-    if (!(among_var)) return 0;
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((2271009 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 90 */
+    if (!(find_among_b(z, a_1, 26))) return 0;
     z->bra = z->c; /* ], line 90 */
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 99 */
-                if (ret < 0) return ret;
-            }
-            break;
+    {   int ret = slice_del(z); /* delete, line 99 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_adjectival(struct SN_env * z) {
+static int r_adjectival(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int ret = r_adjective(z);
-        if (ret == 0) return 0; /* call adjective, line 104 */
-        if (ret < 0) return ret;
+    {   int ret = r_adjective(z); /* call adjective, line 104 */
+        if (ret <= 0) return ret;
     }
-    {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 111 */
+    {   int m1 = z->l - z->c; (void)m1; /* try, line 111 */
         z->ket = z->c; /* [, line 112 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((671113216 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab0; }
-        among_var = find_among_b(z, a_2, 8); /* substring, line 112 */
-        if (!(among_var)) { z->c = z->l - m_keep; goto lab0; }
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((671113216 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m1; goto lab0; } /* substring, line 112 */
+        among_var = find_among_b(z, a_2, 8);
+        if (!(among_var)) { z->c = z->l - m1; goto lab0; }
         z->bra = z->c; /* ], line 112 */
-        switch(among_var) {
-            case 0: { z->c = z->l - m_keep; goto lab0; }
+        switch (among_var) { /* among, line 112 */
             case 1:
-                {   int m1 = z->l - z->c; (void)m1; /* or, line 117 */
-                    if (!(eq_s_b(z, 1, s_2))) goto lab2;
+                {   int m2 = z->l - z->c; (void)m2; /* or, line 117 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 0xC1) goto lab2; /* literal, line 117 */
+                    z->c--;
                     goto lab1;
                 lab2:
-                    z->c = z->l - m1;
-                    if (!(eq_s_b(z, 1, s_3))) { z->c = z->l - m_keep; goto lab0; }
+                    z->c = z->l - m2;
+                    if (z->c <= z->lb || z->p[z->c - 1] != 0xD1) { z->c = z->l - m1; goto lab0; } /* literal, line 117 */
+                    z->c--;
                 }
             lab1:
                 {   int ret = slice_del(z); /* delete, line 117 */
@@ -476,40 +461,34 @@ static int r_adjectival(struct SN_env * z) {
     return 1;
 }
 
-static int r_reflexive(struct SN_env * z) {
-    int among_var;
+static int r_reflexive(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 131 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 209 && z->p[z->c - 1] != 216)) return 0;
-    among_var = find_among_b(z, a_3, 2); /* substring, line 131 */
-    if (!(among_var)) return 0;
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 209 && z->p[z->c - 1] != 216)) return 0; /* substring, line 131 */
+    if (!(find_among_b(z, a_3, 2))) return 0;
     z->bra = z->c; /* ], line 131 */
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 134 */
-                if (ret < 0) return ret;
-            }
-            break;
+    {   int ret = slice_del(z); /* delete, line 134 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_verb(struct SN_env * z) {
+static int r_verb(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 139 */
-    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((51443235 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_4, 46); /* substring, line 139 */
+    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((51443235 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 139 */
+    among_var = find_among_b(z, a_4, 46);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 139 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 139 */
         case 1:
             {   int m1 = z->l - z->c; (void)m1; /* or, line 145 */
-                if (!(eq_s_b(z, 1, s_4))) goto lab1;
+                if (z->c <= z->lb || z->p[z->c - 1] != 0xC1) goto lab1; /* literal, line 145 */
+                z->c--;
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                if (!(eq_s_b(z, 1, s_5))) return 0;
+                if (z->c <= z->lb || z->p[z->c - 1] != 0xD1) return 0; /* literal, line 145 */
+                z->c--;
             }
         lab0:
             {   int ret = slice_del(z); /* delete, line 145 */
@@ -525,69 +504,56 @@ static int r_verb(struct SN_env * z) {
     return 1;
 }
 
-static int r_noun(struct SN_env * z) {
-    int among_var;
+static int r_noun(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 162 */
-    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((60991267 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_5, 36); /* substring, line 162 */
-    if (!(among_var)) return 0;
+    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((60991267 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 162 */
+    if (!(find_among_b(z, a_5, 36))) return 0;
     z->bra = z->c; /* ], line 162 */
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 169 */
-                if (ret < 0) return ret;
-            }
-            break;
+    {   int ret = slice_del(z); /* delete, line 169 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_derivational(struct SN_env * z) {
-    int among_var;
+static int r_derivational(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 178 */
-    if (z->c - 2 <= z->lb || (z->p[z->c - 1] != 212 && z->p[z->c - 1] != 216)) return 0;
-    among_var = find_among_b(z, a_6, 2); /* substring, line 178 */
-    if (!(among_var)) return 0;
+    if (z->c - 2 <= z->lb || (z->p[z->c - 1] != 212 && z->p[z->c - 1] != 216)) return 0; /* substring, line 178 */
+    if (!(find_among_b(z, a_6, 2))) return 0;
     z->bra = z->c; /* ], line 178 */
-    {   int ret = r_R2(z);
-        if (ret == 0) return 0; /* call R2, line 178 */
+    {   int ret = r_R2(z); /* call R2, line 178 */
+        if (ret <= 0) return ret;
+    }
+    {   int ret = slice_del(z); /* delete, line 181 */
         if (ret < 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 181 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
     return 1;
 }
 
-static int r_tidy_up(struct SN_env * z) {
+static int r_tidy_up(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 186 */
-    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((151011360 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_7, 4); /* substring, line 186 */
+    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 6 || !((151011360 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 186 */
+    among_var = find_among_b(z, a_7, 4);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 186 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 186 */
         case 1:
             {   int 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;
+            if (z->c <= z->lb || z->p[z->c - 1] != 0xCE) return 0; /* literal, line 191 */
+            z->c--;
             z->bra = z->c; /* ], line 191 */
-            if (!(eq_s_b(z, 1, s_7))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 0xCE) return 0; /* literal, line 191 */
+            z->c--;
             {   int 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;
+            if (z->c <= z->lb || z->p[z->c - 1] != 0xCE) return 0; /* literal, line 194 */
+            z->c--;
             {   int ret = slice_del(z); /* delete, line 194 */
                 if (ret < 0) return ret;
             }
@@ -601,94 +567,117 @@ static int r_tidy_up(struct SN_env * z) {
     return 1;
 }
 
-extern int russian_KOI8_R_stem(struct SN_env * z) {
-    {   int c1 = 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;
+extern int russian_KOI8_R_stem(struct SN_env * z) { /* forwardmode */
+    {   int c1 = z->c; /* do, line 205 */
+        while(1) { /* repeat, line 205 */
+            int c2 = z->c;
+            while(1) { /* goto, line 205 */
+                int c3 = z->c;
+                z->bra = z->c; /* [, line 205 */
+                if (z->c == z->l || z->p[z->c] != 0xA3) goto lab2; /* literal, line 205 */
+                z->c++;
+                z->ket = z->c; /* ], line 205 */
+                z->c = c3;
+                break;
+            lab2:
+                z->c = c3;
+                if (z->c >= z->l) goto lab1;
+                z->c++; /* goto, line 205 */
+            }
+            {   int ret = slice_from_s(z, 1, s_0); /* <-, line 205 */
+                if (ret < 0) return ret;
+            }
+            continue;
+        lab1:
+            z->c = c2;
+            break;
         }
-    lab0:
         z->c = c1;
     }
-    z->lb = z->c; z->c = z->l; /* backwards, line 204 */
+    /* do, line 207 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 207 */
+        if (ret == 0) goto lab3;
+        if (ret < 0) return ret;
+    }
+lab3:
+    z->lb = z->c; z->c = z->l; /* backwards, line 208 */
 
-    {   int mlimit; /* setlimit, line 204 */
-        int m2 = z->l - z->c; (void)m2;
+
+    {   int mlimit4; /* setlimit, line 208 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 204 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m2;
-        {   int m3 = z->l - z->c; (void)m3; /* do, line 205 */
-            {   int m4 = z->l - z->c; (void)m4; /* or, line 206 */
-                {   int ret = r_perfective_gerund(z);
-                    if (ret == 0) goto lab3; /* call perfective_gerund, line 206 */
+        mlimit4 = z->lb; z->lb = z->I[0];
+        {   int m5 = z->l - z->c; (void)m5; /* do, line 209 */
+            {   int m6 = z->l - z->c; (void)m6; /* or, line 210 */
+                {   int ret = r_perfective_gerund(z); /* call perfective_gerund, line 210 */
+                    if (ret == 0) goto lab6;
                     if (ret < 0) return ret;
                 }
-                goto lab2;
-            lab3:
-                z->c = z->l - m4;
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 207 */
-                    {   int ret = r_reflexive(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab4; } /* call reflexive, line 207 */
+                goto lab5;
+            lab6:
+                z->c = z->l - m6;
+                {   int m7 = z->l - z->c; (void)m7; /* try, line 211 */
+                    {   int ret = r_reflexive(z); /* call reflexive, line 211 */
+                        if (ret == 0) { z->c = z->l - m7; goto lab7; }
                         if (ret < 0) return ret;
                     }
-                lab4:
-                    ;
-                }
-                {   int m5 = z->l - z->c; (void)m5; /* 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 - m5;
-                    {   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 - m5;
-                    {   int ret = r_noun(z);
-                        if (ret == 0) goto lab1; /* call noun, line 208 */
+                    ;
+                }
+                {   int m8 = z->l - z->c; (void)m8; /* or, line 212 */
+                    {   int ret = r_adjectival(z); /* call adjectival, line 212 */
+                        if (ret == 0) goto lab9;
+                        if (ret < 0) return ret;
+                    }
+                    goto lab8;
+                lab9:
+                    z->c = z->l - m8;
+                    {   int ret = r_verb(z); /* call verb, line 212 */
+                        if (ret == 0) goto lab10;
+                        if (ret < 0) return ret;
+                    }
+                    goto lab8;
+                lab10:
+                    z->c = z->l - m8;
+                    {   int ret = r_noun(z); /* call noun, line 212 */
+                        if (ret == 0) goto lab4;
                         if (ret < 0) return ret;
                     }
                 }
-            lab5:
+            lab8:
                 ;
             }
-        lab2:
-        lab1:
-            z->c = z->l - m3;
+        lab5:
+        lab4:
+            z->c = z->l - m5;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 211 */
-            z->ket = z->c; /* [, line 211 */
-            if (!(eq_s_b(z, 1, s_9))) { z->c = z->l - m_keep; goto lab8; }
-            z->bra = z->c; /* ], line 211 */
-            {   int ret = slice_del(z); /* delete, line 211 */
+        {   int m9 = z->l - z->c; (void)m9; /* try, line 215 */
+            z->ket = z->c; /* [, line 215 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 0xC9) { z->c = z->l - m9; goto lab11; } /* literal, line 215 */
+            z->c--;
+            z->bra = z->c; /* ], line 215 */
+            {   int ret = slice_del(z); /* delete, line 215 */
                 if (ret < 0) return ret;
             }
-        lab8:
+        lab11:
             ;
         }
-        {   int m6 = z->l - z->c; (void)m6; /* do, line 214 */
-            {   int ret = r_derivational(z);
-                if (ret == 0) goto lab9; /* call derivational, line 214 */
+        {   int m10 = z->l - z->c; (void)m10; /* do, line 218 */
+            {   int ret = r_derivational(z); /* call derivational, line 218 */
+                if (ret == 0) goto lab12;
                 if (ret < 0) return ret;
             }
-        lab9:
-            z->c = z->l - m6;
+        lab12:
+            z->c = z->l - m10;
         }
-        {   int m7 = z->l - z->c; (void)m7; /* do, line 215 */
-            {   int ret = r_tidy_up(z);
-                if (ret == 0) goto lab10; /* call tidy_up, line 215 */
+        {   int m11 = z->l - z->c; (void)m11; /* do, line 219 */
+            {   int ret = r_tidy_up(z); /* call tidy_up, line 219 */
+                if (ret == 0) goto lab13;
                 if (ret < 0) return ret;
             }
-        lab10:
-            z->c = z->l - m7;
+        lab13:
+            z->c = z->l - m11;
         }
-        z->lb = mlimit;
+        z->lb = mlimit4;
     }
     z->c = z->lb;
     return 1;
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_danish.c b/src/backend/snowball/libstemmer/stem_UTF_8_danish.c
index cfd41376da..4f7e3016bb 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_danish.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_danish.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -132,15 +132,15 @@ static const symbol s_0[] = { 's', 't' };
 static const symbol s_1[] = { 'i', 'g' };
 static const 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 ret = skip_utf8(z->p, z->c, 0, z->l, + 3);
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 31 */
+    {   int c_test1 = z->c; /* test, line 33 */
+        {   int ret = skip_utf8(z->p, z->c, 0, z->l, + 3); /* hop, line 33 */
             if (ret < 0) return 0;
-            z->c = ret; /* hop, line 33 */
+            z->c = ret;
         }
         z->I[1] = z->c; /* setmark x, line 33 */
-        z->c = c_test;
+        z->c = c_test1;
     }
     if (out_grouping_U(z, g_v, 97, 248, 1) < 0) return 0; /* goto */ /* grouping v, line 34 */
     {    /* gopast */ /* non v, line 34 */
@@ -149,37 +149,34 @@ static int r_mark_regions(struct SN_env * z) {
         z->c += ret;
     }
     z->I[0] = z->c; /* setmark p1, line 34 */
-     /* try, line 35 */
-    if (!(z->I[0] < z->I[1])) goto lab0;
-    z->I[0] = z->I[1];
+    /* try, line 35 */
+    if (!(z->I[0] < z->I[1])) goto lab0; /* $(<integer expression> < <integer expression>), line 35 */
+    z->I[0] = z->I[1]; /* $p1 = <integer expression>, line 35 */
 lab0:
     return 1;
 }
 
-static int r_main_suffix(struct SN_env * z) {
+static int r_main_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 41 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 41 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 41 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 41 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851440 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_0, 32); /* substring, line 41 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851440 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 41 */
+        among_var = find_among_b(z, a_0, 32);
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 41 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 42 */
         case 1:
             {   int 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, 0)) return 0;
+            if (in_grouping_b_U(z, g_s_ending, 97, 229, 0)) return 0; /* grouping s_ending, line 50 */
             {   int ret = slice_del(z); /* delete, line 50 */
                 if (ret < 0) return ret;
             }
@@ -188,21 +185,19 @@ static int r_main_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_consonant_pair(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 55 */
-        {   int mlimit; /* setlimit, line 56 */
-            int m1 = z->l - z->c; (void)m1;
+static int r_consonant_pair(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 55 */
+
+        {   int mlimit2; /* setlimit, line 56 */
             if (z->c < z->I[0]) return 0;
-            z->c = z->I[0]; /* tomark, line 56 */
-            mlimit = z->lb; z->lb = z->c;
-            z->c = z->l - m1;
+            mlimit2 = z->lb; z->lb = z->I[0];
             z->ket = z->c; /* [, line 56 */
-            if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 116)) { z->lb = mlimit; return 0; }
-            if (!(find_among_b(z, a_1, 4))) { z->lb = mlimit; return 0; } /* substring, line 56 */
+            if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 116)) { z->lb = mlimit2; return 0; } /* substring, line 56 */
+            if (!(find_among_b(z, a_1, 4))) { z->lb = mlimit2; return 0; }
             z->bra = z->c; /* ], line 56 */
-            z->lb = mlimit;
+            z->lb = mlimit2;
         }
-        z->c = z->l - m_test;
+        z->c = z->l - m_test1;
     }
     {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
         if (ret < 0) return 0;
@@ -215,41 +210,38 @@ static int r_consonant_pair(struct SN_env * z) {
     return 1;
 }
 
-static int r_other_suffix(struct SN_env * z) {
+static int r_other_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     {   int m1 = z->l - z->c; (void)m1; /* do, line 66 */
         z->ket = z->c; /* [, line 66 */
-        if (!(eq_s_b(z, 2, s_0))) goto lab0;
+        if (!(eq_s_b(z, 2, s_0))) goto lab0; /* literal, line 66 */
         z->bra = z->c; /* ], line 66 */
-        if (!(eq_s_b(z, 2, s_1))) goto lab0;
+        if (!(eq_s_b(z, 2, s_1))) goto lab0; /* literal, line 66 */
         {   int ret = slice_del(z); /* delete, line 66 */
             if (ret < 0) return ret;
         }
     lab0:
         z->c = z->l - m1;
     }
-    {   int mlimit; /* setlimit, line 67 */
-        int m2 = z->l - z->c; (void)m2;
+
+    {   int mlimit2; /* setlimit, line 67 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 67 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m2;
+        mlimit2 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 67 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1572992 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_2, 5); /* substring, line 67 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1572992 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit2; return 0; } /* substring, line 67 */
+        among_var = find_among_b(z, a_2, 5);
+        if (!(among_var)) { z->lb = mlimit2; return 0; }
         z->bra = z->c; /* ], line 67 */
-        z->lb = mlimit;
+        z->lb = mlimit2;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 68 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 70 */
                 if (ret < 0) return ret;
             }
             {   int m3 = z->l - z->c; (void)m3; /* do, line 70 */
-                {   int ret = r_consonant_pair(z);
-                    if (ret == 0) goto lab1; /* call consonant_pair, line 70 */
+                {   int ret = r_consonant_pair(z); /* call consonant_pair, line 70 */
+                    if (ret == 0) goto lab1;
                     if (ret < 0) return ret;
                 }
             lab1:
@@ -265,19 +257,17 @@ static int r_other_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_undouble(struct SN_env * z) {
-    {   int mlimit; /* setlimit, line 76 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_undouble(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 76 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 76 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 76 */
-        if (out_grouping_b_U(z, g_v, 97, 248, 0)) { z->lb = mlimit; return 0; }
+        if (out_grouping_b_U(z, g_v, 97, 248, 0)) { z->lb = mlimit1; return 0; } /* non v, line 76 */
         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 = mlimit;
+        z->lb = mlimit1;
     }
     if (!(eq_v_b(z, z->S[0]))) return 0; /* name ch, line 77 */
     {   int ret = slice_del(z); /* delete, line 78 */
@@ -286,10 +276,10 @@ static int r_undouble(struct SN_env * z) {
     return 1;
 }
 
-extern int danish_UTF_8_stem(struct SN_env * z) {
+extern int danish_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 84 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab0; /* call mark_regions, line 84 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 84 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
@@ -298,32 +288,32 @@ extern int danish_UTF_8_stem(struct SN_env * z) {
     z->lb = z->c; z->c = z->l; /* backwards, line 85 */
 
     {   int m2 = z->l - z->c; (void)m2; /* do, line 86 */
-        {   int ret = r_main_suffix(z);
-            if (ret == 0) goto lab1; /* call main_suffix, line 86 */
+        {   int ret = r_main_suffix(z); /* call main_suffix, line 86 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
     {   int m3 = z->l - z->c; (void)m3; /* do, line 87 */
-        {   int ret = r_consonant_pair(z);
-            if (ret == 0) goto lab2; /* call consonant_pair, line 87 */
+        {   int ret = r_consonant_pair(z); /* call consonant_pair, line 87 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
         z->c = z->l - m3;
     }
     {   int m4 = z->l - z->c; (void)m4; /* do, line 88 */
-        {   int ret = r_other_suffix(z);
-            if (ret == 0) goto lab3; /* call other_suffix, line 88 */
+        {   int ret = r_other_suffix(z); /* call other_suffix, line 88 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
         z->c = z->l - m4;
     }
     {   int m5 = z->l - z->c; (void)m5; /* do, line 89 */
-        {   int ret = r_undouble(z);
-            if (ret == 0) goto lab4; /* call undouble, line 89 */
+        {   int ret = r_undouble(z); /* call undouble, line 89 */
+            if (ret == 0) goto lab4;
             if (ret < 0) return ret;
         }
     lab4:
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_dutch.c b/src/backend/snowball/libstemmer/stem_UTF_8_dutch.c
index f04c88d3e6..0a61174502 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_dutch.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_dutch.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -134,36 +134,28 @@ static const symbol s_1[] = { 'e' };
 static const symbol s_2[] = { 'i' };
 static const symbol s_3[] = { 'o' };
 static const symbol s_4[] = { 'u' };
-static const symbol s_5[] = { 'y' };
-static const symbol s_6[] = { 'Y' };
-static const symbol s_7[] = { 'i' };
-static const symbol s_8[] = { 'I' };
-static const symbol s_9[] = { 'y' };
-static const symbol s_10[] = { 'Y' };
-static const symbol s_11[] = { 'y' };
-static const symbol s_12[] = { 'i' };
-static const symbol s_13[] = { 'e' };
-static const symbol s_14[] = { 'g', 'e', 'm' };
-static const symbol s_15[] = { 'h', 'e', 'i', 'd' };
-static const symbol s_16[] = { 'h', 'e', 'i', 'd' };
-static const symbol s_17[] = { 'c' };
-static const symbol s_18[] = { 'e', 'n' };
-static const symbol s_19[] = { 'i', 'g' };
-static const symbol s_20[] = { 'e' };
-static const symbol s_21[] = { 'e' };
+static const symbol s_5[] = { 'Y' };
+static const symbol s_6[] = { 'I' };
+static const symbol s_7[] = { 'Y' };
+static const symbol s_8[] = { 'y' };
+static const symbol s_9[] = { 'i' };
+static const symbol s_10[] = { 'g', 'e', 'm' };
+static const symbol s_11[] = { 'h', 'e', 'i', 'd' };
+static const symbol s_12[] = { 'h', 'e', 'i', 'd' };
+static const symbol s_13[] = { 'e', 'n' };
+static const symbol s_14[] = { 'i', 'g' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     int among_var;
-    {   int c_test = z->c; /* test, line 42 */
+    {   int c_test1 = z->c; /* test, line 42 */
         while(1) { /* repeat, line 42 */
-            int c1 = z->c;
+            int c2 = z->c;
             z->bra = z->c; /* [, line 43 */
-            if (z->c + 1 >= z->l || z->p[z->c + 1] >> 5 != 5 || !((340306450 >> (z->p[z->c + 1] & 0x1f)) & 1)) among_var = 6; else
-            among_var = find_among(z, a_0, 11); /* substring, line 43 */
+            if (z->c + 1 >= z->l || z->p[z->c + 1] >> 5 != 5 || !((340306450 >> (z->p[z->c + 1] & 0x1f)) & 1)) among_var = 6; else /* substring, line 43 */
+            among_var = find_among(z, a_0, 11);
             if (!(among_var)) goto lab0;
             z->ket = z->c; /* ], line 43 */
-            switch(among_var) {
-                case 0: goto lab0;
+            switch (among_var) { /* among, line 43 */
                 case 1:
                     {   int ret = slice_from_s(z, 1, s_0); /* <-, line 45 */
                         if (ret < 0) return ret;
@@ -198,48 +190,51 @@ static int r_prelude(struct SN_env * z) {
             }
             continue;
         lab0:
-            z->c = c1;
+            z->c = c2;
             break;
         }
-        z->c = c_test;
+        z->c = c_test1;
     }
-    {   int c_keep = z->c; /* try, line 57 */
+    {   int c3 = z->c; /* try, line 57 */
         z->bra = z->c; /* [, line 57 */
-        if (!(eq_s(z, 1, s_5))) { z->c = c_keep; goto lab1; }
+        if (z->c == z->l || z->p[z->c] != 'y') { z->c = c3; goto lab1; } /* literal, line 57 */
+        z->c++;
         z->ket = z->c; /* ], line 57 */
-        {   int ret = slice_from_s(z, 1, s_6); /* <-, line 57 */
+        {   int ret = slice_from_s(z, 1, s_5); /* <-, line 57 */
             if (ret < 0) return ret;
         }
     lab1:
         ;
     }
     while(1) { /* repeat, line 58 */
-        int c2 = z->c;
+        int c4 = z->c;
         while(1) { /* goto, line 58 */
-            int c3 = z->c;
-            if (in_grouping_U(z, g_v, 97, 232, 0)) goto lab3;
+            int c5 = z->c;
+            if (in_grouping_U(z, g_v, 97, 232, 0)) goto lab3; /* grouping v, line 59 */
             z->bra = z->c; /* [, line 59 */
-            {   int c4 = z->c; /* or, line 59 */
-                if (!(eq_s(z, 1, s_7))) goto lab5;
+            {   int c6 = z->c; /* or, line 59 */
+                if (z->c == z->l || z->p[z->c] != 'i') goto lab5; /* literal, line 59 */
+                z->c++;
                 z->ket = z->c; /* ], line 59 */
-                if (in_grouping_U(z, g_v, 97, 232, 0)) goto lab5;
-                {   int ret = slice_from_s(z, 1, s_8); /* <-, line 59 */
+                if (in_grouping_U(z, g_v, 97, 232, 0)) goto lab5; /* grouping v, line 59 */
+                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 59 */
                     if (ret < 0) return ret;
                 }
                 goto lab4;
             lab5:
-                z->c = c4;
-                if (!(eq_s(z, 1, s_9))) goto lab3;
+                z->c = c6;
+                if (z->c == z->l || z->p[z->c] != 'y') goto lab3; /* literal, line 60 */
+                z->c++;
                 z->ket = z->c; /* ], line 60 */
-                {   int ret = slice_from_s(z, 1, s_10); /* <-, line 60 */
+                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 60 */
                     if (ret < 0) return ret;
                 }
             }
         lab4:
-            z->c = c3;
+            z->c = c5;
             break;
         lab3:
-            z->c = c3;
+            z->c = c5;
             {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
                 if (ret < 0) goto lab2;
                 z->c = ret; /* goto, line 58 */
@@ -247,15 +242,15 @@ static int r_prelude(struct SN_env * z) {
         }
         continue;
     lab2:
-        z->c = c2;
+        z->c = c4;
         break;
     }
     return 1;
 }
 
-static int r_mark_regions(struct SN_env * z) {
-    z->I[0] = z->l;
-    z->I[1] = z->l;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 66 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 67 */
     {    /* gopast */ /* grouping v, line 69 */
         int ret = out_grouping_U(z, g_v, 97, 232, 1);
         if (ret < 0) return 0;
@@ -267,9 +262,9 @@ static int r_mark_regions(struct SN_env * z) {
         z->c += ret;
     }
     z->I[0] = z->c; /* setmark p1, line 69 */
-     /* try, line 70 */
-    if (!(z->I[0] < 3)) goto lab0;
-    z->I[0] = 3;
+    /* try, line 70 */
+    if (!(z->I[0] < 3)) goto lab0; /* $(<integer expression> < <integer expression>), line 70 */
+    z->I[0] = 3; /* $p1 = <integer expression>, line 70 */
 lab0:
     {    /* gopast */ /* grouping v, line 71 */
         int ret = out_grouping_U(z, g_v, 97, 232, 1);
@@ -285,24 +280,23 @@ lab0:
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 75 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 77 */
-        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 89)) among_var = 3; else
-        among_var = find_among(z, a_1, 3); /* substring, line 77 */
+        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 89)) among_var = 3; else /* substring, line 77 */
+        among_var = find_among(z, a_1, 3);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 77 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 77 */
             case 1:
-                {   int ret = slice_from_s(z, 1, s_11); /* <-, line 78 */
+                {   int ret = slice_from_s(z, 1, s_8); /* <-, line 78 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_12); /* <-, line 79 */
+                {   int ret = slice_from_s(z, 1, s_9); /* <-, line 79 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -321,21 +315,21 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 87 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 88 */
     return 1;
 }
 
-static int r_undouble(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 91 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1050640 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-        if (!(find_among_b(z, a_2, 3))) return 0; /* among, line 91 */
-        z->c = z->l - m_test;
+static int r_undouble(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 91 */
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1050640 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* among, line 91 */
+        if (!(find_among_b(z, a_2, 3))) return 0;
+        z->c = z->l - m_test1;
     }
     z->ket = z->c; /* [, line 91 */
     {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
@@ -349,40 +343,38 @@ static int r_undouble(struct SN_env * z) {
     return 1;
 }
 
-static int r_e_ending(struct SN_env * z) {
+static int r_e_ending(struct SN_env * z) { /* backwardmode */
     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;
+    if (z->c <= z->lb || z->p[z->c - 1] != 'e') return 0; /* literal, line 96 */
+    z->c--;
     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 ret = r_R1(z); /* 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, 0)) return 0;
-        z->c = z->l - m_test;
+    {   int m_test1 = z->l - z->c; /* test, line 96 */
+        if (out_grouping_b_U(z, g_v, 97, 232, 0)) return 0; /* non v, line 96 */
+        z->c = z->l - m_test1;
     }
     {   int 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;
+    {   int ret = r_undouble(z); /* 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;
+static int r_en_ending(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_R1(z); /* call R1, line 102 */
+        if (ret <= 0) return ret;
     }
     {   int m1 = z->l - z->c; (void)m1; /* and, line 102 */
-        if (out_grouping_b_U(z, g_v, 97, 232, 0)) return 0;
+        if (out_grouping_b_U(z, g_v, 97, 232, 0)) return 0; /* non v, line 102 */
         z->c = z->l - m1;
         {   int m2 = z->l - z->c; (void)m2; /* not, line 102 */
-            if (!(eq_s_b(z, 3, s_14))) goto lab0;
+            if (!(eq_s_b(z, 3, s_10))) goto lab0; /* literal, line 102 */
             return 0;
         lab0:
             z->c = z->l - m2;
@@ -391,44 +383,42 @@ static int r_en_ending(struct SN_env * z) {
     {   int 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;
+    {   int ret = r_undouble(z); /* call undouble, line 103 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     {   int m1 = z->l - z->c; (void)m1; /* do, line 107 */
         z->ket = z->c; /* [, line 108 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((540704 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab0;
-        among_var = find_among_b(z, a_3, 5); /* substring, line 108 */
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((540704 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab0; /* substring, line 108 */
+        among_var = find_among_b(z, a_3, 5);
         if (!(among_var)) goto lab0;
         z->bra = z->c; /* ], line 108 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 108 */
             case 1:
-                {   int ret = r_R1(z);
-                    if (ret == 0) goto lab0; /* call R1, line 110 */
+                {   int ret = r_R1(z); /* call R1, line 110 */
+                    if (ret == 0) goto lab0;
                     if (ret < 0) return ret;
                 }
-                {   int ret = slice_from_s(z, 4, s_15); /* <-, line 110 */
+                {   int ret = slice_from_s(z, 4, s_11); /* <-, 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 */
+                {   int ret = r_en_ending(z); /* call en_ending, line 113 */
+                    if (ret == 0) goto lab0;
                     if (ret < 0) return ret;
                 }
                 break;
             case 3:
-                {   int ret = r_R1(z);
-                    if (ret == 0) goto lab0; /* call R1, line 116 */
+                {   int ret = r_R1(z); /* call R1, line 116 */
+                    if (ret == 0) goto lab0;
                     if (ret < 0) return ret;
                 }
-                if (out_grouping_b_U(z, g_v_j, 97, 232, 0)) goto lab0;
+                if (out_grouping_b_U(z, g_v_j, 97, 232, 0)) goto lab0; /* non v_j, line 116 */
                 {   int ret = slice_del(z); /* delete, line 116 */
                     if (ret < 0) return ret;
                 }
@@ -438,8 +428,8 @@ static int r_standard_suffix(struct SN_env * z) {
         z->c = z->l - m1;
     }
     {   int m2 = z->l - z->c; (void)m2; /* do, line 120 */
-        {   int ret = r_e_ending(z);
-            if (ret == 0) goto lab1; /* call e_ending, line 120 */
+        {   int ret = r_e_ending(z); /* call e_ending, line 120 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
@@ -447,14 +437,15 @@ static int r_standard_suffix(struct SN_env * z) {
     }
     {   int m3 = z->l - z->c; (void)m3; /* do, line 122 */
         z->ket = z->c; /* [, line 122 */
-        if (!(eq_s_b(z, 4, s_16))) goto lab2;
+        if (!(eq_s_b(z, 4, s_12))) goto lab2; /* literal, line 122 */
         z->bra = z->c; /* ], line 122 */
-        {   int ret = r_R2(z);
-            if (ret == 0) goto lab2; /* call R2, line 122 */
+        {   int ret = r_R2(z); /* call R2, line 122 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
         {   int m4 = z->l - z->c; (void)m4; /* not, line 122 */
-            if (!(eq_s_b(z, 1, s_17))) goto lab3;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'c') goto lab3; /* literal, line 122 */
+            z->c--;
             goto lab2;
         lab3:
             z->c = z->l - m4;
@@ -463,10 +454,10 @@ static int r_standard_suffix(struct SN_env * z) {
             if (ret < 0) return ret;
         }
         z->ket = z->c; /* [, line 123 */
-        if (!(eq_s_b(z, 2, s_18))) goto lab2;
+        if (!(eq_s_b(z, 2, s_13))) goto lab2; /* literal, line 123 */
         z->bra = z->c; /* ], line 123 */
-        {   int ret = r_en_ending(z);
-            if (ret == 0) goto lab2; /* call en_ending, line 123 */
+        {   int ret = r_en_ending(z); /* call en_ending, line 123 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
@@ -474,15 +465,14 @@ static int r_standard_suffix(struct SN_env * z) {
     }
     {   int m5 = z->l - z->c; (void)m5; /* do, line 126 */
         z->ket = z->c; /* [, line 127 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((264336 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab4;
-        among_var = find_among_b(z, a_4, 6); /* substring, line 127 */
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((264336 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab4; /* substring, line 127 */
+        among_var = find_among_b(z, a_4, 6);
         if (!(among_var)) goto lab4;
         z->bra = z->c; /* ], line 127 */
-        switch(among_var) {
-            case 0: goto lab4;
+        switch (among_var) { /* among, line 127 */
             case 1:
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab4; /* call R2, line 129 */
+                {   int ret = r_R2(z); /* call R2, line 129 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 129 */
@@ -490,14 +480,15 @@ static int r_standard_suffix(struct SN_env * z) {
                 }
                 {   int m6 = z->l - z->c; (void)m6; /* or, line 130 */
                     z->ket = z->c; /* [, line 130 */
-                    if (!(eq_s_b(z, 2, s_19))) goto lab6;
+                    if (!(eq_s_b(z, 2, s_14))) goto lab6; /* literal, line 130 */
                     z->bra = z->c; /* ], line 130 */
-                    {   int ret = r_R2(z);
-                        if (ret == 0) goto lab6; /* call R2, line 130 */
+                    {   int ret = r_R2(z); /* call R2, line 130 */
+                        if (ret == 0) goto lab6;
                         if (ret < 0) return ret;
                     }
                     {   int m7 = z->l - z->c; (void)m7; /* not, line 130 */
-                        if (!(eq_s_b(z, 1, s_20))) goto lab7;
+                        if (z->c <= z->lb || z->p[z->c - 1] != 'e') goto lab7; /* literal, line 130 */
+                        z->c--;
                         goto lab6;
                     lab7:
                         z->c = z->l - m7;
@@ -508,20 +499,21 @@ static int r_standard_suffix(struct SN_env * z) {
                     goto lab5;
                 lab6:
                     z->c = z->l - m6;
-                    {   int ret = r_undouble(z);
-                        if (ret == 0) goto lab4; /* call undouble, line 130 */
+                    {   int ret = r_undouble(z); /* call undouble, line 130 */
+                        if (ret == 0) goto lab4;
                         if (ret < 0) return ret;
                     }
                 }
             lab5:
                 break;
             case 2:
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab4; /* call R2, line 133 */
+                {   int ret = r_R2(z); /* call R2, line 133 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 {   int m8 = z->l - z->c; (void)m8; /* not, line 133 */
-                    if (!(eq_s_b(z, 1, s_21))) goto lab8;
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'e') goto lab8; /* literal, line 133 */
+                    z->c--;
                     goto lab4;
                 lab8:
                     z->c = z->l - m8;
@@ -531,21 +523,21 @@ static int r_standard_suffix(struct SN_env * z) {
                 }
                 break;
             case 3:
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab4; /* call R2, line 136 */
+                {   int ret = r_R2(z); /* call R2, line 136 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 {   int 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 */
+                {   int ret = r_e_ending(z); /* call e_ending, line 136 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 break;
             case 4:
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab4; /* call R2, line 139 */
+                {   int ret = r_R2(z); /* call R2, line 139 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 139 */
@@ -553,8 +545,8 @@ static int r_standard_suffix(struct SN_env * z) {
                 }
                 break;
             case 5:
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab4; /* call R2, line 142 */
+                {   int ret = r_R2(z); /* call R2, line 142 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
                 if (!(z->B[0])) goto lab4; /* Boolean test e_found, line 142 */
@@ -567,12 +559,12 @@ static int r_standard_suffix(struct SN_env * z) {
         z->c = z->l - m5;
     }
     {   int m9 = z->l - z->c; (void)m9; /* do, line 146 */
-        if (out_grouping_b_U(z, g_v_I, 73, 232, 0)) goto lab9;
-        {   int m_test = z->l - z->c; /* test, line 148 */
-            if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((2129954 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab9;
-            if (!(find_among_b(z, a_5, 4))) goto lab9; /* among, line 149 */
-            if (out_grouping_b_U(z, g_v, 97, 232, 0)) goto lab9;
-            z->c = z->l - m_test;
+        if (out_grouping_b_U(z, g_v_I, 73, 232, 0)) goto lab9; /* non v_I, line 147 */
+        {   int m_test10 = z->l - z->c; /* test, line 148 */
+            if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((2129954 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab9; /* among, line 149 */
+            if (!(find_among_b(z, a_5, 4))) goto lab9;
+            if (out_grouping_b_U(z, g_v, 97, 232, 0)) goto lab9; /* non v, line 150 */
+            z->c = z->l - m_test10;
         }
         z->ket = z->c; /* [, line 152 */
         {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
@@ -589,18 +581,18 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-extern int dutch_UTF_8_stem(struct SN_env * z) {
+extern int dutch_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 159 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 159 */
+        {   int ret = r_prelude(z); /* call prelude, line 159 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
     {   int c2 = z->c; /* do, line 160 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab1; /* call mark_regions, line 160 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 160 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
@@ -608,22 +600,20 @@ extern int dutch_UTF_8_stem(struct SN_env * z) {
     }
     z->lb = z->c; z->c = z->l; /* backwards, line 161 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* 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 - m3;
+    /* do, line 162 */
+    {   int ret = r_standard_suffix(z); /* call standard_suffix, line 162 */
+        if (ret == 0) goto lab2;
+        if (ret < 0) return ret;
     }
+lab2:
     z->c = z->lb;
-    {   int c4 = z->c; /* do, line 163 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab3; /* call postlude, line 163 */
+    {   int c3 = z->c; /* do, line 163 */
+        {   int ret = r_postlude(z); /* call postlude, line 163 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
-        z->c = c4;
+        z->c = c3;
     }
     return 1;
 }
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_english.c b/src/backend/snowball/libstemmer/stem_UTF_8_english.c
index c5d4c2a445..ae206f654f 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_english.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_english.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -153,12 +153,12 @@ static const 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},
+/*  3 */ { 2, s_5_3, -1, 15, 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},
+/*  7 */ { 5, s_5_7, 3, 9, 0},
+/*  8 */ { 6, s_5_8, 3, 14, 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},
@@ -317,62 +317,52 @@ static const unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 };
 
 static const unsigned char g_valid_LI[] = { 55, 141, 2 };
 
-static const symbol s_0[] = { '\'' };
-static const symbol s_1[] = { 'y' };
-static const symbol s_2[] = { 'Y' };
-static const symbol s_3[] = { 'y' };
-static const symbol s_4[] = { 'Y' };
-static const symbol s_5[] = { 's', 's' };
-static const symbol s_6[] = { 'i' };
-static const symbol s_7[] = { 'i', 'e' };
-static const symbol s_8[] = { 'e', 'e' };
-static const symbol s_9[] = { 'e' };
-static const symbol s_10[] = { 'e' };
-static const symbol s_11[] = { 'y' };
-static const symbol s_12[] = { 'Y' };
-static const symbol s_13[] = { 'i' };
-static const symbol s_14[] = { 't', 'i', 'o', 'n' };
-static const symbol s_15[] = { 'e', 'n', 'c', 'e' };
-static const symbol s_16[] = { 'a', 'n', 'c', 'e' };
-static const symbol s_17[] = { 'a', 'b', 'l', 'e' };
-static const symbol s_18[] = { 'e', 'n', 't' };
-static const symbol s_19[] = { 'i', 'z', 'e' };
-static const symbol s_20[] = { 'a', 't', 'e' };
-static const symbol s_21[] = { 'a', 'l' };
-static const symbol s_22[] = { 'f', 'u', 'l' };
-static const symbol s_23[] = { 'o', 'u', 's' };
-static const symbol s_24[] = { 'i', 'v', 'e' };
-static const symbol s_25[] = { 'b', 'l', 'e' };
-static const symbol s_26[] = { 'l' };
-static const symbol s_27[] = { 'o', 'g' };
-static const symbol s_28[] = { 'f', 'u', 'l' };
-static const symbol s_29[] = { 'l', 'e', 's', 's' };
-static const symbol s_30[] = { 't', 'i', 'o', 'n' };
-static const symbol s_31[] = { 'a', 't', 'e' };
-static const symbol s_32[] = { 'a', 'l' };
-static const symbol s_33[] = { 'i', 'c' };
-static const symbol s_34[] = { 's' };
-static const symbol s_35[] = { 't' };
-static const symbol s_36[] = { 'l' };
-static const symbol s_37[] = { 's', 'k', 'i' };
-static const symbol s_38[] = { 's', 'k', 'y' };
-static const symbol s_39[] = { 'd', 'i', 'e' };
-static const symbol s_40[] = { 'l', 'i', 'e' };
-static const symbol s_41[] = { 't', 'i', 'e' };
-static const symbol s_42[] = { 'i', 'd', 'l' };
-static const symbol s_43[] = { 'g', 'e', 'n', 't', 'l' };
-static const symbol s_44[] = { 'u', 'g', 'l', 'i' };
-static const symbol s_45[] = { 'e', 'a', 'r', 'l', 'i' };
-static const symbol s_46[] = { 'o', 'n', 'l', 'i' };
-static const symbol s_47[] = { 's', 'i', 'n', 'g', 'l' };
-static const symbol s_48[] = { 'Y' };
-static const symbol s_49[] = { 'y' };
+static const symbol s_0[] = { 'Y' };
+static const symbol s_1[] = { 'Y' };
+static const symbol s_2[] = { 's', 's' };
+static const symbol s_3[] = { 'i' };
+static const symbol s_4[] = { 'i', 'e' };
+static const symbol s_5[] = { 'e', 'e' };
+static const symbol s_6[] = { 'e' };
+static const symbol s_7[] = { 'e' };
+static const symbol s_8[] = { 'i' };
+static const symbol s_9[] = { 't', 'i', 'o', 'n' };
+static const symbol s_10[] = { 'e', 'n', 'c', 'e' };
+static const symbol s_11[] = { 'a', 'n', 'c', 'e' };
+static const symbol s_12[] = { 'a', 'b', 'l', 'e' };
+static const symbol s_13[] = { 'e', 'n', 't' };
+static const symbol s_14[] = { 'i', 'z', 'e' };
+static const symbol s_15[] = { 'a', 't', 'e' };
+static const symbol s_16[] = { 'a', 'l' };
+static const symbol s_17[] = { 'f', 'u', 'l' };
+static const symbol s_18[] = { 'o', 'u', 's' };
+static const symbol s_19[] = { 'i', 'v', 'e' };
+static const symbol s_20[] = { 'b', 'l', 'e' };
+static const symbol s_21[] = { 'o', 'g' };
+static const symbol s_22[] = { 'l', 'e', 's', 's' };
+static const symbol s_23[] = { 't', 'i', 'o', 'n' };
+static const symbol s_24[] = { 'a', 't', 'e' };
+static const symbol s_25[] = { 'a', 'l' };
+static const symbol s_26[] = { 'i', 'c' };
+static const symbol s_27[] = { 's', 'k', 'i' };
+static const symbol s_28[] = { 's', 'k', 'y' };
+static const symbol s_29[] = { 'd', 'i', 'e' };
+static const symbol s_30[] = { 'l', 'i', 'e' };
+static const symbol s_31[] = { 't', 'i', 'e' };
+static const symbol s_32[] = { 'i', 'd', 'l' };
+static const symbol s_33[] = { 'g', 'e', 'n', 't', 'l' };
+static const symbol s_34[] = { 'u', 'g', 'l', 'i' };
+static const symbol s_35[] = { 'e', 'a', 'r', 'l', 'i' };
+static const symbol s_36[] = { 'o', 'n', 'l', 'i' };
+static const symbol s_37[] = { 's', 'i', 'n', 'g', 'l' };
+static const symbol s_38[] = { 'y' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     z->B[0] = 0; /* unset Y_found, line 26 */
     {   int c1 = z->c; /* do, line 27 */
         z->bra = z->c; /* [, line 27 */
-        if (!(eq_s(z, 1, s_0))) goto lab0;
+        if (z->c == z->l || z->p[z->c] != '\'') goto lab0; /* literal, line 27 */
+        z->c++;
         z->ket = z->c; /* ], line 27 */
         {   int ret = slice_del(z); /* delete, line 27 */
             if (ret < 0) return ret;
@@ -382,9 +372,10 @@ static int r_prelude(struct SN_env * z) {
     }
     {   int c2 = z->c; /* do, line 28 */
         z->bra = z->c; /* [, line 28 */
-        if (!(eq_s(z, 1, s_1))) goto lab1;
+        if (z->c == z->l || z->p[z->c] != 'y') goto lab1; /* literal, line 28 */
+        z->c++;
         z->ket = z->c; /* ], line 28 */
-        {   int ret = slice_from_s(z, 1, s_2); /* <-, line 28 */
+        {   int ret = slice_from_s(z, 1, s_0); /* <-, line 28 */
             if (ret < 0) return ret;
         }
         z->B[0] = 1; /* set Y_found, line 28 */
@@ -396,9 +387,10 @@ static int r_prelude(struct SN_env * z) {
             int c4 = z->c;
             while(1) { /* goto, line 29 */
                 int c5 = z->c;
-                if (in_grouping_U(z, g_v, 97, 121, 0)) goto lab4;
+                if (in_grouping_U(z, g_v, 97, 121, 0)) goto lab4; /* grouping v, line 29 */
                 z->bra = z->c; /* [, line 29 */
-                if (!(eq_s(z, 1, s_3))) goto lab4;
+                if (z->c == z->l || z->p[z->c] != 'y') goto lab4; /* literal, line 29 */
+                z->c++;
                 z->ket = z->c; /* ], line 29 */
                 z->c = c5;
                 break;
@@ -409,7 +401,7 @@ static int r_prelude(struct SN_env * z) {
                     z->c = ret; /* goto, line 29 */
                 }
             }
-            {   int ret = slice_from_s(z, 1, s_4); /* <-, line 29 */
+            {   int ret = slice_from_s(z, 1, s_1); /* <-, line 29 */
                 if (ret < 0) return ret;
             }
             z->B[0] = 1; /* set Y_found, line 29 */
@@ -423,13 +415,13 @@ static int r_prelude(struct SN_env * z) {
     return 1;
 }
 
-static int r_mark_regions(struct SN_env * z) {
-    z->I[0] = z->l;
-    z->I[1] = z->l;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 33 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 34 */
     {   int c1 = z->c; /* do, line 35 */
         {   int c2 = z->c; /* or, line 41 */
-            if (z->c + 4 >= z->l || z->p[z->c + 4] >> 5 != 3 || !((2375680 >> (z->p[z->c + 4] & 0x1f)) & 1)) goto lab2;
-            if (!(find_among(z, a_0, 3))) goto lab2; /* among, line 36 */
+            if (z->c + 4 >= z->l || z->p[z->c + 4] >> 5 != 3 || !((2375680 >> (z->p[z->c + 4] & 0x1f)) & 1)) goto lab2; /* among, line 36 */
+            if (!(find_among(z, a_0, 3))) goto lab2;
             goto lab1;
         lab2:
             z->c = c2;
@@ -463,76 +455,69 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_shortv(struct SN_env * z) {
+static int r_shortv(struct SN_env * z) { /* backwardmode */
     {   int m1 = z->l - z->c; (void)m1; /* or, line 51 */
-        if (out_grouping_b_U(z, g_v_WXY, 89, 121, 0)) goto lab1;
-        if (in_grouping_b_U(z, g_v, 97, 121, 0)) goto lab1;
-        if (out_grouping_b_U(z, g_v, 97, 121, 0)) goto lab1;
+        if (out_grouping_b_U(z, g_v_WXY, 89, 121, 0)) goto lab1; /* non v_WXY, line 50 */
+        if (in_grouping_b_U(z, g_v, 97, 121, 0)) goto lab1; /* grouping v, line 50 */
+        if (out_grouping_b_U(z, g_v, 97, 121, 0)) goto lab1; /* non v, line 50 */
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        if (out_grouping_b_U(z, g_v, 97, 121, 0)) return 0;
-        if (in_grouping_b_U(z, g_v, 97, 121, 0)) return 0;
+        if (out_grouping_b_U(z, g_v, 97, 121, 0)) return 0; /* non v, line 52 */
+        if (in_grouping_b_U(z, g_v, 97, 121, 0)) return 0; /* grouping v, line 52 */
         if (z->c > z->lb) return 0; /* atlimit, line 52 */
     }
 lab0:
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 55 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 56 */
     return 1;
 }
 
-static int r_Step_1a(struct SN_env * z) {
+static int r_Step_1a(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 59 */
+    {   int m1 = z->l - z->c; (void)m1; /* try, line 59 */
         z->ket = z->c; /* [, line 60 */
-        if (z->c <= z->lb || (z->p[z->c - 1] != 39 && z->p[z->c - 1] != 115)) { z->c = z->l - m_keep; goto lab0; }
-        among_var = find_among_b(z, a_1, 3); /* substring, line 60 */
-        if (!(among_var)) { z->c = z->l - m_keep; goto lab0; }
+        if (z->c <= z->lb || (z->p[z->c - 1] != 39 && z->p[z->c - 1] != 115)) { z->c = z->l - m1; goto lab0; } /* substring, line 60 */
+        if (!(find_among_b(z, a_1, 3))) { z->c = z->l - m1; goto lab0; }
         z->bra = z->c; /* ], line 60 */
-        switch(among_var) {
-            case 0: { z->c = z->l - m_keep; goto lab0; }
-            case 1:
-                {   int ret = slice_del(z); /* delete, line 62 */
-                    if (ret < 0) return ret;
-                }
-                break;
+        {   int ret = slice_del(z); /* delete, line 62 */
+            if (ret < 0) return ret;
         }
     lab0:
         ;
     }
     z->ket = z->c; /* [, line 65 */
-    if (z->c <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 115)) return 0;
-    among_var = find_among_b(z, a_2, 6); /* substring, line 65 */
+    if (z->c <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 115)) return 0; /* substring, line 65 */
+    among_var = find_among_b(z, a_2, 6);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 65 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 65 */
         case 1:
-            {   int ret = slice_from_s(z, 2, s_5); /* <-, line 66 */
+            {   int ret = slice_from_s(z, 2, s_2); /* <-, line 66 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int m1 = z->l - z->c; (void)m1; /* or, line 68 */
-                {   int ret = skip_utf8(z->p, z->c, z->lb, z->l, - 2);
+            {   int m2 = z->l - z->c; (void)m2; /* or, line 68 */
+                {   int ret = skip_utf8(z->p, z->c, z->lb, z->l, - 2); /* hop, line 68 */
                     if (ret < 0) goto lab2;
-                    z->c = ret; /* hop, line 68 */
+                    z->c = ret;
                 }
-                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 68 */
+                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 68 */
                     if (ret < 0) return ret;
                 }
                 goto lab1;
             lab2:
-                z->c = z->l - m1;
-                {   int ret = slice_from_s(z, 2, s_7); /* <-, line 68 */
+                z->c = z->l - m2;
+                {   int ret = slice_from_s(z, 2, s_4); /* <-, line 68 */
                     if (ret < 0) return ret;
                 }
             }
@@ -556,48 +541,47 @@ static int r_Step_1a(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_1b(struct SN_env * z) {
+static int r_Step_1b(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 75 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((33554576 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_4, 6); /* substring, line 75 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((33554576 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 75 */
+    among_var = find_among_b(z, a_4, 6);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 75 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 75 */
         case 1:
-            {   int ret = r_R1(z);
-                if (ret == 0) return 0; /* call R1, line 77 */
-                if (ret < 0) return ret;
+            {   int ret = r_R1(z); /* call R1, line 77 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 2, s_8); /* <-, line 77 */
+            {   int ret = slice_from_s(z, 2, s_5); /* <-, line 77 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int m_test = z->l - z->c; /* test, line 80 */
+            {   int m_test1 = z->l - z->c; /* test, line 80 */
                 {    /* gopast */ /* grouping v, line 80 */
                     int ret = out_grouping_b_U(z, g_v, 97, 121, 1);
                     if (ret < 0) return 0;
                     z->c -= ret;
                 }
-                z->c = z->l - m_test;
+                z->c = z->l - m_test1;
             }
             {   int ret = slice_del(z); /* delete, line 80 */
                 if (ret < 0) return ret;
             }
-            {   int m_test = z->l - z->c; /* test, line 81 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68514004 >> (z->p[z->c - 1] & 0x1f)) & 1)) among_var = 3; else
-                among_var = find_among_b(z, a_3, 13); /* substring, line 81 */
+            {   int m_test2 = z->l - z->c; /* test, line 81 */
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68514004 >> (z->p[z->c - 1] & 0x1f)) & 1)) among_var = 3; else /* substring, line 81 */
+                among_var = find_among_b(z, a_3, 13);
                 if (!(among_var)) return 0;
-                z->c = z->l - m_test;
+                z->c = z->l - m_test2;
             }
-            switch(among_var) {
-                case 0: return 0;
+            switch (among_var) { /* among, line 81 */
                 case 1:
-                    {   int c_keep = z->c;
-                        int ret = insert_s(z, z->c, z->c, 1, s_9); /* <+, line 83 */
-                        z->c = c_keep;
+                    {   int ret;
+                        {   int saved_c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_6); /* <+, line 83 */
+                            z->c = saved_c;
+                        }
                         if (ret < 0) return ret;
                     }
                     break;
@@ -614,16 +598,17 @@ static int r_Step_1b(struct SN_env * z) {
                     break;
                 case 3:
                     if (z->c != z->I[0]) return 0; /* atmark, line 87 */
-                    {   int m_test = z->l - z->c; /* test, line 87 */
-                        {   int ret = r_shortv(z);
-                            if (ret == 0) return 0; /* call shortv, line 87 */
-                            if (ret < 0) return ret;
+                    {   int m_test3 = z->l - z->c; /* test, line 87 */
+                        {   int ret = r_shortv(z); /* call shortv, line 87 */
+                            if (ret <= 0) return ret;
                         }
-                        z->c = z->l - m_test;
+                        z->c = z->l - m_test3;
                     }
-                    {   int c_keep = z->c;
-                        int ret = insert_s(z, z->c, z->c, 1, s_10); /* <+, line 87 */
-                        z->c = c_keep;
+                    {   int ret;
+                        {   int saved_c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_7); /* <+, line 87 */
+                            z->c = saved_c;
+                        }
                         if (ret < 0) return ret;
                     }
                     break;
@@ -633,121 +618,115 @@ static int r_Step_1b(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_1c(struct SN_env * z) {
+static int r_Step_1c(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 94 */
     {   int m1 = z->l - z->c; (void)m1; /* or, line 94 */
-        if (!(eq_s_b(z, 1, s_11))) goto lab1;
+        if (z->c <= z->lb || z->p[z->c - 1] != 'y') goto lab1; /* literal, line 94 */
+        z->c--;
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        if (!(eq_s_b(z, 1, s_12))) return 0;
+        if (z->c <= z->lb || z->p[z->c - 1] != 'Y') return 0; /* literal, line 94 */
+        z->c--;
     }
 lab0:
     z->bra = z->c; /* ], line 94 */
-    if (out_grouping_b_U(z, g_v, 97, 121, 0)) return 0;
-    {   int m2 = z->l - z->c; (void)m2; /* not, line 95 */
-        if (z->c > z->lb) goto lab2; /* atlimit, line 95 */
-        return 0;
-    lab2:
-        z->c = z->l - m2;
-    }
-    {   int ret = slice_from_s(z, 1, s_13); /* <-, line 96 */
+    if (out_grouping_b_U(z, g_v, 97, 121, 0)) return 0; /* non v, line 95 */
+    /* not, line 95 */
+    if (z->c > z->lb) goto lab2; /* atlimit, line 95 */
+    return 0;
+lab2:
+    {   int ret = slice_from_s(z, 1, s_8); /* <-, line 96 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_Step_2(struct SN_env * z) {
+static int r_Step_2(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 100 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((815616 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_5, 24); /* substring, line 100 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((815616 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 100 */
+    among_var = find_among_b(z, a_5, 24);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 100 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 100 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 100 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 100 */
         case 1:
-            {   int ret = slice_from_s(z, 4, s_14); /* <-, line 101 */
+            {   int ret = slice_from_s(z, 4, s_9); /* <-, line 101 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 4, s_15); /* <-, line 102 */
+            {   int ret = slice_from_s(z, 4, s_10); /* <-, line 102 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 4, s_16); /* <-, line 103 */
+            {   int ret = slice_from_s(z, 4, s_11); /* <-, line 103 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 4, s_17); /* <-, line 104 */
+            {   int ret = slice_from_s(z, 4, s_12); /* <-, line 104 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
-            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 105 */
+            {   int ret = slice_from_s(z, 3, s_13); /* <-, line 105 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            {   int ret = slice_from_s(z, 3, s_19); /* <-, line 107 */
+            {   int ret = slice_from_s(z, 3, s_14); /* <-, line 107 */
                 if (ret < 0) return ret;
             }
             break;
         case 7:
-            {   int ret = slice_from_s(z, 3, s_20); /* <-, line 109 */
+            {   int ret = slice_from_s(z, 3, s_15); /* <-, line 109 */
                 if (ret < 0) return ret;
             }
             break;
         case 8:
-            {   int ret = slice_from_s(z, 2, s_21); /* <-, line 111 */
+            {   int ret = slice_from_s(z, 2, s_16); /* <-, line 111 */
                 if (ret < 0) return ret;
             }
             break;
         case 9:
-            {   int ret = slice_from_s(z, 3, s_22); /* <-, line 112 */
+            {   int ret = slice_from_s(z, 3, s_17); /* <-, line 112 */
                 if (ret < 0) return ret;
             }
             break;
         case 10:
-            {   int ret = slice_from_s(z, 3, s_23); /* <-, line 114 */
+            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 114 */
                 if (ret < 0) return ret;
             }
             break;
         case 11:
-            {   int ret = slice_from_s(z, 3, s_24); /* <-, line 116 */
+            {   int ret = slice_from_s(z, 3, s_19); /* <-, line 116 */
                 if (ret < 0) return ret;
             }
             break;
         case 12:
-            {   int ret = slice_from_s(z, 3, s_25); /* <-, line 118 */
+            {   int ret = slice_from_s(z, 3, s_20); /* <-, line 118 */
                 if (ret < 0) return ret;
             }
             break;
         case 13:
-            if (!(eq_s_b(z, 1, s_26))) return 0;
-            {   int ret = slice_from_s(z, 2, s_27); /* <-, line 119 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'l') return 0; /* literal, line 119 */
+            z->c--;
+            {   int ret = slice_from_s(z, 2, s_21); /* <-, line 119 */
                 if (ret < 0) return ret;
             }
             break;
         case 14:
-            {   int ret = slice_from_s(z, 3, s_28); /* <-, line 120 */
+            {   int ret = slice_from_s(z, 4, s_22); /* <-, line 121 */
                 if (ret < 0) return ret;
             }
             break;
         case 15:
-            {   int ret = slice_from_s(z, 4, s_29); /* <-, line 121 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 16:
-            if (in_grouping_b_U(z, g_valid_LI, 99, 116, 0)) return 0;
+            if (in_grouping_b_U(z, g_valid_LI, 99, 116, 0)) return 0; /* grouping valid_LI, line 122 */
             {   int ret = slice_del(z); /* delete, line 122 */
                 if (ret < 0) return ret;
             }
@@ -756,36 +735,34 @@ static int r_Step_2(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_3(struct SN_env * z) {
+static int r_Step_3(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 127 */
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((528928 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_6, 9); /* substring, line 127 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((528928 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 127 */
+    among_var = find_among_b(z, a_6, 9);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 127 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 127 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 127 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 127 */
         case 1:
-            {   int ret = slice_from_s(z, 4, s_30); /* <-, line 128 */
+            {   int ret = slice_from_s(z, 4, s_23); /* <-, line 128 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 3, s_31); /* <-, line 129 */
+            {   int ret = slice_from_s(z, 3, s_24); /* <-, line 129 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 2, s_32); /* <-, line 130 */
+            {   int ret = slice_from_s(z, 2, s_25); /* <-, line 130 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 2, s_33); /* <-, line 132 */
+            {   int ret = slice_from_s(z, 2, s_26); /* <-, line 132 */
                 if (ret < 0) return ret;
             }
             break;
@@ -795,9 +772,8 @@ static int r_Step_3(struct SN_env * z) {
             }
             break;
         case 6:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 136 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 136 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 136 */
                 if (ret < 0) return ret;
@@ -807,19 +783,17 @@ static int r_Step_3(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_4(struct SN_env * z) {
+static int r_Step_4(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 141 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1864232 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_7, 18); /* substring, line 141 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1864232 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 141 */
+    among_var = find_among_b(z, a_7, 18);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 141 */
-    {   int ret = r_R2(z);
-        if (ret == 0) return 0; /* call R2, line 141 */
-        if (ret < 0) return ret;
+    {   int ret = r_R2(z); /* call R2, line 141 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 141 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 144 */
                 if (ret < 0) return ret;
@@ -827,11 +801,13 @@ static int r_Step_4(struct SN_env * z) {
             break;
         case 2:
             {   int m1 = z->l - z->c; (void)m1; /* or, line 145 */
-                if (!(eq_s_b(z, 1, s_34))) goto lab1;
+                if (z->c <= z->lb || z->p[z->c - 1] != 's') goto lab1; /* literal, line 145 */
+                z->c--;
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                if (!(eq_s_b(z, 1, s_35))) return 0;
+                if (z->c <= z->lb || z->p[z->c - 1] != 't') return 0; /* literal, line 145 */
+                z->c--;
             }
         lab0:
             {   int ret = slice_del(z); /* delete, line 145 */
@@ -842,31 +818,29 @@ static int r_Step_4(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_5(struct SN_env * z) {
+static int r_Step_5(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 150 */
-    if (z->c <= z->lb || (z->p[z->c - 1] != 101 && z->p[z->c - 1] != 108)) return 0;
-    among_var = find_among_b(z, a_8, 2); /* substring, line 150 */
+    if (z->c <= z->lb || (z->p[z->c - 1] != 101 && z->p[z->c - 1] != 108)) return 0; /* substring, line 150 */
+    among_var = find_among_b(z, a_8, 2);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 150 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 150 */
         case 1:
             {   int m1 = z->l - z->c; (void)m1; /* or, line 151 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab1; /* call R2, line 151 */
+                {   int ret = r_R2(z); /* call R2, line 151 */
+                    if (ret == 0) goto lab1;
                     if (ret < 0) return ret;
                 }
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                {   int ret = r_R1(z);
-                    if (ret == 0) return 0; /* call R1, line 151 */
-                    if (ret < 0) return ret;
+                {   int ret = r_R1(z); /* call R1, line 151 */
+                    if (ret <= 0) return ret;
                 }
                 {   int m2 = z->l - z->c; (void)m2; /* not, line 151 */
-                    {   int ret = r_shortv(z);
-                        if (ret == 0) goto lab2; /* call shortv, line 151 */
+                    {   int ret = r_shortv(z); /* call shortv, line 151 */
+                        if (ret == 0) goto lab2;
                         if (ret < 0) return ret;
                     }
                     return 0;
@@ -880,11 +854,11 @@ static int r_Step_5(struct SN_env * z) {
             }
             break;
         case 2:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 152 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 152 */
+                if (ret <= 0) return ret;
             }
-            if (!(eq_s_b(z, 1, s_36))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'l') return 0; /* literal, line 152 */
+            z->c--;
             {   int ret = slice_del(z); /* delete, line 152 */
                 if (ret < 0) return ret;
             }
@@ -893,77 +867,76 @@ static int r_Step_5(struct SN_env * z) {
     return 1;
 }
 
-static int r_exception2(struct SN_env * z) {
+static int r_exception2(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 158 */
-    if (z->c - 5 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 103)) return 0;
-    if (!(find_among_b(z, a_9, 8))) return 0; /* substring, line 158 */
+    if (z->c - 5 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 103)) return 0; /* substring, line 158 */
+    if (!(find_among_b(z, a_9, 8))) return 0;
     z->bra = z->c; /* ], line 158 */
     if (z->c > z->lb) return 0; /* atlimit, line 158 */
     return 1;
 }
 
-static int r_exception1(struct SN_env * z) {
+static int r_exception1(struct SN_env * z) { /* forwardmode */
     int among_var;
     z->bra = z->c; /* [, line 170 */
-    if (z->c + 2 >= z->l || z->p[z->c + 2] >> 5 != 3 || !((42750482 >> (z->p[z->c + 2] & 0x1f)) & 1)) return 0;
-    among_var = find_among(z, a_10, 18); /* substring, line 170 */
+    if (z->c + 2 >= z->l || z->p[z->c + 2] >> 5 != 3 || !((42750482 >> (z->p[z->c + 2] & 0x1f)) & 1)) return 0; /* substring, line 170 */
+    among_var = find_among(z, a_10, 18);
     if (!(among_var)) return 0;
     z->ket = z->c; /* ], line 170 */
     if (z->c < z->l) return 0; /* atlimit, line 170 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 170 */
         case 1:
-            {   int ret = slice_from_s(z, 3, s_37); /* <-, line 174 */
+            {   int ret = slice_from_s(z, 3, s_27); /* <-, line 174 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 3, s_38); /* <-, line 175 */
+            {   int ret = slice_from_s(z, 3, s_28); /* <-, line 175 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 3, s_39); /* <-, line 176 */
+            {   int ret = slice_from_s(z, 3, s_29); /* <-, line 176 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 3, s_40); /* <-, line 177 */
+            {   int ret = slice_from_s(z, 3, s_30); /* <-, line 177 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
-            {   int ret = slice_from_s(z, 3, s_41); /* <-, line 178 */
+            {   int ret = slice_from_s(z, 3, s_31); /* <-, line 178 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            {   int ret = slice_from_s(z, 3, s_42); /* <-, line 182 */
+            {   int ret = slice_from_s(z, 3, s_32); /* <-, line 182 */
                 if (ret < 0) return ret;
             }
             break;
         case 7:
-            {   int ret = slice_from_s(z, 5, s_43); /* <-, line 183 */
+            {   int ret = slice_from_s(z, 5, s_33); /* <-, line 183 */
                 if (ret < 0) return ret;
             }
             break;
         case 8:
-            {   int ret = slice_from_s(z, 4, s_44); /* <-, line 184 */
+            {   int ret = slice_from_s(z, 4, s_34); /* <-, line 184 */
                 if (ret < 0) return ret;
             }
             break;
         case 9:
-            {   int ret = slice_from_s(z, 5, s_45); /* <-, line 185 */
+            {   int ret = slice_from_s(z, 5, s_35); /* <-, line 185 */
                 if (ret < 0) return ret;
             }
             break;
         case 10:
-            {   int ret = slice_from_s(z, 4, s_46); /* <-, line 186 */
+            {   int ret = slice_from_s(z, 4, s_36); /* <-, line 186 */
                 if (ret < 0) return ret;
             }
             break;
         case 11:
-            {   int ret = slice_from_s(z, 5, s_47); /* <-, line 187 */
+            {   int ret = slice_from_s(z, 5, s_37); /* <-, line 187 */
                 if (ret < 0) return ret;
             }
             break;
@@ -971,14 +944,15 @@ static int r_exception1(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     if (!(z->B[0])) return 0; /* Boolean test Y_found, line 203 */
     while(1) { /* repeat, line 203 */
         int c1 = z->c;
         while(1) { /* goto, line 203 */
             int c2 = z->c;
             z->bra = z->c; /* [, line 203 */
-            if (!(eq_s(z, 1, s_48))) goto lab1;
+            if (z->c == z->l || z->p[z->c] != 'Y') goto lab1; /* literal, line 203 */
+            z->c++;
             z->ket = z->c; /* ], line 203 */
             z->c = c2;
             break;
@@ -989,7 +963,7 @@ static int r_postlude(struct SN_env * z) {
                 z->c = ret; /* goto, line 203 */
             }
         }
-        {   int ret = slice_from_s(z, 1, s_49); /* <-, line 203 */
+        {   int ret = slice_from_s(z, 1, s_38); /* <-, line 203 */
             if (ret < 0) return ret;
         }
         continue;
@@ -1000,19 +974,19 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-extern int english_UTF_8_stem(struct SN_env * z) {
+extern int english_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* or, line 207 */
-        {   int ret = r_exception1(z);
-            if (ret == 0) goto lab1; /* call exception1, line 207 */
+        {   int ret = r_exception1(z); /* call exception1, line 207 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
         goto lab0;
     lab1:
         z->c = c1;
         {   int c2 = z->c; /* not, line 208 */
-            {   int ret = skip_utf8(z->p, z->c, 0, z->l, + 3);
+            {   int ret = skip_utf8(z->p, z->c, 0, z->l, + 3); /* hop, line 208 */
                 if (ret < 0) goto lab3;
-                z->c = ret; /* hop, line 208 */
+                z->c = ret;
             }
             goto lab2;
         lab3:
@@ -1021,98 +995,94 @@ extern int english_UTF_8_stem(struct SN_env * z) {
         goto lab0;
     lab2:
         z->c = c1;
-        {   int c3 = z->c; /* do, line 209 */
-            {   int ret = r_prelude(z);
-                if (ret == 0) goto lab4; /* call prelude, line 209 */
-                if (ret < 0) return ret;
-            }
-        lab4:
-            z->c = c3;
+        /* do, line 209 */
+        {   int ret = r_prelude(z); /* call prelude, line 209 */
+            if (ret == 0) goto lab4;
+            if (ret < 0) return ret;
         }
-        {   int c4 = z->c; /* do, line 210 */
-            {   int ret = r_mark_regions(z);
-                if (ret == 0) goto lab5; /* call mark_regions, line 210 */
-                if (ret < 0) return ret;
-            }
-        lab5:
-            z->c = c4;
+    lab4:
+        /* do, line 210 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 210 */
+            if (ret == 0) goto lab5;
+            if (ret < 0) return ret;
         }
+    lab5:
         z->lb = z->c; z->c = z->l; /* backwards, line 211 */
 
-        {   int m5 = z->l - z->c; (void)m5; /* do, line 213 */
-            {   int ret = r_Step_1a(z);
-                if (ret == 0) goto lab6; /* call Step_1a, line 213 */
+        {   int m3 = z->l - z->c; (void)m3; /* do, line 213 */
+            {   int ret = r_Step_1a(z); /* call Step_1a, line 213 */
+                if (ret == 0) goto lab6;
                 if (ret < 0) return ret;
             }
         lab6:
-            z->c = z->l - m5;
+            z->c = z->l - m3;
         }
-        {   int m6 = z->l - z->c; (void)m6; /* or, line 215 */
-            {   int ret = r_exception2(z);
-                if (ret == 0) goto lab8; /* call exception2, line 215 */
+        {   int m4 = z->l - z->c; (void)m4; /* or, line 215 */
+            {   int ret = r_exception2(z); /* call exception2, line 215 */
+                if (ret == 0) goto lab8;
                 if (ret < 0) return ret;
             }
             goto lab7;
         lab8:
-            z->c = z->l - m6;
-            {   int m7 = z->l - z->c; (void)m7; /* do, line 217 */
-                {   int ret = r_Step_1b(z);
-                    if (ret == 0) goto lab9; /* call Step_1b, line 217 */
+            z->c = z->l - m4;
+            {   int m5 = z->l - z->c; (void)m5; /* do, line 217 */
+                {   int ret = r_Step_1b(z); /* call Step_1b, line 217 */
+                    if (ret == 0) goto lab9;
                     if (ret < 0) return ret;
                 }
             lab9:
-                z->c = z->l - m7;
+                z->c = z->l - m5;
             }
-            {   int m8 = z->l - z->c; (void)m8; /* do, line 218 */
-                {   int ret = r_Step_1c(z);
-                    if (ret == 0) goto lab10; /* call Step_1c, line 218 */
+            {   int m6 = z->l - z->c; (void)m6; /* do, line 218 */
+                {   int ret = r_Step_1c(z); /* call Step_1c, line 218 */
+                    if (ret == 0) goto lab10;
                     if (ret < 0) return ret;
                 }
             lab10:
-                z->c = z->l - m8;
+                z->c = z->l - m6;
             }
-            {   int m9 = z->l - z->c; (void)m9; /* do, line 220 */
-                {   int ret = r_Step_2(z);
-                    if (ret == 0) goto lab11; /* call Step_2, line 220 */
+            {   int m7 = z->l - z->c; (void)m7; /* do, line 220 */
+                {   int ret = r_Step_2(z); /* call Step_2, line 220 */
+                    if (ret == 0) goto lab11;
                     if (ret < 0) return ret;
                 }
             lab11:
-                z->c = z->l - m9;
+                z->c = z->l - m7;
             }
-            {   int m10 = z->l - z->c; (void)m10; /* do, line 221 */
-                {   int ret = r_Step_3(z);
-                    if (ret == 0) goto lab12; /* call Step_3, line 221 */
+            {   int m8 = z->l - z->c; (void)m8; /* do, line 221 */
+                {   int ret = r_Step_3(z); /* call Step_3, line 221 */
+                    if (ret == 0) goto lab12;
                     if (ret < 0) return ret;
                 }
             lab12:
-                z->c = z->l - m10;
+                z->c = z->l - m8;
             }
-            {   int m11 = z->l - z->c; (void)m11; /* do, line 222 */
-                {   int ret = r_Step_4(z);
-                    if (ret == 0) goto lab13; /* call Step_4, line 222 */
+            {   int m9 = z->l - z->c; (void)m9; /* do, line 222 */
+                {   int ret = r_Step_4(z); /* call Step_4, line 222 */
+                    if (ret == 0) goto lab13;
                     if (ret < 0) return ret;
                 }
             lab13:
-                z->c = z->l - m11;
+                z->c = z->l - m9;
             }
-            {   int m12 = z->l - z->c; (void)m12; /* do, line 224 */
-                {   int ret = r_Step_5(z);
-                    if (ret == 0) goto lab14; /* call Step_5, line 224 */
+            {   int m10 = z->l - z->c; (void)m10; /* do, line 224 */
+                {   int ret = r_Step_5(z); /* call Step_5, line 224 */
+                    if (ret == 0) goto lab14;
                     if (ret < 0) return ret;
                 }
             lab14:
-                z->c = z->l - m12;
+                z->c = z->l - m10;
             }
         }
     lab7:
         z->c = z->lb;
-        {   int c13 = z->c; /* do, line 227 */
-            {   int ret = r_postlude(z);
-                if (ret == 0) goto lab15; /* call postlude, line 227 */
+        {   int c11 = z->c; /* do, line 227 */
+            {   int ret = r_postlude(z); /* call postlude, line 227 */
+                if (ret == 0) goto lab15;
                 if (ret < 0) return ret;
             }
         lab15:
-            z->c = c13;
+            z->c = c11;
         }
     }
 lab0:
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_finnish.c b/src/backend/snowball/libstemmer/stem_UTF_8_finnish.c
index 55fba0a732..0cbb64d65b 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_finnish.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_finnish.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -183,7 +183,7 @@ static const struct among a_6[30] =
 /*  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},
+/*  7 */ { 3, s_6_7, 4, 2, 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},
@@ -205,7 +205,7 @@ static const struct among a_6[30] =
 /* 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}
+/* 29 */ { 4, s_6_29, 26, 2, 0}
 };
 
 static const symbol s_7_0[3] = { 'e', 'j', 'a' };
@@ -261,151 +261,134 @@ static const struct among a_9[2] =
 
 static const unsigned char g_AEI[] = { 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8 };
 
+static const unsigned char g_C[] = { 119, 223, 119, 1 };
+
 static const unsigned char g_V1[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 };
 
 static const unsigned char g_V2[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32 };
 
 static const 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 const symbol s_0[] = { 'k' };
-static const symbol s_1[] = { 'k', 's', 'e' };
-static const symbol s_2[] = { 'k', 's', 'i' };
-static const symbol s_3[] = { 'i' };
-static const symbol s_4[] = { 'a' };
-static const symbol s_5[] = { 'e' };
-static const symbol s_6[] = { 'i' };
-static const symbol s_7[] = { 'o' };
-static const symbol s_8[] = { 0xC3, 0xA4 };
-static const symbol s_9[] = { 0xC3, 0xB6 };
-static const symbol s_10[] = { 'i', 'e' };
-static const symbol s_11[] = { 'e' };
-static const symbol s_12[] = { 'p', 'o' };
-static const symbol s_13[] = { 't' };
-static const symbol s_14[] = { 'p', 'o' };
-static const symbol s_15[] = { 'j' };
-static const symbol s_16[] = { 'o' };
-static const symbol s_17[] = { 'u' };
-static const symbol s_18[] = { 'o' };
-static const symbol s_19[] = { 'j' };
+static const symbol s_0[] = { 'k', 's', 'e' };
+static const symbol s_1[] = { 'k', 's', 'i' };
+static const symbol s_2[] = { 0xC3, 0xA4 };
+static const symbol s_3[] = { 0xC3, 0xB6 };
+static const symbol s_4[] = { 'i', 'e' };
+static const symbol s_5[] = { 'p', 'o' };
+static const symbol s_6[] = { 'p', 'o' };
 
-static int r_mark_regions(struct SN_env * z) {
-    z->I[0] = z->l;
-    z->I[1] = z->l;
-    if (out_grouping_U(z, g_V1, 97, 246, 1) < 0) return 0; /* goto */ /* grouping V1, line 46 */
-    {    /* gopast */ /* non V1, line 46 */
-        int ret = in_grouping_U(z, g_V1, 97, 246, 1);
-        if (ret < 0) return 0;
-        z->c += ret;
-    }
-    z->I[0] = z->c; /* setmark p1, line 46 */
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 44 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 45 */
     if (out_grouping_U(z, g_V1, 97, 246, 1) < 0) return 0; /* goto */ /* grouping V1, line 47 */
     {    /* gopast */ /* non V1, line 47 */
         int ret = in_grouping_U(z, g_V1, 97, 246, 1);
         if (ret < 0) return 0;
         z->c += ret;
     }
-    z->I[1] = z->c; /* setmark p2, line 47 */
+    z->I[0] = z->c; /* setmark p1, line 47 */
+    if (out_grouping_U(z, g_V1, 97, 246, 1) < 0) return 0; /* goto */ /* grouping V1, line 48 */
+    {    /* gopast */ /* non V1, line 48 */
+        int ret = in_grouping_U(z, g_V1, 97, 246, 1);
+        if (ret < 0) return 0;
+        z->c += ret;
+    }
+    z->I[1] = z->c; /* setmark p2, line 48 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 53 */
     return 1;
 }
 
-static int r_particle_etc(struct SN_env * z) {
+static int r_particle_etc(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 55 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 56 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 55 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 55 */
-        among_var = find_among_b(z, a_0, 10); /* substring, line 55 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
-        z->bra = z->c; /* ], line 55 */
-        z->lb = mlimit;
+        mlimit1 = z->lb; z->lb = z->I[0];
+        z->ket = z->c; /* [, line 56 */
+        among_var = find_among_b(z, a_0, 10); /* substring, line 56 */
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
+        z->bra = z->c; /* ], line 56 */
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 57 */
         case 1:
-            if (in_grouping_b_U(z, g_particle_end, 97, 246, 0)) return 0;
+            if (in_grouping_b_U(z, g_particle_end, 97, 246, 0)) return 0; /* grouping particle_end, line 63 */
             break;
         case 2:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 64 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 65 */
+                if (ret <= 0) return ret;
             }
             break;
     }
-    {   int ret = slice_del(z); /* delete, line 66 */
+    {   int ret = slice_del(z); /* delete, line 67 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_possessive(struct SN_env * z) {
+static int r_possessive(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 69 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 70 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 69 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 69 */
-        among_var = find_among_b(z, a_4, 9); /* substring, line 69 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
-        z->bra = z->c; /* ], line 69 */
-        z->lb = mlimit;
+        mlimit1 = z->lb; z->lb = z->I[0];
+        z->ket = z->c; /* [, line 70 */
+        among_var = find_among_b(z, a_4, 9); /* substring, line 70 */
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
+        z->bra = z->c; /* ], line 70 */
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 71 */
         case 1:
-            {   int m2 = z->l - z->c; (void)m2; /* not, line 72 */
-                if (!(eq_s_b(z, 1, s_0))) goto lab0;
+            {   int m2 = z->l - z->c; (void)m2; /* not, line 73 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'k') goto lab0; /* literal, line 73 */
+                z->c--;
                 return 0;
             lab0:
                 z->c = z->l - m2;
             }
-            {   int ret = slice_del(z); /* delete, line 72 */
+            {   int ret = slice_del(z); /* delete, line 73 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_del(z); /* delete, line 74 */
+            {   int ret = slice_del(z); /* delete, line 75 */
                 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 = slice_from_s(z, 3, s_2); /* <-, line 74 */
+            z->ket = z->c; /* [, line 75 */
+            if (!(eq_s_b(z, 3, s_0))) return 0; /* literal, line 75 */
+            z->bra = z->c; /* ], line 75 */
+            {   int ret = slice_from_s(z, 3, s_1); /* <-, line 75 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_del(z); /* delete, line 78 */
+            {   int ret = slice_del(z); /* delete, line 79 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            if (z->c - 1 <= z->lb || z->p[z->c - 1] != 97) return 0;
-            if (!(find_among_b(z, a_1, 6))) return 0; /* among, line 81 */
-            {   int ret = slice_del(z); /* delete, line 81 */
+            if (z->c - 1 <= z->lb || z->p[z->c - 1] != 97) return 0; /* among, line 82 */
+            if (!(find_among_b(z, a_1, 6))) return 0;
+            {   int ret = slice_del(z); /* delete, line 82 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
-            if (z->c - 2 <= z->lb || z->p[z->c - 1] != 164) return 0;
-            if (!(find_among_b(z, a_2, 6))) return 0; /* among, line 83 */
-            {   int ret = slice_del(z); /* delete, line 84 */
+            if (z->c - 2 <= z->lb || z->p[z->c - 1] != 164) return 0; /* among, line 84 */
+            if (!(find_among_b(z, a_2, 6))) return 0;
+            {   int ret = slice_del(z); /* delete, line 85 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            if (z->c - 2 <= z->lb || z->p[z->c - 1] != 101) return 0;
-            if (!(find_among_b(z, a_3, 2))) return 0; /* among, line 86 */
-            {   int ret = slice_del(z); /* delete, line 86 */
+            if (z->c - 2 <= z->lb || z->p[z->c - 1] != 101) return 0; /* among, line 87 */
+            if (!(find_among_b(z, a_3, 2))) return 0;
+            {   int ret = slice_del(z); /* delete, line 87 */
                 if (ret < 0) return ret;
             }
             break;
@@ -413,350 +396,338 @@ static int r_possessive(struct SN_env * z) {
     return 1;
 }
 
-static int r_LONG(struct SN_env * z) {
-    if (!(find_among_b(z, a_5, 7))) return 0; /* among, line 91 */
+static int r_LONG(struct SN_env * z) { /* backwardmode */
+    if (!(find_among_b(z, a_5, 7))) return 0; /* among, line 92 */
     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, 0)) return 0;
+static int r_VI(struct SN_env * z) { /* backwardmode */
+    if (z->c <= z->lb || z->p[z->c - 1] != 'i') return 0; /* literal, line 94 */
+    z->c--;
+    if (in_grouping_b_U(z, g_V2, 97, 246, 0)) return 0; /* grouping V2, line 94 */
     return 1;
 }
 
-static int r_case_ending(struct SN_env * z) {
+static int r_case_ending(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 96 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 97 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 96 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 96 */
-        among_var = find_among_b(z, a_6, 30); /* substring, line 96 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
-        z->bra = z->c; /* ], line 96 */
-        z->lb = mlimit;
+        mlimit1 = z->lb; z->lb = z->I[0];
+        z->ket = z->c; /* [, line 97 */
+        among_var = find_among_b(z, a_6, 30); /* substring, line 97 */
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
+        z->bra = z->c; /* ], line 97 */
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 98 */
         case 1:
-            if (!(eq_s_b(z, 1, s_4))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'a') return 0; /* literal, line 99 */
+            z->c--;
             break;
         case 2:
-            if (!(eq_s_b(z, 1, s_5))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'e') return 0; /* literal, line 100 */
+            z->c--;
             break;
         case 3:
-            if (!(eq_s_b(z, 1, s_6))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'i') return 0; /* literal, line 101 */
+            z->c--;
             break;
         case 4:
-            if (!(eq_s_b(z, 1, s_7))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'o') return 0; /* literal, line 102 */
+            z->c--;
             break;
         case 5:
-            if (!(eq_s_b(z, 2, s_8))) return 0;
+            if (!(eq_s_b(z, 2, s_2))) return 0; /* literal, line 103 */
             break;
         case 6:
-            if (!(eq_s_b(z, 2, s_9))) return 0;
+            if (!(eq_s_b(z, 2, s_3))) return 0; /* literal, line 104 */
             break;
         case 7:
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 111 */
-                {   int m2 = z->l - z->c; (void)m2; /* and, line 113 */
-                    {   int m3 = z->l - z->c; (void)m3; /* or, line 112 */
-                        {   int ret = r_LONG(z);
-                            if (ret == 0) goto lab2; /* call LONG, line 111 */
+            {   int m2 = z->l - z->c; (void)m2; /* try, line 112 */
+                {   int m3 = z->l - z->c; (void)m3; /* and, line 114 */
+                    {   int m4 = z->l - z->c; (void)m4; /* or, line 113 */
+                        {   int ret = r_LONG(z); /* call LONG, line 112 */
+                            if (ret == 0) goto lab2;
                             if (ret < 0) return ret;
                         }
                         goto lab1;
                     lab2:
-                        z->c = z->l - m3;
-                        if (!(eq_s_b(z, 2, s_10))) { z->c = z->l - m_keep; goto lab0; }
+                        z->c = z->l - m4;
+                        if (!(eq_s_b(z, 2, s_4))) { z->c = z->l - m2; goto lab0; } /* literal, line 113 */
                     }
                 lab1:
-                    z->c = z->l - m2;
+                    z->c = z->l - m3;
                     {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
-                        if (ret < 0) { z->c = z->l - m_keep; goto lab0; }
-                        z->c = ret; /* next, line 113 */
+                        if (ret < 0) { z->c = z->l - m2; goto lab0; }
+                        z->c = ret; /* next, line 114 */
                     }
                 }
-                z->bra = z->c; /* ], line 113 */
+                z->bra = z->c; /* ], line 114 */
             lab0:
                 ;
             }
             break;
         case 8:
-            if (in_grouping_b_U(z, g_V1, 97, 246, 0)) return 0;
-            if (out_grouping_b_U(z, g_V1, 97, 246, 0)) return 0;
-            break;
-        case 9:
-            if (!(eq_s_b(z, 1, s_11))) return 0;
+            if (in_grouping_b_U(z, g_V1, 97, 246, 0)) return 0; /* grouping V1, line 120 */
+            if (in_grouping_b_U(z, g_C, 98, 122, 0)) return 0; /* grouping C, line 120 */
             break;
     }
-    {   int ret = slice_del(z); /* delete, line 138 */
+    {   int ret = slice_del(z); /* delete, line 139 */
         if (ret < 0) return ret;
     }
-    z->B[0] = 1; /* set ending_removed, line 139 */
+    z->B[0] = 1; /* set ending_removed, line 140 */
     return 1;
 }
 
-static int r_other_endings(struct SN_env * z) {
+static int r_other_endings(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 142 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 143 */
         if (z->c < z->I[1]) return 0;
-        z->c = z->I[1]; /* tomark, line 142 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 142 */
-        among_var = find_among_b(z, a_7, 14); /* substring, line 142 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
-        z->bra = z->c; /* ], line 142 */
-        z->lb = mlimit;
+        mlimit1 = z->lb; z->lb = z->I[1];
+        z->ket = z->c; /* [, line 143 */
+        among_var = find_among_b(z, a_7, 14); /* substring, line 143 */
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
+        z->bra = z->c; /* ], line 143 */
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 144 */
         case 1:
-            {   int m2 = z->l - z->c; (void)m2; /* not, line 146 */
-                if (!(eq_s_b(z, 2, s_12))) goto lab0;
+            {   int m2 = z->l - z->c; (void)m2; /* not, line 147 */
+                if (!(eq_s_b(z, 2, s_5))) goto lab0; /* literal, line 147 */
                 return 0;
             lab0:
                 z->c = z->l - m2;
             }
             break;
     }
-    {   int ret = slice_del(z); /* delete, line 151 */
+    {   int ret = slice_del(z); /* delete, line 152 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_i_plural(struct SN_env * z) {
-    {   int mlimit; /* setlimit, line 154 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_i_plural(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 155 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 154 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 154 */
-        if (z->c <= z->lb || (z->p[z->c - 1] != 105 && z->p[z->c - 1] != 106)) { z->lb = mlimit; return 0; }
-        if (!(find_among_b(z, a_8, 2))) { z->lb = mlimit; return 0; } /* substring, line 154 */
-        z->bra = z->c; /* ], line 154 */
-        z->lb = mlimit;
+        mlimit1 = z->lb; z->lb = z->I[0];
+        z->ket = z->c; /* [, line 155 */
+        if (z->c <= z->lb || (z->p[z->c - 1] != 105 && z->p[z->c - 1] != 106)) { z->lb = mlimit1; return 0; } /* substring, line 155 */
+        if (!(find_among_b(z, a_8, 2))) { z->lb = mlimit1; return 0; }
+        z->bra = z->c; /* ], line 155 */
+        z->lb = mlimit1;
     }
-    {   int ret = slice_del(z); /* delete, line 158 */
+    {   int ret = slice_del(z); /* delete, line 159 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_t_plural(struct SN_env * z) {
+static int r_t_plural(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 161 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 162 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 161 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 162 */
-        if (!(eq_s_b(z, 1, s_13))) { z->lb = mlimit; 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, 0)) { z->lb = mlimit; return 0; }
-            z->c = z->l - m_test;
+        mlimit1 = z->lb; z->lb = z->I[0];
+        z->ket = z->c; /* [, line 163 */
+        if (z->c <= z->lb || z->p[z->c - 1] != 't') { z->lb = mlimit1; return 0; } /* literal, line 163 */
+        z->c--;
+        z->bra = z->c; /* ], line 163 */
+        {   int m_test2 = z->l - z->c; /* test, line 163 */
+            if (in_grouping_b_U(z, g_V1, 97, 246, 0)) { z->lb = mlimit1; return 0; } /* grouping V1, line 163 */
+            z->c = z->l - m_test2;
         }
-        {   int ret = slice_del(z); /* delete, line 163 */
+        {   int ret = slice_del(z); /* delete, line 164 */
             if (ret < 0) return ret;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    {   int mlimit; /* setlimit, line 165 */
-        int m2 = z->l - z->c; (void)m2;
+
+    {   int mlimit3; /* setlimit, line 166 */
         if (z->c < z->I[1]) return 0;
-        z->c = z->I[1]; /* tomark, line 165 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m2;
-        z->ket = z->c; /* [, line 165 */
-        if (z->c - 2 <= z->lb || z->p[z->c - 1] != 97) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_9, 2); /* substring, line 165 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
-        z->bra = z->c; /* ], line 165 */
-        z->lb = mlimit;
+        mlimit3 = z->lb; z->lb = z->I[1];
+        z->ket = z->c; /* [, line 166 */
+        if (z->c - 2 <= z->lb || z->p[z->c - 1] != 97) { z->lb = mlimit3; return 0; } /* substring, line 166 */
+        among_var = find_among_b(z, a_9, 2);
+        if (!(among_var)) { z->lb = mlimit3; return 0; }
+        z->bra = z->c; /* ], line 166 */
+        z->lb = mlimit3;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 167 */
         case 1:
-            {   int m3 = z->l - z->c; (void)m3; /* not, line 167 */
-                if (!(eq_s_b(z, 2, s_14))) goto lab0;
+            {   int m4 = z->l - z->c; (void)m4; /* not, line 168 */
+                if (!(eq_s_b(z, 2, s_6))) goto lab0; /* literal, line 168 */
                 return 0;
             lab0:
-                z->c = z->l - m3;
+                z->c = z->l - m4;
             }
             break;
     }
-    {   int ret = slice_del(z); /* delete, line 170 */
+    {   int ret = slice_del(z); /* delete, line 171 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_tidy(struct SN_env * z) {
-    {   int mlimit; /* setlimit, line 173 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_tidy(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 174 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 173 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
-        {   int m2 = z->l - z->c; (void)m2; /* do, line 174 */
-            {   int m3 = z->l - z->c; (void)m3; /* and, line 174 */
-                {   int ret = r_LONG(z);
-                    if (ret == 0) goto lab0; /* call LONG, line 174 */
+        mlimit1 = z->lb; z->lb = z->I[0];
+        {   int m2 = z->l - z->c; (void)m2; /* do, line 175 */
+            {   int m3 = z->l - z->c; (void)m3; /* and, line 175 */
+                {   int ret = r_LONG(z); /* call LONG, line 175 */
+                    if (ret == 0) goto lab0;
                     if (ret < 0) return ret;
                 }
                 z->c = z->l - m3;
-                z->ket = z->c; /* [, line 174 */
+                z->ket = z->c; /* [, line 175 */
                 {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
                     if (ret < 0) goto lab0;
-                    z->c = ret; /* next, line 174 */
+                    z->c = ret; /* next, line 175 */
                 }
-                z->bra = z->c; /* ], line 174 */
-                {   int ret = slice_del(z); /* delete, line 174 */
+                z->bra = z->c; /* ], line 175 */
+                {   int ret = slice_del(z); /* delete, line 175 */
                     if (ret < 0) return ret;
                 }
             }
         lab0:
             z->c = z->l - m2;
         }
-        {   int m4 = z->l - z->c; (void)m4; /* do, line 175 */
-            z->ket = z->c; /* [, line 175 */
-            if (in_grouping_b_U(z, g_AEI, 97, 228, 0)) goto lab1;
-            z->bra = z->c; /* ], line 175 */
-            if (out_grouping_b_U(z, g_V1, 97, 246, 0)) goto lab1;
-            {   int ret = slice_del(z); /* delete, line 175 */
-                if (ret < 0) return ret;
-            }
-        lab1:
-            z->c = z->l - m4;
-        }
-        {   int m5 = z->l - z->c; (void)m5; /* do, line 176 */
+        {   int m4 = z->l - z->c; (void)m4; /* do, line 176 */
             z->ket = z->c; /* [, line 176 */
-            if (!(eq_s_b(z, 1, s_15))) goto lab2;
+            if (in_grouping_b_U(z, g_AEI, 97, 228, 0)) goto lab1; /* grouping AEI, line 176 */
             z->bra = z->c; /* ], line 176 */
-            {   int m6 = z->l - z->c; (void)m6; /* or, line 176 */
-                if (!(eq_s_b(z, 1, s_16))) goto lab4;
+            if (in_grouping_b_U(z, g_C, 98, 122, 0)) goto lab1; /* grouping C, line 176 */
+            {   int ret = slice_del(z); /* delete, line 176 */
+                if (ret < 0) return ret;
+            }
+        lab1:
+            z->c = z->l - m4;
+        }
+        {   int m5 = z->l - z->c; (void)m5; /* do, line 177 */
+            z->ket = z->c; /* [, line 177 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'j') goto lab2; /* literal, line 177 */
+            z->c--;
+            z->bra = z->c; /* ], line 177 */
+            {   int m6 = z->l - z->c; (void)m6; /* or, line 177 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'o') goto lab4; /* literal, line 177 */
+                z->c--;
                 goto lab3;
             lab4:
                 z->c = z->l - m6;
-                if (!(eq_s_b(z, 1, s_17))) goto lab2;
+                if (z->c <= z->lb || z->p[z->c - 1] != 'u') goto lab2; /* literal, line 177 */
+                z->c--;
             }
         lab3:
-            {   int ret = slice_del(z); /* delete, line 176 */
+            {   int ret = slice_del(z); /* delete, line 177 */
                 if (ret < 0) return ret;
             }
         lab2:
             z->c = z->l - m5;
         }
-        {   int m7 = z->l - z->c; (void)m7; /* 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 = slice_del(z); /* delete, line 177 */
+        {   int m7 = z->l - z->c; (void)m7; /* do, line 178 */
+            z->ket = z->c; /* [, line 178 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'o') goto lab5; /* literal, line 178 */
+            z->c--;
+            z->bra = z->c; /* ], line 178 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'j') goto lab5; /* literal, line 178 */
+            z->c--;
+            {   int ret = slice_del(z); /* delete, line 178 */
                 if (ret < 0) return ret;
             }
         lab5:
             z->c = z->l - m7;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    if (in_grouping_b_U(z, g_V1, 97, 246, 1) < 0) return 0; /* goto */ /* non V1, line 179 */
-    z->ket = z->c; /* [, line 179 */
-    {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
-        if (ret < 0) return 0;
-        z->c = ret; /* 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 = slice_del(z); /* delete, line 179 */
+    if (in_grouping_b_U(z, g_V1, 97, 246, 1) < 0) return 0; /* goto */ /* non V1, line 180 */
+    z->ket = z->c; /* [, line 180 */
+    if (in_grouping_b_U(z, g_C, 98, 122, 0)) return 0; /* grouping C, line 180 */
+    z->bra = z->c; /* ], line 180 */
+    z->S[0] = slice_to(z, z->S[0]); /* -> x, line 180 */
+    if (z->S[0] == 0) return -1; /* -> x, line 180 */
+    if (!(eq_v_b(z, z->S[0]))) return 0; /* name x, line 180 */
+    {   int ret = slice_del(z); /* delete, line 180 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-extern int finnish_UTF_8_stem(struct SN_env * z) {
-    {   int c1 = z->c; /* do, line 185 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab0; /* call mark_regions, line 185 */
+extern int finnish_UTF_8_stem(struct SN_env * z) { /* forwardmode */
+    {   int c1 = z->c; /* do, line 186 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 186 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    z->B[0] = 0; /* unset ending_removed, line 186 */
-    z->lb = z->c; z->c = z->l; /* backwards, line 187 */
+    z->B[0] = 0; /* unset ending_removed, line 187 */
+    z->lb = z->c; z->c = z->l; /* backwards, line 188 */
 
-    {   int m2 = z->l - z->c; (void)m2; /* do, line 188 */
-        {   int ret = r_particle_etc(z);
-            if (ret == 0) goto lab1; /* call particle_etc, line 188 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 189 */
+        {   int ret = r_particle_etc(z); /* call particle_etc, line 189 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 189 */
-        {   int ret = r_possessive(z);
-            if (ret == 0) goto lab2; /* call possessive, line 189 */
+    {   int m3 = z->l - z->c; (void)m3; /* do, line 190 */
+        {   int ret = r_possessive(z); /* call possessive, line 190 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
         z->c = z->l - m3;
     }
-    {   int m4 = z->l - z->c; (void)m4; /* do, line 190 */
-        {   int ret = r_case_ending(z);
-            if (ret == 0) goto lab3; /* call case_ending, line 190 */
+    {   int m4 = z->l - z->c; (void)m4; /* do, line 191 */
+        {   int ret = r_case_ending(z); /* call case_ending, line 191 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
         z->c = z->l - m4;
     }
-    {   int m5 = z->l - z->c; (void)m5; /* do, line 191 */
-        {   int ret = r_other_endings(z);
-            if (ret == 0) goto lab4; /* call other_endings, line 191 */
+    {   int m5 = z->l - z->c; (void)m5; /* do, line 192 */
+        {   int ret = r_other_endings(z); /* call other_endings, line 192 */
+            if (ret == 0) goto lab4;
             if (ret < 0) return ret;
         }
     lab4:
         z->c = z->l - m5;
     }
-    {   int m6 = z->l - z->c; (void)m6; /* or, line 192 */
-        if (!(z->B[0])) goto lab6; /* Boolean test ending_removed, line 192 */
-        {   int m7 = z->l - z->c; (void)m7; /* 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 - m7;
+    /* or, line 193 */
+    if (!(z->B[0])) goto lab6; /* Boolean test ending_removed, line 193 */
+    {   int m6 = z->l - z->c; (void)m6; /* do, line 193 */
+        {   int ret = r_i_plural(z); /* call i_plural, line 193 */
+            if (ret == 0) goto lab7;
+            if (ret < 0) return ret;
         }
-        goto lab5;
-    lab6:
+    lab7:
         z->c = z->l - m6;
-        {   int m8 = z->l - z->c; (void)m8; /* 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 - m8;
+    }
+    goto lab5;
+lab6:
+    {   int m7 = z->l - z->c; (void)m7; /* do, line 193 */
+        {   int ret = r_t_plural(z); /* call t_plural, line 193 */
+            if (ret == 0) goto lab8;
+            if (ret < 0) return ret;
         }
+    lab8:
+        z->c = z->l - m7;
     }
 lab5:
-    {   int m9 = z->l - z->c; (void)m9; /* do, line 193 */
-        {   int ret = r_tidy(z);
-            if (ret == 0) goto lab9; /* call tidy, line 193 */
+    {   int m8 = z->l - z->c; (void)m8; /* do, line 194 */
+        {   int ret = r_tidy(z); /* call tidy, line 194 */
+            if (ret == 0) goto lab9;
             if (ret < 0) return ret;
         }
     lab9:
-        z->c = z->l - m9;
+        z->c = z->l - m8;
     }
     z->c = z->lb;
     return 1;
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_french.c b/src/backend/snowball/libstemmer/stem_UTF_8_french.c
index fa1507f2c6..80564a8e36 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_french.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_french.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -370,82 +370,74 @@ static const unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 
 static const unsigned char g_keep_with_s[] = { 1, 65, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128 };
 
-static const symbol s_0[] = { 'u' };
-static const symbol s_1[] = { 'U' };
-static const symbol s_2[] = { 'i' };
-static const symbol s_3[] = { 'I' };
-static const symbol s_4[] = { 'y' };
-static const symbol s_5[] = { 'Y' };
-static const symbol s_6[] = { 'y' };
-static const symbol s_7[] = { 'Y' };
-static const symbol s_8[] = { 'q' };
-static const symbol s_9[] = { 'u' };
-static const symbol s_10[] = { 'U' };
-static const symbol s_11[] = { 'i' };
-static const symbol s_12[] = { 'u' };
-static const symbol s_13[] = { 'y' };
-static const symbol s_14[] = { 'i', 'c' };
-static const symbol s_15[] = { 'i', 'q', 'U' };
-static const symbol s_16[] = { 'l', 'o', 'g' };
-static const symbol s_17[] = { 'u' };
-static const symbol s_18[] = { 'e', 'n', 't' };
-static const symbol s_19[] = { 'a', 't' };
-static const symbol s_20[] = { 'e', 'u', 'x' };
-static const symbol s_21[] = { 'i' };
-static const symbol s_22[] = { 'a', 'b', 'l' };
-static const symbol s_23[] = { 'i', 'q', 'U' };
-static const symbol s_24[] = { 'a', 't' };
-static const symbol s_25[] = { 'i', 'c' };
-static const symbol s_26[] = { 'i', 'q', 'U' };
-static const symbol s_27[] = { 'e', 'a', 'u' };
-static const symbol s_28[] = { 'a', 'l' };
-static const symbol s_29[] = { 'e', 'u', 'x' };
-static const symbol s_30[] = { 'a', 'n', 't' };
-static const symbol s_31[] = { 'e', 'n', 't' };
-static const symbol s_32[] = { 'e' };
-static const symbol s_33[] = { 's' };
-static const symbol s_34[] = { 's' };
-static const symbol s_35[] = { 't' };
-static const symbol s_36[] = { 'i' };
-static const symbol s_37[] = { 'g', 'u' };
-static const symbol s_38[] = { 0xC3, 0xA9 };
-static const symbol s_39[] = { 0xC3, 0xA8 };
-static const symbol s_40[] = { 'e' };
-static const symbol s_41[] = { 'Y' };
-static const symbol s_42[] = { 'i' };
-static const symbol s_43[] = { 0xC3, 0xA7 };
-static const symbol s_44[] = { 'c' };
+static const symbol s_0[] = { 'U' };
+static const symbol s_1[] = { 'I' };
+static const symbol s_2[] = { 'Y' };
+static const symbol s_3[] = { 'Y' };
+static const symbol s_4[] = { 'U' };
+static const symbol s_5[] = { 'i' };
+static const symbol s_6[] = { 'u' };
+static const symbol s_7[] = { 'y' };
+static const symbol s_8[] = { 'i', 'c' };
+static const symbol s_9[] = { 'i', 'q', 'U' };
+static const symbol s_10[] = { 'l', 'o', 'g' };
+static const symbol s_11[] = { 'u' };
+static const symbol s_12[] = { 'e', 'n', 't' };
+static const symbol s_13[] = { 'a', 't' };
+static const symbol s_14[] = { 'e', 'u', 'x' };
+static const symbol s_15[] = { 'i' };
+static const symbol s_16[] = { 'a', 'b', 'l' };
+static const symbol s_17[] = { 'i', 'q', 'U' };
+static const symbol s_18[] = { 'a', 't' };
+static const symbol s_19[] = { 'i', 'c' };
+static const symbol s_20[] = { 'i', 'q', 'U' };
+static const symbol s_21[] = { 'e', 'a', 'u' };
+static const symbol s_22[] = { 'a', 'l' };
+static const symbol s_23[] = { 'e', 'u', 'x' };
+static const symbol s_24[] = { 'a', 'n', 't' };
+static const symbol s_25[] = { 'e', 'n', 't' };
+static const symbol s_26[] = { 'i' };
+static const symbol s_27[] = { 'g', 'u' };
+static const symbol s_28[] = { 0xC3, 0xA9 };
+static const symbol s_29[] = { 0xC3, 0xA8 };
+static const symbol s_30[] = { 'e' };
+static const symbol s_31[] = { 'i' };
+static const symbol s_32[] = { 0xC3, 0xA7 };
+static const symbol s_33[] = { 'c' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     while(1) { /* repeat, line 38 */
         int c1 = z->c;
         while(1) { /* goto, line 38 */
             int c2 = z->c;
             {   int c3 = z->c; /* or, line 44 */
-                if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab3;
+                if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab3; /* grouping v, line 40 */
                 z->bra = z->c; /* [, line 40 */
                 {   int c4 = z->c; /* or, line 40 */
-                    if (!(eq_s(z, 1, s_0))) goto lab5;
+                    if (z->c == z->l || z->p[z->c] != 'u') goto lab5; /* literal, line 40 */
+                    z->c++;
                     z->ket = z->c; /* ], line 40 */
-                    if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab5;
-                    {   int ret = slice_from_s(z, 1, s_1); /* <-, line 40 */
+                    if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab5; /* grouping v, line 40 */
+                    {   int ret = slice_from_s(z, 1, s_0); /* <-, line 40 */
                         if (ret < 0) return ret;
                     }
                     goto lab4;
                 lab5:
                     z->c = c4;
-                    if (!(eq_s(z, 1, s_2))) goto lab6;
+                    if (z->c == z->l || z->p[z->c] != 'i') goto lab6; /* literal, line 41 */
+                    z->c++;
                     z->ket = z->c; /* ], line 41 */
-                    if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab6;
-                    {   int ret = slice_from_s(z, 1, s_3); /* <-, line 41 */
+                    if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab6; /* grouping v, line 41 */
+                    {   int ret = slice_from_s(z, 1, s_1); /* <-, line 41 */
                         if (ret < 0) return ret;
                     }
                     goto lab4;
                 lab6:
                     z->c = c4;
-                    if (!(eq_s(z, 1, s_4))) goto lab3;
+                    if (z->c == z->l || z->p[z->c] != 'y') goto lab3; /* literal, line 42 */
+                    z->c++;
                     z->ket = z->c; /* ], line 42 */
-                    {   int ret = slice_from_s(z, 1, s_5); /* <-, line 42 */
+                    {   int ret = slice_from_s(z, 1, s_2); /* <-, line 42 */
                         if (ret < 0) return ret;
                     }
                 }
@@ -454,20 +446,23 @@ static int r_prelude(struct SN_env * z) {
             lab3:
                 z->c = c3;
                 z->bra = z->c; /* [, line 45 */
-                if (!(eq_s(z, 1, s_6))) goto lab7;
+                if (z->c == z->l || z->p[z->c] != 'y') goto lab7; /* literal, line 45 */
+                z->c++;
                 z->ket = z->c; /* ], line 45 */
-                if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab7;
-                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 45 */
+                if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab7; /* grouping v, line 45 */
+                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 45 */
                     if (ret < 0) return ret;
                 }
                 goto lab2;
             lab7:
                 z->c = c3;
-                if (!(eq_s(z, 1, s_8))) goto lab1;
+                if (z->c == z->l || z->p[z->c] != 'q') goto lab1; /* literal, line 47 */
+                z->c++;
                 z->bra = z->c; /* [, line 47 */
-                if (!(eq_s(z, 1, s_9))) goto lab1;
+                if (z->c == z->l || z->p[z->c] != 'u') goto lab1; /* literal, line 47 */
+                z->c++;
                 z->ket = z->c; /* ], line 47 */
-                {   int ret = slice_from_s(z, 1, s_10); /* <-, line 47 */
+                {   int ret = slice_from_s(z, 1, s_4); /* <-, line 47 */
                     if (ret < 0) return ret;
                 }
             }
@@ -489,14 +484,14 @@ static int r_prelude(struct SN_env * z) {
     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;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 52 */
+    z->I[1] = z->l; /* $p1 = <integer expression>, line 53 */
+    z->I[2] = z->l; /* $p2 = <integer expression>, line 54 */
     {   int c1 = z->c; /* do, line 56 */
         {   int c2 = z->c; /* or, line 58 */
-            if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab2;
-            if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab2;
+            if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab2; /* grouping v, line 57 */
+            if (in_grouping_U(z, g_v, 97, 251, 0)) goto lab2; /* grouping v, line 57 */
             {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
                 if (ret < 0) goto lab2;
                 z->c = ret; /* next, line 57 */
@@ -504,8 +499,8 @@ static int r_mark_regions(struct SN_env * z) {
             goto lab1;
         lab2:
             z->c = c2;
-            if (z->c + 2 >= z->l || z->p[z->c + 2] >> 5 != 3 || !((331776 >> (z->p[z->c + 2] & 0x1f)) & 1)) goto lab3;
-            if (!(find_among(z, a_0, 3))) goto lab3; /* among, line 59 */
+            if (z->c + 2 >= z->l || z->p[z->c + 2] >> 5 != 3 || !((331776 >> (z->p[z->c + 2] & 0x1f)) & 1)) goto lab3; /* among, line 59 */
+            if (!(find_among(z, a_0, 3))) goto lab3;
             goto lab1;
         lab3:
             z->c = c2;
@@ -553,29 +548,28 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 75 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 77 */
-        if (z->c >= z->l || z->p[z->c + 0] >> 5 != 2 || !((35652096 >> (z->p[z->c + 0] & 0x1f)) & 1)) among_var = 4; else
-        among_var = find_among(z, a_1, 4); /* substring, line 77 */
+        if (z->c >= z->l || z->p[z->c + 0] >> 5 != 2 || !((35652096 >> (z->p[z->c + 0] & 0x1f)) & 1)) among_var = 4; else /* substring, line 77 */
+        among_var = find_among(z, a_1, 4);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 77 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 77 */
             case 1:
-                {   int ret = slice_from_s(z, 1, s_11); /* <-, line 78 */
+                {   int ret = slice_from_s(z, 1, s_5); /* <-, line 78 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_12); /* <-, line 79 */
+                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 79 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 3:
-                {   int ret = slice_from_s(z, 1, s_13); /* <-, line 80 */
+                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 80 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -594,53 +588,50 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_RV(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_RV(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 87 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 88 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[2] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[2] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 89 */
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 92 */
     among_var = find_among_b(z, a_4, 43); /* substring, line 92 */
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 92 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 92 */
         case 1:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 96 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 96 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 96 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 99 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 99 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 99 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 100 */
+            {   int m1 = z->l - z->c; (void)m1; /* try, line 100 */
                 z->ket = z->c; /* [, line 100 */
-                if (!(eq_s_b(z, 2, s_14))) { z->c = z->l - m_keep; goto lab0; }
+                if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m1; goto lab0; } /* literal, line 100 */
                 z->bra = z->c; /* ], line 100 */
-                {   int m1 = z->l - z->c; (void)m1; /* or, line 100 */
-                    {   int ret = r_R2(z);
-                        if (ret == 0) goto lab2; /* call R2, line 100 */
+                {   int m2 = z->l - z->c; (void)m2; /* or, line 100 */
+                    {   int ret = r_R2(z); /* call R2, line 100 */
+                        if (ret == 0) goto lab2;
                         if (ret < 0) return ret;
                     }
                     {   int ret = slice_del(z); /* delete, line 100 */
@@ -648,8 +639,8 @@ static int r_standard_suffix(struct SN_env * z) {
                     }
                     goto lab1;
                 lab2:
-                    z->c = z->l - m1;
-                    {   int ret = slice_from_s(z, 3, s_15); /* <-, line 100 */
+                    z->c = z->l - m2;
+                    {   int ret = slice_from_s(z, 3, s_9); /* <-, line 100 */
                         if (ret < 0) return ret;
                     }
                 }
@@ -659,60 +650,55 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 3:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 104 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 104 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_16); /* <-, line 104 */
+            {   int ret = slice_from_s(z, 3, s_10); /* <-, line 104 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 107 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 107 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 1, s_17); /* <-, line 107 */
+            {   int ret = slice_from_s(z, 1, s_11); /* <-, line 107 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 110 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 110 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 110 */
+            {   int ret = slice_from_s(z, 3, s_12); /* <-, line 110 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 114 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 114 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 114 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 115 */
+            {   int m3 = z->l - z->c; (void)m3; /* try, line 115 */
                 z->ket = z->c; /* [, line 116 */
                 among_var = find_among_b(z, a_2, 6); /* substring, line 116 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab3; }
+                if (!(among_var)) { z->c = z->l - m3; goto lab3; }
                 z->bra = z->c; /* ], line 116 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab3; }
+                switch (among_var) { /* among, line 116 */
                     case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 117 */
+                        {   int ret = r_R2(z); /* call R2, line 117 */
+                            if (ret == 0) { z->c = z->l - m3; goto lab3; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 117 */
                             if (ret < 0) return ret;
                         }
                         z->ket = z->c; /* [, line 117 */
-                        if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m_keep; goto lab3; }
+                        if (!(eq_s_b(z, 2, s_13))) { z->c = z->l - m3; goto lab3; } /* literal, line 117 */
                         z->bra = z->c; /* ], line 117 */
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 117 */
+                        {   int ret = r_R2(z); /* call R2, line 117 */
+                            if (ret == 0) { z->c = z->l - m3; goto lab3; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 117 */
@@ -720,9 +706,9 @@ static int r_standard_suffix(struct SN_env * z) {
                         }
                         break;
                     case 2:
-                        {   int m2 = z->l - z->c; (void)m2; /* or, line 118 */
-                            {   int ret = r_R2(z);
-                                if (ret == 0) goto lab5; /* call R2, line 118 */
+                        {   int m4 = z->l - z->c; (void)m4; /* or, line 118 */
+                            {   int ret = r_R2(z); /* call R2, line 118 */
+                                if (ret == 0) goto lab5;
                                 if (ret < 0) return ret;
                             }
                             {   int ret = slice_del(z); /* delete, line 118 */
@@ -730,20 +716,20 @@ static int r_standard_suffix(struct SN_env * z) {
                             }
                             goto lab4;
                         lab5:
-                            z->c = z->l - m2;
-                            {   int ret = r_R1(z);
-                                if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R1, line 118 */
+                            z->c = z->l - m4;
+                            {   int ret = r_R1(z); /* call R1, line 118 */
+                                if (ret == 0) { z->c = z->l - m3; goto lab3; }
                                 if (ret < 0) return ret;
                             }
-                            {   int ret = slice_from_s(z, 3, s_20); /* <-, line 118 */
+                            {   int ret = slice_from_s(z, 3, s_14); /* <-, line 118 */
                                 if (ret < 0) return ret;
                             }
                         }
                     lab4:
                         break;
                     case 3:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 120 */
+                        {   int ret = r_R2(z); /* call R2, line 120 */
+                            if (ret == 0) { z->c = z->l - m3; goto lab3; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 120 */
@@ -751,11 +737,11 @@ static int r_standard_suffix(struct SN_env * z) {
                         }
                         break;
                     case 4:
-                        {   int ret = r_RV(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call RV, line 122 */
+                        {   int ret = r_RV(z); /* call RV, line 122 */
+                            if (ret == 0) { z->c = z->l - m3; goto lab3; }
                             if (ret < 0) return ret;
                         }
-                        {   int ret = slice_from_s(z, 1, s_21); /* <-, line 122 */
+                        {   int ret = slice_from_s(z, 1, s_15); /* <-, line 122 */
                             if (ret < 0) return ret;
                         }
                         break;
@@ -765,25 +751,23 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 7:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 129 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 129 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 129 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 130 */
+            {   int m5 = z->l - z->c; (void)m5; /* try, line 130 */
                 z->ket = z->c; /* [, line 131 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab6; }
-                among_var = find_among_b(z, a_3, 3); /* substring, line 131 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab6; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m5; goto lab6; } /* substring, line 131 */
+                among_var = find_among_b(z, a_3, 3);
+                if (!(among_var)) { z->c = z->l - m5; goto lab6; }
                 z->bra = z->c; /* ], line 131 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab6; }
+                switch (among_var) { /* among, line 131 */
                     case 1:
-                        {   int m3 = z->l - z->c; (void)m3; /* or, line 132 */
-                            {   int ret = r_R2(z);
-                                if (ret == 0) goto lab8; /* call R2, line 132 */
+                        {   int m6 = z->l - z->c; (void)m6; /* or, line 132 */
+                            {   int ret = r_R2(z); /* call R2, line 132 */
+                                if (ret == 0) goto lab8;
                                 if (ret < 0) return ret;
                             }
                             {   int ret = slice_del(z); /* delete, line 132 */
@@ -791,17 +775,17 @@ static int r_standard_suffix(struct SN_env * z) {
                             }
                             goto lab7;
                         lab8:
-                            z->c = z->l - m3;
-                            {   int ret = slice_from_s(z, 3, s_22); /* <-, line 132 */
+                            z->c = z->l - m6;
+                            {   int ret = slice_from_s(z, 3, s_16); /* <-, line 132 */
                                 if (ret < 0) return ret;
                             }
                         }
                     lab7:
                         break;
                     case 2:
-                        {   int m4 = z->l - z->c; (void)m4; /* or, line 133 */
-                            {   int ret = r_R2(z);
-                                if (ret == 0) goto lab10; /* call R2, line 133 */
+                        {   int m7 = z->l - z->c; (void)m7; /* or, line 133 */
+                            {   int ret = r_R2(z); /* call R2, line 133 */
+                                if (ret == 0) goto lab10;
                                 if (ret < 0) return ret;
                             }
                             {   int ret = slice_del(z); /* delete, line 133 */
@@ -809,16 +793,16 @@ static int r_standard_suffix(struct SN_env * z) {
                             }
                             goto lab9;
                         lab10:
-                            z->c = z->l - m4;
-                            {   int ret = slice_from_s(z, 3, s_23); /* <-, line 133 */
+                            z->c = z->l - m7;
+                            {   int ret = slice_from_s(z, 3, s_17); /* <-, line 133 */
                                 if (ret < 0) return ret;
                             }
                         }
                     lab9:
                         break;
                     case 3:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab6; } /* call R2, line 134 */
+                        {   int ret = r_R2(z); /* call R2, line 134 */
+                            if (ret == 0) { z->c = z->l - m5; goto lab6; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 134 */
@@ -831,30 +815,29 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 8:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 141 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 141 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 141 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 142 */
+            {   int m8 = z->l - z->c; (void)m8; /* try, line 142 */
                 z->ket = z->c; /* [, line 142 */
-                if (!(eq_s_b(z, 2, s_24))) { z->c = z->l - m_keep; goto lab11; }
+                if (!(eq_s_b(z, 2, s_18))) { z->c = z->l - m8; goto lab11; } /* literal, line 142 */
                 z->bra = z->c; /* ], line 142 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab11; } /* call R2, line 142 */
+                {   int ret = r_R2(z); /* call R2, line 142 */
+                    if (ret == 0) { z->c = z->l - m8; goto lab11; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 142 */
                     if (ret < 0) return ret;
                 }
                 z->ket = z->c; /* [, line 142 */
-                if (!(eq_s_b(z, 2, s_25))) { z->c = z->l - m_keep; goto lab11; }
+                if (!(eq_s_b(z, 2, s_19))) { z->c = z->l - m8; goto lab11; } /* literal, line 142 */
                 z->bra = z->c; /* ], line 142 */
-                {   int m5 = z->l - z->c; (void)m5; /* or, line 142 */
-                    {   int ret = r_R2(z);
-                        if (ret == 0) goto lab13; /* call R2, line 142 */
+                {   int m9 = z->l - z->c; (void)m9; /* or, line 142 */
+                    {   int ret = r_R2(z); /* call R2, line 142 */
+                        if (ret == 0) goto lab13;
                         if (ret < 0) return ret;
                     }
                     {   int ret = slice_del(z); /* delete, line 142 */
@@ -862,8 +845,8 @@ static int r_standard_suffix(struct SN_env * z) {
                     }
                     goto lab12;
                 lab13:
-                    z->c = z->l - m5;
-                    {   int ret = slice_from_s(z, 3, s_26); /* <-, line 142 */
+                    z->c = z->l - m9;
+                    {   int ret = slice_from_s(z, 3, s_20); /* <-, line 142 */
                         if (ret < 0) return ret;
                     }
                 }
@@ -873,23 +856,22 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 9:
-            {   int ret = slice_from_s(z, 3, s_27); /* <-, line 144 */
+            {   int ret = slice_from_s(z, 3, s_21); /* <-, line 144 */
                 if (ret < 0) return ret;
             }
             break;
         case 10:
-            {   int ret = r_R1(z);
-                if (ret == 0) return 0; /* call R1, line 145 */
-                if (ret < 0) return ret;
+            {   int ret = r_R1(z); /* call R1, line 145 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 2, s_28); /* <-, line 145 */
+            {   int ret = slice_from_s(z, 2, s_22); /* <-, line 145 */
                 if (ret < 0) return ret;
             }
             break;
         case 11:
-            {   int m6 = z->l - z->c; (void)m6; /* or, line 147 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) goto lab15; /* call R2, line 147 */
+            {   int m10 = z->l - z->c; (void)m10; /* or, line 147 */
+                {   int ret = r_R2(z); /* call R2, line 147 */
+                    if (ret == 0) goto lab15;
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 147 */
@@ -897,55 +879,50 @@ static int r_standard_suffix(struct SN_env * z) {
                 }
                 goto lab14;
             lab15:
-                z->c = z->l - m6;
-                {   int ret = r_R1(z);
-                    if (ret == 0) return 0; /* call R1, line 147 */
-                    if (ret < 0) return ret;
+                z->c = z->l - m10;
+                {   int ret = r_R1(z); /* call R1, line 147 */
+                    if (ret <= 0) return ret;
                 }
-                {   int ret = slice_from_s(z, 3, s_29); /* <-, line 147 */
+                {   int ret = slice_from_s(z, 3, s_23); /* <-, line 147 */
                     if (ret < 0) return ret;
                 }
             }
         lab14:
             break;
         case 12:
-            {   int ret = r_R1(z);
-                if (ret == 0) return 0; /* call R1, line 150 */
-                if (ret < 0) return ret;
+            {   int ret = r_R1(z); /* call R1, line 150 */
+                if (ret <= 0) return ret;
             }
-            if (out_grouping_b_U(z, g_v, 97, 251, 0)) return 0;
+            if (out_grouping_b_U(z, g_v, 97, 251, 0)) return 0; /* non v, line 150 */
             {   int ret = slice_del(z); /* delete, line 150 */
                 if (ret < 0) return ret;
             }
             break;
         case 13:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 155 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 155 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_30); /* <-, line 155 */
+            {   int ret = slice_from_s(z, 3, s_24); /* <-, line 155 */
                 if (ret < 0) return ret;
             }
             return 0; /* fail, line 155 */
             break;
         case 14:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 156 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 156 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_31); /* <-, line 156 */
+            {   int ret = slice_from_s(z, 3, s_25); /* <-, line 156 */
                 if (ret < 0) return ret;
             }
             return 0; /* fail, line 156 */
             break;
         case 15:
-            {   int m_test = z->l - z->c; /* test, line 158 */
-                if (in_grouping_b_U(z, g_v, 97, 251, 0)) return 0;
-                {   int ret = r_RV(z);
-                    if (ret == 0) return 0; /* call RV, line 158 */
-                    if (ret < 0) return ret;
+            {   int m_test11 = z->l - z->c; /* test, line 158 */
+                if (in_grouping_b_U(z, g_v, 97, 251, 0)) return 0; /* grouping v, line 158 */
+                {   int ret = r_RV(z); /* call RV, line 158 */
+                    if (ret <= 0) return ret;
                 }
-                z->c = z->l - m_test;
+                z->c = z->l - m_test11;
             }
             {   int ret = slice_del(z); /* delete, line 158 */
                 if (ret < 0) return ret;
@@ -956,50 +933,38 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_i_verb_suffix(struct SN_env * z) {
-    int among_var;
-    {   int mlimit; /* setlimit, line 163 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_i_verb_suffix(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 163 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 163 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 164 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68944418 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_5, 35); /* substring, line 164 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68944418 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 164 */
+        if (!(find_among_b(z, a_5, 35))) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 164 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
-            case 1:
-                if (out_grouping_b_U(z, g_v, 97, 251, 0)) { z->lb = mlimit; return 0; }
-                {   int ret = slice_del(z); /* delete, line 170 */
-                    if (ret < 0) return ret;
-                }
-                break;
+        if (out_grouping_b_U(z, g_v, 97, 251, 0)) { z->lb = mlimit1; return 0; } /* non v, line 170 */
+        {   int ret = slice_del(z); /* delete, line 170 */
+            if (ret < 0) return ret;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_verb_suffix(struct SN_env * z) {
+static int r_verb_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 174 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 174 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 174 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 175 */
         among_var = find_among_b(z, a_6, 38); /* substring, line 175 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 175 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
+        switch (among_var) { /* among, line 175 */
             case 1:
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->lb = mlimit; return 0; } /* call R2, line 177 */
+                {   int ret = r_R2(z); /* call R2, line 177 */
+                    if (ret == 0) { z->lb = mlimit1; return 0; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 177 */
@@ -1015,9 +980,10 @@ static int r_verb_suffix(struct SN_env * z) {
                 {   int ret = slice_del(z); /* delete, line 190 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 191 */
+                {   int m2 = z->l - z->c; (void)m2; /* try, line 191 */
                     z->ket = z->c; /* [, line 191 */
-                    if (!(eq_s_b(z, 1, s_32))) { z->c = z->l - m_keep; goto lab0; }
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'e') { z->c = z->l - m2; goto lab0; } /* literal, line 191 */
+                    z->c--;
                     z->bra = z->c; /* ], line 191 */
                     {   int ret = slice_del(z); /* delete, line 191 */
                         if (ret < 0) return ret;
@@ -1027,20 +993,21 @@ static int r_verb_suffix(struct SN_env * z) {
                 }
                 break;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_residual_suffix(struct SN_env * z) {
+static int r_residual_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 199 */
+    {   int m1 = z->l - z->c; (void)m1; /* try, line 199 */
         z->ket = z->c; /* [, line 199 */
-        if (!(eq_s_b(z, 1, s_33))) { z->c = z->l - m_keep; goto lab0; }
+        if (z->c <= z->lb || z->p[z->c - 1] != 's') { z->c = z->l - m1; goto lab0; } /* literal, line 199 */
+        z->c--;
         z->bra = z->c; /* ], line 199 */
-        {   int m_test = z->l - z->c; /* test, line 199 */
-            if (out_grouping_b_U(z, g_keep_with_s, 97, 232, 0)) { z->c = z->l - m_keep; goto lab0; }
-            z->c = z->l - m_test;
+        {   int m_test2 = z->l - z->c; /* test, line 199 */
+            if (out_grouping_b_U(z, g_keep_with_s, 97, 232, 0)) { z->c = z->l - m1; goto lab0; } /* non keep_with_s, line 199 */
+            z->c = z->l - m_test2;
         }
         {   int ret = slice_del(z); /* delete, line 199 */
             if (ret < 0) return ret;
@@ -1048,29 +1015,28 @@ static int r_residual_suffix(struct SN_env * z) {
     lab0:
         ;
     }
-    {   int mlimit; /* setlimit, line 200 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit3; /* setlimit, line 200 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 200 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit3 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 201 */
         among_var = find_among_b(z, a_7, 7); /* substring, line 201 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(among_var)) { z->lb = mlimit3; return 0; }
         z->bra = z->c; /* ], line 201 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
+        switch (among_var) { /* among, line 201 */
             case 1:
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->lb = mlimit; return 0; } /* call R2, line 202 */
+                {   int ret = r_R2(z); /* call R2, line 202 */
+                    if (ret == 0) { z->lb = mlimit3; return 0; }
                     if (ret < 0) return ret;
                 }
-                {   int m2 = z->l - z->c; (void)m2; /* or, line 202 */
-                    if (!(eq_s_b(z, 1, s_34))) goto lab2;
+                {   int m4 = z->l - z->c; (void)m4; /* or, line 202 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 's') goto lab2; /* literal, line 202 */
+                    z->c--;
                     goto lab1;
                 lab2:
-                    z->c = z->l - m2;
-                    if (!(eq_s_b(z, 1, s_35))) { z->lb = mlimit; return 0; }
+                    z->c = z->l - m4;
+                    if (z->c <= z->lb || z->p[z->c - 1] != 't') { z->lb = mlimit3; return 0; } /* literal, line 202 */
+                    z->c--;
                 }
             lab1:
                 {   int ret = slice_del(z); /* delete, line 202 */
@@ -1078,7 +1044,7 @@ static int r_residual_suffix(struct SN_env * z) {
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_36); /* <-, line 204 */
+                {   int ret = slice_from_s(z, 1, s_26); /* <-, line 204 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -1088,22 +1054,22 @@ static int r_residual_suffix(struct SN_env * z) {
                 }
                 break;
             case 4:
-                if (!(eq_s_b(z, 2, s_37))) { z->lb = mlimit; return 0; }
+                if (!(eq_s_b(z, 2, s_27))) { z->lb = mlimit3; return 0; } /* literal, line 206 */
                 {   int ret = slice_del(z); /* delete, line 206 */
                     if (ret < 0) return ret;
                 }
                 break;
         }
-        z->lb = mlimit;
+        z->lb = mlimit3;
     }
     return 1;
 }
 
-static int r_un_double(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 212 */
-        if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1069056 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-        if (!(find_among_b(z, a_8, 5))) return 0; /* among, line 212 */
-        z->c = z->l - m_test;
+static int r_un_double(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 212 */
+        if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1069056 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* among, line 212 */
+        if (!(find_among_b(z, a_8, 5))) return 0;
+        z->c = z->l - m_test1;
     }
     z->ket = z->c; /* [, line 212 */
     {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
@@ -1117,10 +1083,10 @@ static int r_un_double(struct SN_env * z) {
     return 1;
 }
 
-static int r_un_accent(struct SN_env * z) {
+static int r_un_accent(struct SN_env * z) { /* backwardmode */
     {   int i = 1;
         while(1) { /* atleast, line 216 */
-            if (out_grouping_b_U(z, g_v, 97, 251, 0)) goto lab0;
+            if (out_grouping_b_U(z, g_v, 97, 251, 0)) goto lab0; /* non v, line 216 */
             i--;
             continue;
         lab0:
@@ -1130,78 +1096,77 @@ static int r_un_accent(struct SN_env * z) {
     }
     z->ket = z->c; /* [, line 217 */
     {   int m1 = z->l - z->c; (void)m1; /* or, line 217 */
-        if (!(eq_s_b(z, 2, s_38))) goto lab2;
+        if (!(eq_s_b(z, 2, s_28))) goto lab2; /* literal, line 217 */
         goto lab1;
     lab2:
         z->c = z->l - m1;
-        if (!(eq_s_b(z, 2, s_39))) return 0;
+        if (!(eq_s_b(z, 2, s_29))) return 0; /* literal, line 217 */
     }
 lab1:
     z->bra = z->c; /* ], line 217 */
-    {   int ret = slice_from_s(z, 1, s_40); /* <-, line 217 */
+    {   int ret = slice_from_s(z, 1, s_30); /* <-, line 217 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-extern int french_UTF_8_stem(struct SN_env * z) {
+extern int french_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 223 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 223 */
+        {   int ret = r_prelude(z); /* call prelude, line 223 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    {   int c2 = z->c; /* do, line 224 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab1; /* call mark_regions, line 224 */
-            if (ret < 0) return ret;
-        }
-    lab1:
-        z->c = c2;
+    /* do, line 224 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 224 */
+        if (ret == 0) goto lab1;
+        if (ret < 0) return ret;
     }
+lab1:
     z->lb = z->c; z->c = z->l; /* backwards, line 225 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 227 */
-        {   int m4 = z->l - z->c; (void)m4; /* or, line 237 */
-            {   int m5 = z->l - z->c; (void)m5; /* and, line 233 */
-                {   int m6 = z->l - z->c; (void)m6; /* or, line 229 */
-                    {   int ret = r_standard_suffix(z);
-                        if (ret == 0) goto lab6; /* call standard_suffix, line 229 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 227 */
+        {   int m3 = z->l - z->c; (void)m3; /* or, line 237 */
+            {   int m4 = z->l - z->c; (void)m4; /* and, line 233 */
+                {   int m5 = z->l - z->c; (void)m5; /* or, line 229 */
+                    {   int ret = r_standard_suffix(z); /* call standard_suffix, line 229 */
+                        if (ret == 0) goto lab6;
                         if (ret < 0) return ret;
                     }
                     goto lab5;
                 lab6:
-                    z->c = z->l - m6;
-                    {   int ret = r_i_verb_suffix(z);
-                        if (ret == 0) goto lab7; /* call i_verb_suffix, line 230 */
+                    z->c = z->l - m5;
+                    {   int ret = r_i_verb_suffix(z); /* call i_verb_suffix, line 230 */
+                        if (ret == 0) goto lab7;
                         if (ret < 0) return ret;
                     }
                     goto lab5;
                 lab7:
-                    z->c = z->l - m6;
-                    {   int ret = r_verb_suffix(z);
-                        if (ret == 0) goto lab4; /* call verb_suffix, line 231 */
+                    z->c = z->l - m5;
+                    {   int ret = r_verb_suffix(z); /* call verb_suffix, line 231 */
+                        if (ret == 0) goto lab4;
                         if (ret < 0) return ret;
                     }
                 }
             lab5:
-                z->c = z->l - m5;
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 234 */
+                z->c = z->l - m4;
+                {   int m6 = z->l - z->c; (void)m6; /* try, line 234 */
                     z->ket = z->c; /* [, line 234 */
                     {   int m7 = z->l - z->c; (void)m7; /* or, line 234 */
-                        if (!(eq_s_b(z, 1, s_41))) goto lab10;
+                        if (z->c <= z->lb || z->p[z->c - 1] != 'Y') goto lab10; /* literal, line 234 */
+                        z->c--;
                         z->bra = z->c; /* ], line 234 */
-                        {   int ret = slice_from_s(z, 1, s_42); /* <-, line 234 */
+                        {   int ret = slice_from_s(z, 1, s_31); /* <-, line 234 */
                             if (ret < 0) return ret;
                         }
                         goto lab9;
                     lab10:
                         z->c = z->l - m7;
-                        if (!(eq_s_b(z, 2, s_43))) { z->c = z->l - m_keep; goto lab8; }
+                        if (!(eq_s_b(z, 2, s_32))) { z->c = z->l - m6; goto lab8; } /* literal, line 235 */
                         z->bra = z->c; /* ], line 235 */
-                        {   int ret = slice_from_s(z, 1, s_44); /* <-, line 235 */
+                        {   int ret = slice_from_s(z, 1, s_33); /* <-, line 235 */
                             if (ret < 0) return ret;
                         }
                     }
@@ -1212,27 +1177,27 @@ extern int french_UTF_8_stem(struct SN_env * z) {
             }
             goto lab3;
         lab4:
-            z->c = z->l - m4;
-            {   int ret = r_residual_suffix(z);
-                if (ret == 0) goto lab2; /* call residual_suffix, line 238 */
+            z->c = z->l - m3;
+            {   int ret = r_residual_suffix(z); /* call residual_suffix, line 238 */
+                if (ret == 0) goto lab2;
                 if (ret < 0) return ret;
             }
         }
     lab3:
     lab2:
-        z->c = z->l - m3;
+        z->c = z->l - m2;
     }
     {   int m8 = z->l - z->c; (void)m8; /* do, line 243 */
-        {   int ret = r_un_double(z);
-            if (ret == 0) goto lab11; /* call un_double, line 243 */
+        {   int ret = r_un_double(z); /* call un_double, line 243 */
+            if (ret == 0) goto lab11;
             if (ret < 0) return ret;
         }
     lab11:
         z->c = z->l - m8;
     }
     {   int m9 = z->l - z->c; (void)m9; /* do, line 244 */
-        {   int ret = r_un_accent(z);
-            if (ret == 0) goto lab12; /* call un_accent, line 244 */
+        {   int ret = r_un_accent(z); /* call un_accent, line 244 */
+            if (ret == 0) goto lab12;
             if (ret < 0) return ret;
         }
     lab12:
@@ -1240,8 +1205,8 @@ extern int french_UTF_8_stem(struct SN_env * z) {
     }
     z->c = z->lb;
     {   int c10 = z->c; /* do, line 246 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab13; /* call postlude, line 246 */
+        {   int ret = r_postlude(z); /* call postlude, line 246 */
+            if (ret == 0) goto lab13;
             if (ret < 0) return ret;
         }
     lab13:
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_german.c b/src/backend/snowball/libstemmer/stem_UTF_8_german.c
index 5d406e5092..1a8b5924b4 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_german.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_german.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -36,12 +36,12 @@ static const symbol s_0_5[2] = { 0xC3, 0xBC };
 
 static const struct among a_0[6] =
 {
-/*  0 */ { 0, 0, -1, 6, 0},
+/*  0 */ { 0, 0, -1, 5, 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}
+/*  5 */ { 2, s_0_5, 0, 2, 0}
 };
 
 static const symbol s_1_0[1] = { 'e' };
@@ -54,13 +54,13 @@ static const symbol s_1_6[2] = { 'e', 's' };
 
 static const struct among a_1[7] =
 {
-/*  0 */ { 1, s_1_0, -1, 1, 0},
+/*  0 */ { 1, s_1_0, -1, 2, 0},
 /*  1 */ { 2, s_1_1, -1, 1, 0},
-/*  2 */ { 2, s_1_2, -1, 1, 0},
+/*  2 */ { 2, s_1_2, -1, 2, 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}
+/*  5 */ { 1, s_1_5, -1, 3, 0},
+/*  6 */ { 2, s_1_6, 5, 2, 0}
 };
 
 static const symbol s_2_0[2] = { 'e', 'n' };
@@ -114,168 +114,160 @@ static const unsigned char g_st_ending[] = { 117, 30, 4 };
 
 static const symbol s_0[] = { 0xC3, 0x9F };
 static const symbol s_1[] = { 's', 's' };
-static const symbol s_2[] = { 'u' };
-static const symbol s_3[] = { 'U' };
+static const symbol s_2[] = { 'U' };
+static const symbol s_3[] = { 'Y' };
 static const symbol s_4[] = { 'y' };
-static const symbol s_5[] = { 'Y' };
-static const symbol s_6[] = { 'y' };
-static const symbol s_7[] = { 'u' };
-static const symbol s_8[] = { 'a' };
-static const symbol s_9[] = { 'o' };
-static const symbol s_10[] = { 'u' };
-static const symbol s_11[] = { 'i', 'g' };
-static const symbol s_12[] = { 'e' };
-static const symbol s_13[] = { 'e' };
-static const symbol s_14[] = { 'e', 'r' };
-static const symbol s_15[] = { 'e', 'n' };
+static const symbol s_5[] = { 'u' };
+static const symbol s_6[] = { 'a' };
+static const symbol s_7[] = { 'o' };
+static const symbol s_8[] = { 'n', 'i', 's' };
+static const symbol s_9[] = { 'i', 'g' };
+static const symbol s_10[] = { 'e', 'r' };
+static const symbol s_11[] = { 'e', 'n' };
 
-static int r_prelude(struct SN_env * z) {
-    {   int c_test = z->c; /* test, line 30 */
-        while(1) { /* repeat, line 30 */
-            int c1 = z->c;
-            {   int c2 = 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 = slice_from_s(z, 2, s_1); /* <-, line 32 */
+static int r_prelude(struct SN_env * z) { /* forwardmode */
+    {   int c_test1 = z->c; /* test, line 35 */
+        while(1) { /* repeat, line 35 */
+            int c2 = z->c;
+            {   int c3 = z->c; /* or, line 38 */
+                z->bra = z->c; /* [, line 37 */
+                if (!(eq_s(z, 2, s_0))) goto lab2; /* literal, line 37 */
+                z->ket = z->c; /* ], line 37 */
+                {   int ret = slice_from_s(z, 2, s_1); /* <-, line 37 */
                     if (ret < 0) return ret;
                 }
                 goto lab1;
             lab2:
-                z->c = c2;
+                z->c = c3;
                 {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
                     if (ret < 0) goto lab0;
-                    z->c = ret; /* next, line 33 */
+                    z->c = ret; /* next, line 38 */
                 }
             }
         lab1:
             continue;
         lab0:
-            z->c = c1;
+            z->c = c2;
             break;
         }
-        z->c = c_test;
+        z->c = c_test1;
     }
-    while(1) { /* repeat, line 36 */
-        int c3 = z->c;
-        while(1) { /* goto, line 36 */
-            int c4 = z->c;
-            if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab4;
-            z->bra = z->c; /* [, line 37 */
-            {   int c5 = 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, 0)) goto lab6;
-                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 37 */
+    while(1) { /* repeat, line 41 */
+        int c4 = z->c;
+        while(1) { /* goto, line 41 */
+            int c5 = z->c;
+            if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab4; /* grouping v, line 42 */
+            z->bra = z->c; /* [, line 42 */
+            {   int c6 = z->c; /* or, line 42 */
+                if (z->c == z->l || z->p[z->c] != 'u') goto lab6; /* literal, line 42 */
+                z->c++;
+                z->ket = z->c; /* ], line 42 */
+                if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab6; /* grouping v, line 42 */
+                {   int ret = slice_from_s(z, 1, s_2); /* <-, line 42 */
                     if (ret < 0) return ret;
                 }
                 goto lab5;
             lab6:
-                z->c = c5;
-                if (!(eq_s(z, 1, s_4))) goto lab4;
-                z->ket = z->c; /* ], line 38 */
-                if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab4;
-                {   int ret = slice_from_s(z, 1, s_5); /* <-, line 38 */
+                z->c = c6;
+                if (z->c == z->l || z->p[z->c] != 'y') goto lab4; /* literal, line 43 */
+                z->c++;
+                z->ket = z->c; /* ], line 43 */
+                if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab4; /* grouping v, line 43 */
+                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 43 */
                     if (ret < 0) return ret;
                 }
             }
         lab5:
-            z->c = c4;
+            z->c = c5;
             break;
         lab4:
-            z->c = c4;
+            z->c = c5;
             {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
                 if (ret < 0) goto lab3;
-                z->c = ret; /* goto, line 36 */
+                z->c = ret; /* goto, line 41 */
             }
         }
         continue;
     lab3:
-        z->c = c3;
+        z->c = c4;
         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 ret = skip_utf8(z->p, z->c, 0, z->l, + 3);
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 49 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 50 */
+    {   int c_test1 = z->c; /* test, line 52 */
+        {   int ret = skip_utf8(z->p, z->c, 0, z->l, + 3); /* hop, line 52 */
             if (ret < 0) return 0;
-            z->c = ret; /* hop, line 47 */
+            z->c = ret;
         }
-        z->I[2] = z->c; /* setmark x, line 47 */
-        z->c = c_test;
+        z->I[2] = z->c; /* setmark x, line 52 */
+        z->c = c_test1;
     }
-    {    /* gopast */ /* grouping v, line 49 */
+    {    /* gopast */ /* grouping v, line 54 */
         int ret = out_grouping_U(z, g_v, 97, 252, 1);
         if (ret < 0) return 0;
         z->c += ret;
     }
-    {    /* gopast */ /* non v, line 49 */
+    {    /* gopast */ /* non v, line 54 */
         int ret = in_grouping_U(z, g_v, 97, 252, 1);
         if (ret < 0) return 0;
         z->c += ret;
     }
-    z->I[0] = z->c; /* setmark p1, line 49 */
-     /* try, line 50 */
-    if (!(z->I[0] < z->I[2])) goto lab0;
-    z->I[0] = z->I[2];
+    z->I[0] = z->c; /* setmark p1, line 54 */
+    /* try, line 55 */
+    if (!(z->I[0] < z->I[2])) goto lab0; /* $(<integer expression> < <integer expression>), line 55 */
+    z->I[0] = z->I[2]; /* $p1 = <integer expression>, line 55 */
 lab0:
-    {    /* gopast */ /* grouping v, line 51 */
+    {    /* gopast */ /* grouping v, line 56 */
         int ret = out_grouping_U(z, g_v, 97, 252, 1);
         if (ret < 0) return 0;
         z->c += ret;
     }
-    {    /* gopast */ /* non v, line 51 */
+    {    /* gopast */ /* non v, line 56 */
         int ret = in_grouping_U(z, g_v, 97, 252, 1);
         if (ret < 0) return 0;
         z->c += ret;
     }
-    z->I[1] = z->c; /* setmark p2, line 51 */
+    z->I[1] = z->c; /* setmark p2, line 56 */
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
-    while(1) { /* repeat, line 55 */
+    while(1) { /* repeat, line 60 */
         int c1 = z->c;
-        z->bra = z->c; /* [, line 57 */
-        among_var = find_among(z, a_0, 6); /* substring, line 57 */
+        z->bra = z->c; /* [, line 62 */
+        among_var = find_among(z, a_0, 6); /* substring, line 62 */
         if (!(among_var)) goto lab0;
-        z->ket = z->c; /* ], line 57 */
-        switch(among_var) {
-            case 0: goto lab0;
+        z->ket = z->c; /* ], line 62 */
+        switch (among_var) { /* among, line 62 */
             case 1:
-                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 58 */
+                {   int ret = slice_from_s(z, 1, s_4); /* <-, line 63 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 59 */
+                {   int ret = slice_from_s(z, 1, s_5); /* <-, line 64 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 3:
-                {   int ret = slice_from_s(z, 1, s_8); /* <-, line 60 */
+                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 65 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 4:
-                {   int ret = slice_from_s(z, 1, s_9); /* <-, line 61 */
+                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 66 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 5:
-                {   int ret = slice_from_s(z, 1, s_10); /* <-, line 62 */
-                    if (ret < 0) return ret;
-                }
-                break;
-            case 6:
                 {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
                     if (ret < 0) goto lab0;
-                    z->c = ret; /* next, line 63 */
+                    z->c = ret; /* next, line 68 */
                 }
                 break;
         }
@@ -287,38 +279,54 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 75 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 76 */
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int m1 = z->l - z->c; (void)m1; /* do, line 74 */
-        z->ket = z->c; /* [, line 75 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((811040 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab0;
-        among_var = find_among_b(z, a_1, 7); /* substring, line 75 */
+    {   int m1 = z->l - z->c; (void)m1; /* do, line 79 */
+        z->ket = z->c; /* [, line 80 */
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((811040 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab0; /* substring, line 80 */
+        among_var = find_among_b(z, a_1, 7);
         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 */
+        z->bra = z->c; /* ], line 80 */
+        {   int ret = r_R1(z); /* call R1, line 80 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 80 */
             case 1:
-                {   int ret = slice_del(z); /* delete, line 77 */
+                {   int ret = slice_del(z); /* delete, line 82 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                if (in_grouping_b_U(z, g_s_ending, 98, 116, 0)) goto lab0;
-                {   int ret = slice_del(z); /* delete, line 80 */
+                {   int ret = slice_del(z); /* delete, line 85 */
+                    if (ret < 0) return ret;
+                }
+                {   int m2 = z->l - z->c; (void)m2; /* try, line 86 */
+                    z->ket = z->c; /* [, line 86 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 's') { z->c = z->l - m2; goto lab1; } /* literal, line 86 */
+                    z->c--;
+                    z->bra = z->c; /* ], line 86 */
+                    if (!(eq_s_b(z, 3, s_8))) { z->c = z->l - m2; goto lab1; } /* literal, line 86 */
+                    {   int ret = slice_del(z); /* delete, line 86 */
+                        if (ret < 0) return ret;
+                    }
+                lab1:
+                    ;
+                }
+                break;
+            case 3:
+                if (in_grouping_b_U(z, g_s_ending, 98, 116, 0)) goto lab0; /* grouping s_ending, line 89 */
+                {   int ret = slice_del(z); /* delete, line 89 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -326,179 +334,171 @@ static int r_standard_suffix(struct SN_env * z) {
     lab0:
         z->c = z->l - m1;
     }
-    {   int m2 = z->l - z->c; (void)m2; /* do, line 84 */
-        z->ket = z->c; /* [, line 85 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1327104 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab1;
-        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 = 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, 0)) goto lab1;
-                {   int ret = skip_utf8(z->p, z->c, z->lb, z->l, - 3);
-                    if (ret < 0) goto lab1;
-                    z->c = ret; /* hop, line 90 */
-                }
-                {   int ret = slice_del(z); /* delete, line 90 */
-                    if (ret < 0) return ret;
-                }
-                break;
-        }
-    lab1:
-        z->c = z->l - m2;
-    }
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 94 */
-        z->ket = z->c; /* [, line 95 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1051024 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab2;
-        among_var = find_among_b(z, a_4, 8); /* substring, line 95 */
+    {   int m3 = z->l - z->c; (void)m3; /* do, line 93 */
+        z->ket = z->c; /* [, line 94 */
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1327104 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab2; /* substring, line 94 */
+        among_var = find_among_b(z, a_2, 4);
         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 */
+        z->bra = z->c; /* ], line 94 */
+        {   int ret = r_R1(z); /* call R1, line 94 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
-        switch(among_var) {
-            case 0: goto lab2;
+        switch (among_var) { /* among, line 94 */
             case 1:
-                {   int ret = slice_del(z); /* delete, line 97 */
+                {   int ret = slice_del(z); /* delete, line 96 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 98 */
-                    z->ket = z->c; /* [, line 98 */
-                    if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m_keep; goto lab3; }
-                    z->bra = z->c; /* ], line 98 */
-                    {   int m4 = z->l - z->c; (void)m4; /* not, line 98 */
-                        if (!(eq_s_b(z, 1, s_12))) goto lab4;
-                        { z->c = z->l - m_keep; goto lab3; }
-                    lab4:
-                        z->c = z->l - m4;
-                    }
-                    {   int ret = r_R2(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 98 */
-                        if (ret < 0) return ret;
-                    }
-                    {   int ret = slice_del(z); /* delete, line 98 */
-                        if (ret < 0) return ret;
-                    }
-                lab3:
-                    ;
-                }
                 break;
             case 2:
-                {   int m5 = z->l - z->c; (void)m5; /* not, line 101 */
-                    if (!(eq_s_b(z, 1, s_13))) goto lab5;
-                    goto lab2;
-                lab5:
-                    z->c = z->l - m5;
+                if (in_grouping_b_U(z, g_st_ending, 98, 116, 0)) goto lab2; /* grouping st_ending, line 99 */
+                {   int ret = skip_utf8(z->p, z->c, z->lb, z->l, - 3); /* hop, line 99 */
+                    if (ret < 0) goto lab2;
+                    z->c = ret;
                 }
-                {   int ret = slice_del(z); /* delete, line 101 */
+                {   int ret = slice_del(z); /* delete, line 99 */
                     if (ret < 0) return ret;
                 }
                 break;
-            case 3:
-                {   int ret = slice_del(z); /* delete, line 104 */
+        }
+    lab2:
+        z->c = z->l - m3;
+    }
+    {   int m4 = z->l - z->c; (void)m4; /* do, line 103 */
+        z->ket = z->c; /* [, line 104 */
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1051024 >> (z->p[z->c - 1] & 0x1f)) & 1)) goto lab3; /* substring, line 104 */
+        among_var = find_among_b(z, a_4, 8);
+        if (!(among_var)) goto lab3;
+        z->bra = z->c; /* ], line 104 */
+        {   int ret = r_R2(z); /* call R2, line 104 */
+            if (ret == 0) goto lab3;
+            if (ret < 0) return ret;
+        }
+        switch (among_var) { /* among, line 104 */
+            case 1:
+                {   int ret = slice_del(z); /* delete, line 106 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 105 */
-                    z->ket = z->c; /* [, line 106 */
-                    {   int m6 = z->l - z->c; (void)m6; /* or, line 106 */
-                        if (!(eq_s_b(z, 2, s_14))) goto lab8;
-                        goto lab7;
-                    lab8:
+                {   int m5 = z->l - z->c; (void)m5; /* try, line 107 */
+                    z->ket = z->c; /* [, line 107 */
+                    if (!(eq_s_b(z, 2, s_9))) { z->c = z->l - m5; goto lab4; } /* literal, line 107 */
+                    z->bra = z->c; /* ], line 107 */
+                    {   int m6 = z->l - z->c; (void)m6; /* not, line 107 */
+                        if (z->c <= z->lb || z->p[z->c - 1] != 'e') goto lab5; /* literal, line 107 */
+                        z->c--;
+                        { z->c = z->l - m5; goto lab4; }
+                    lab5:
                         z->c = z->l - m6;
-                        if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m_keep; goto lab6; }
                     }
-                lab7:
-                    z->bra = z->c; /* ], line 106 */
-                    {   int ret = r_R1(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab6; } /* call R1, line 106 */
+                    {   int ret = r_R2(z); /* call R2, line 107 */
+                        if (ret == 0) { z->c = z->l - m5; goto lab4; }
                         if (ret < 0) return ret;
                     }
-                    {   int ret = slice_del(z); /* delete, line 106 */
+                    {   int ret = slice_del(z); /* delete, line 107 */
                         if (ret < 0) return ret;
                     }
+                lab4:
+                    ;
+                }
+                break;
+            case 2:
+                {   int m7 = z->l - z->c; (void)m7; /* not, line 110 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'e') goto lab6; /* literal, line 110 */
+                    z->c--;
+                    goto lab3;
                 lab6:
-                    ;
+                    z->c = z->l - m7;
                 }
-                break;
-            case 4:
                 {   int ret = slice_del(z); /* delete, line 110 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 111 */
-                    z->ket = z->c; /* [, line 112 */
-                    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 103 && z->p[z->c - 1] != 104)) { z->c = z->l - m_keep; goto lab9; }
-                    among_var = find_among_b(z, a_3, 2); /* substring, line 112 */
-                    if (!(among_var)) { z->c = z->l - m_keep; goto lab9; }
-                    z->bra = z->c; /* ], line 112 */
-                    {   int ret = r_R2(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab9; } /* call R2, line 112 */
+                break;
+            case 3:
+                {   int ret = slice_del(z); /* delete, line 113 */
+                    if (ret < 0) return ret;
+                }
+                {   int m8 = z->l - z->c; (void)m8; /* try, line 114 */
+                    z->ket = z->c; /* [, line 115 */
+                    {   int m9 = z->l - z->c; (void)m9; /* or, line 115 */
+                        if (!(eq_s_b(z, 2, s_10))) goto lab9; /* literal, line 115 */
+                        goto lab8;
+                    lab9:
+                        z->c = z->l - m9;
+                        if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m8; goto lab7; } /* literal, line 115 */
+                    }
+                lab8:
+                    z->bra = z->c; /* ], line 115 */
+                    {   int ret = r_R1(z); /* call R1, line 115 */
+                        if (ret == 0) { z->c = z->l - m8; goto lab7; }
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret = slice_del(z); /* delete, line 115 */
                         if (ret < 0) return ret;
                     }
-                    switch(among_var) {
-                        case 0: { z->c = z->l - m_keep; goto lab9; }
-                        case 1:
-                            {   int ret = slice_del(z); /* delete, line 114 */
-                                if (ret < 0) return ret;
-                            }
-                            break;
+                lab7:
+                    ;
+                }
+                break;
+            case 4:
+                {   int ret = slice_del(z); /* delete, line 119 */
+                    if (ret < 0) return ret;
+                }
+                {   int m10 = z->l - z->c; (void)m10; /* try, line 120 */
+                    z->ket = z->c; /* [, line 121 */
+                    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 103 && z->p[z->c - 1] != 104)) { z->c = z->l - m10; goto lab10; } /* substring, line 121 */
+                    if (!(find_among_b(z, a_3, 2))) { z->c = z->l - m10; goto lab10; }
+                    z->bra = z->c; /* ], line 121 */
+                    {   int ret = r_R2(z); /* call R2, line 121 */
+                        if (ret == 0) { z->c = z->l - m10; goto lab10; }
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret = slice_del(z); /* delete, line 123 */
+                        if (ret < 0) return ret;
                     }
-                lab9:
+                lab10:
                     ;
                 }
                 break;
         }
-    lab2:
-        z->c = z->l - m3;
+    lab3:
+        z->c = z->l - m4;
     }
     return 1;
 }
 
-extern int german_UTF_8_stem(struct SN_env * z) {
-    {   int c1 = z->c; /* do, line 125 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 125 */
+extern int german_UTF_8_stem(struct SN_env * z) { /* forwardmode */
+    {   int c1 = z->c; /* do, line 134 */
+        {   int ret = r_prelude(z); /* call prelude, line 134 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    {   int c2 = z->c; /* do, line 126 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab1; /* call mark_regions, line 126 */
+    {   int c2 = z->c; /* do, line 135 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 135 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = c2;
     }
-    z->lb = z->c; z->c = z->l; /* backwards, line 127 */
+    z->lb = z->c; z->c = z->l; /* backwards, line 136 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* 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 - m3;
+    /* do, line 137 */
+    {   int ret = r_standard_suffix(z); /* call standard_suffix, line 137 */
+        if (ret == 0) goto lab2;
+        if (ret < 0) return ret;
     }
+lab2:
     z->c = z->lb;
-    {   int c4 = z->c; /* do, line 129 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab3; /* call postlude, line 129 */
+    {   int c3 = z->c; /* do, line 138 */
+        {   int ret = r_postlude(z); /* call postlude, line 138 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
-        z->c = c4;
+        z->c = c3;
     }
     return 1;
 }
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_hungarian.c b/src/backend/snowball/libstemmer/stem_UTF_8_hungarian.c
index e40df8e6c1..d8ae15aeab 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_hungarian.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_hungarian.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -123,7 +123,7 @@ static const symbol s_3_1[2] = { 'e', 'l' };
 static const struct among a_3[2] =
 {
 /*  0 */ { 2, s_3_0, -1, 1, 0},
-/*  1 */ { 2, s_3_1, -1, 2, 0}
+/*  1 */ { 2, s_3_1, -1, 1, 0}
 };
 
 static const symbol s_4_0[2] = { 'b', 'a' };
@@ -136,14 +136,14 @@ static const symbol s_4_6[3] = { 'n', 'e', 'k' };
 static const symbol s_4_7[3] = { 'v', 'a', 'l' };
 static const symbol s_4_8[3] = { 'v', 'e', 'l' };
 static const symbol s_4_9[2] = { 'u', 'l' };
-static const symbol s_4_10[4] = { 'n', 0xC3, 0xA1, 'l' };
-static const symbol s_4_11[4] = { 'n', 0xC3, 0xA9, 'l' };
-static const symbol s_4_12[4] = { 'b', 0xC3, 0xB3, 'l' };
-static const symbol s_4_13[4] = { 'r', 0xC3, 0xB3, 'l' };
-static const symbol s_4_14[4] = { 't', 0xC3, 0xB3, 'l' };
-static const symbol s_4_15[4] = { 'b', 0xC3, 0xB5, 'l' };
-static const symbol s_4_16[4] = { 'r', 0xC3, 0xB5, 'l' };
-static const symbol s_4_17[4] = { 't', 0xC3, 0xB5, 'l' };
+static const symbol s_4_10[4] = { 'b', 0xC5, 0x91, 'l' };
+static const symbol s_4_11[4] = { 'r', 0xC5, 0x91, 'l' };
+static const symbol s_4_12[4] = { 't', 0xC5, 0x91, 'l' };
+static const symbol s_4_13[4] = { 'n', 0xC3, 0xA1, 'l' };
+static const symbol s_4_14[4] = { 'n', 0xC3, 0xA9, 'l' };
+static const symbol s_4_15[4] = { 'b', 0xC3, 0xB3, 'l' };
+static const symbol s_4_16[4] = { 'r', 0xC3, 0xB3, 'l' };
+static const symbol s_4_17[4] = { 't', 0xC3, 0xB3, 'l' };
 static const symbol s_4_18[3] = { 0xC3, 0xBC, 'l' };
 static const symbol s_4_19[1] = { 'n' };
 static const symbol s_4_20[2] = { 'a', 'n' };
@@ -227,7 +227,7 @@ static const struct among a_5[3] =
 {
 /*  0 */ { 3, s_5_0, -1, 2, 0},
 /*  1 */ { 3, s_5_1, -1, 1, 0},
-/*  2 */ { 8, s_5_2, -1, 3, 0}
+/*  2 */ { 8, s_5_2, -1, 2, 0}
 };
 
 static const symbol s_6_0[4] = { 's', 't', 'u', 'l' };
@@ -239,12 +239,12 @@ static const symbol s_6_5[7] = { 0xC3, 0xA9, 's', 't', 0xC3, 0xBC, 'l' };
 
 static const struct among a_6[6] =
 {
-/*  0 */ { 4, s_6_0, -1, 2, 0},
+/*  0 */ { 4, s_6_0, -1, 1, 0},
 /*  1 */ { 5, s_6_1, 0, 1, 0},
-/*  2 */ { 6, s_6_2, 0, 3, 0},
-/*  3 */ { 5, s_6_3, -1, 2, 0},
+/*  2 */ { 6, s_6_2, 0, 2, 0},
+/*  3 */ { 5, s_6_3, -1, 1, 0},
 /*  4 */ { 6, s_6_4, 3, 1, 0},
-/*  5 */ { 7, s_6_5, 3, 4, 0}
+/*  5 */ { 7, s_6_5, 3, 3, 0}
 };
 
 static const symbol s_7_0[2] = { 0xC3, 0xA1 };
@@ -253,7 +253,7 @@ static const symbol s_7_1[2] = { 0xC3, 0xA9 };
 static const struct among a_7[2] =
 {
 /*  0 */ { 2, s_7_0, -1, 1, 0},
-/*  1 */ { 2, s_7_1, -1, 2, 0}
+/*  1 */ { 2, s_7_1, -1, 1, 0}
 };
 
 static const symbol s_8_0[1] = { 'k' };
@@ -266,10 +266,10 @@ static const symbol s_8_6[3] = { 0xC3, 0xB6, 'k' };
 
 static const struct among a_8[7] =
 {
-/*  0 */ { 1, s_8_0, -1, 7, 0},
-/*  1 */ { 2, s_8_1, 0, 4, 0},
-/*  2 */ { 2, s_8_2, 0, 6, 0},
-/*  3 */ { 2, s_8_3, 0, 5, 0},
+/*  0 */ { 1, s_8_0, -1, 3, 0},
+/*  1 */ { 2, s_8_1, 0, 3, 0},
+/*  2 */ { 2, s_8_2, 0, 3, 0},
+/*  3 */ { 2, s_8_3, 0, 3, 0},
 /*  4 */ { 3, s_8_4, 0, 1, 0},
 /*  5 */ { 3, s_8_5, 0, 2, 0},
 /*  6 */ { 3, s_8_6, 0, 3, 0}
@@ -290,18 +290,18 @@ static const symbol s_9_11[4] = { 0xC3, 0xA9, 0xC3, 0xA9 };
 
 static const struct among a_9[12] =
 {
-/*  0 */ { 3, s_9_0, -1, 7, 0},
-/*  1 */ { 5, s_9_1, 0, 6, 0},
-/*  2 */ { 5, s_9_2, 0, 5, 0},
-/*  3 */ { 2, s_9_3, -1, 9, 0},
-/*  4 */ { 3, s_9_4, 3, 4, 0},
+/*  0 */ { 3, s_9_0, -1, 1, 0},
+/*  1 */ { 5, s_9_1, 0, 3, 0},
+/*  2 */ { 5, s_9_2, 0, 2, 0},
+/*  3 */ { 2, s_9_3, -1, 1, 0},
+/*  4 */ { 3, s_9_4, 3, 1, 0},
 /*  5 */ { 4, s_9_5, 4, 1, 0},
 /*  6 */ { 4, s_9_6, 4, 1, 0},
 /*  7 */ { 4, s_9_7, 4, 1, 0},
 /*  8 */ { 5, s_9_8, 4, 3, 0},
 /*  9 */ { 5, s_9_9, 4, 2, 0},
 /* 10 */ { 5, s_9_10, 4, 1, 0},
-/* 11 */ { 4, s_9_11, 3, 8, 0}
+/* 11 */ { 4, s_9_11, 3, 2, 0}
 };
 
 static const symbol s_10_0[1] = { 'a' };
@@ -338,37 +338,37 @@ static const symbol s_10_30[2] = { 0xC3, 0xA9 };
 
 static const struct among a_10[31] =
 {
-/*  0 */ { 1, s_10_0, -1, 18, 0},
-/*  1 */ { 2, s_10_1, 0, 17, 0},
-/*  2 */ { 1, s_10_2, -1, 16, 0},
-/*  3 */ { 2, s_10_3, 2, 13, 0},
-/*  4 */ { 2, s_10_4, 2, 13, 0},
-/*  5 */ { 2, s_10_5, 2, 13, 0},
-/*  6 */ { 3, s_10_6, 2, 14, 0},
-/*  7 */ { 3, s_10_7, 2, 15, 0},
-/*  8 */ { 3, s_10_8, 2, 13, 0},
-/*  9 */ { 1, s_10_9, -1, 18, 0},
-/* 10 */ { 2, s_10_10, 9, 17, 0},
-/* 11 */ { 2, s_10_11, -1, 4, 0},
+/*  0 */ { 1, s_10_0, -1, 1, 0},
+/*  1 */ { 2, s_10_1, 0, 1, 0},
+/*  2 */ { 1, s_10_2, -1, 1, 0},
+/*  3 */ { 2, s_10_3, 2, 1, 0},
+/*  4 */ { 2, s_10_4, 2, 1, 0},
+/*  5 */ { 2, s_10_5, 2, 1, 0},
+/*  6 */ { 3, s_10_6, 2, 2, 0},
+/*  7 */ { 3, s_10_7, 2, 3, 0},
+/*  8 */ { 3, s_10_8, 2, 1, 0},
+/*  9 */ { 1, s_10_9, -1, 1, 0},
+/* 10 */ { 2, s_10_10, 9, 1, 0},
+/* 11 */ { 2, s_10_11, -1, 1, 0},
 /* 12 */ { 3, s_10_12, 11, 1, 0},
 /* 13 */ { 4, s_10_13, 11, 2, 0},
 /* 14 */ { 4, s_10_14, 11, 3, 0},
 /* 15 */ { 4, s_10_15, 11, 1, 0},
-/* 16 */ { 2, s_10_16, -1, 8, 0},
-/* 17 */ { 3, s_10_17, 16, 7, 0},
-/* 18 */ { 5, s_10_18, 17, 5, 0},
-/* 19 */ { 3, s_10_19, -1, 8, 0},
-/* 20 */ { 4, s_10_20, 19, 7, 0},
-/* 21 */ { 6, s_10_21, 20, 6, 0},
-/* 22 */ { 1, s_10_22, -1, 12, 0},
-/* 23 */ { 2, s_10_23, 22, 9, 0},
-/* 24 */ { 2, s_10_24, 22, 9, 0},
-/* 25 */ { 2, s_10_25, 22, 9, 0},
-/* 26 */ { 3, s_10_26, 22, 10, 0},
-/* 27 */ { 3, s_10_27, 22, 11, 0},
-/* 28 */ { 1, s_10_28, -1, 18, 0},
-/* 29 */ { 2, s_10_29, -1, 19, 0},
-/* 30 */ { 2, s_10_30, -1, 20, 0}
+/* 16 */ { 2, s_10_16, -1, 1, 0},
+/* 17 */ { 3, s_10_17, 16, 1, 0},
+/* 18 */ { 5, s_10_18, 17, 2, 0},
+/* 19 */ { 3, s_10_19, -1, 1, 0},
+/* 20 */ { 4, s_10_20, 19, 1, 0},
+/* 21 */ { 6, s_10_21, 20, 3, 0},
+/* 22 */ { 1, s_10_22, -1, 1, 0},
+/* 23 */ { 2, s_10_23, 22, 1, 0},
+/* 24 */ { 2, s_10_24, 22, 1, 0},
+/* 25 */ { 2, s_10_25, 22, 1, 0},
+/* 26 */ { 3, s_10_26, 22, 2, 0},
+/* 27 */ { 3, s_10_27, 22, 3, 0},
+/* 28 */ { 1, s_10_28, -1, 1, 0},
+/* 29 */ { 2, s_10_29, -1, 2, 0},
+/* 30 */ { 2, s_10_30, -1, 3, 0}
 };
 
 static const symbol s_11_0[2] = { 'i', 'd' };
@@ -416,97 +416,75 @@ static const symbol s_11_41[4] = { 0xC3, 0xA9, 'i', 'm' };
 
 static const struct among a_11[42] =
 {
-/*  0 */ { 2, s_11_0, -1, 10, 0},
-/*  1 */ { 3, s_11_1, 0, 9, 0},
-/*  2 */ { 4, s_11_2, 1, 6, 0},
-/*  3 */ { 3, s_11_3, 0, 9, 0},
-/*  4 */ { 4, s_11_4, 3, 6, 0},
-/*  5 */ { 4, s_11_5, 0, 7, 0},
-/*  6 */ { 4, s_11_6, 0, 8, 0},
-/*  7 */ { 1, s_11_7, -1, 15, 0},
-/*  8 */ { 2, s_11_8, 7, 14, 0},
-/*  9 */ { 3, s_11_9, 8, 11, 0},
-/* 10 */ { 2, s_11_10, 7, 14, 0},
-/* 11 */ { 3, s_11_11, 10, 11, 0},
-/* 12 */ { 3, s_11_12, 7, 12, 0},
-/* 13 */ { 3, s_11_13, 7, 13, 0},
-/* 14 */ { 4, s_11_14, -1, 24, 0},
-/* 15 */ { 5, s_11_15, 14, 21, 0},
-/* 16 */ { 6, s_11_16, 15, 20, 0},
-/* 17 */ { 6, s_11_17, 14, 23, 0},
-/* 18 */ { 2, s_11_18, -1, 29, 0},
-/* 19 */ { 3, s_11_19, 18, 26, 0},
-/* 20 */ { 4, s_11_20, 19, 25, 0},
-/* 21 */ { 3, s_11_21, 18, 26, 0},
-/* 22 */ { 4, s_11_22, 21, 25, 0},
-/* 23 */ { 4, s_11_23, 18, 27, 0},
-/* 24 */ { 4, s_11_24, 18, 28, 0},
-/* 25 */ { 3, s_11_25, -1, 20, 0},
-/* 26 */ { 4, s_11_26, 25, 17, 0},
-/* 27 */ { 5, s_11_27, 26, 16, 0},
-/* 28 */ { 4, s_11_28, 25, 17, 0},
-/* 29 */ { 5, s_11_29, 28, 16, 0},
-/* 30 */ { 5, s_11_30, 25, 18, 0},
-/* 31 */ { 5, s_11_31, 25, 19, 0},
-/* 32 */ { 5, s_11_32, -1, 21, 0},
-/* 33 */ { 6, s_11_33, 32, 20, 0},
-/* 34 */ { 6, s_11_34, -1, 22, 0},
-/* 35 */ { 2, s_11_35, -1, 5, 0},
-/* 36 */ { 3, s_11_36, 35, 4, 0},
+/*  0 */ { 2, s_11_0, -1, 1, 0},
+/*  1 */ { 3, s_11_1, 0, 1, 0},
+/*  2 */ { 4, s_11_2, 1, 1, 0},
+/*  3 */ { 3, s_11_3, 0, 1, 0},
+/*  4 */ { 4, s_11_4, 3, 1, 0},
+/*  5 */ { 4, s_11_5, 0, 2, 0},
+/*  6 */ { 4, s_11_6, 0, 3, 0},
+/*  7 */ { 1, s_11_7, -1, 1, 0},
+/*  8 */ { 2, s_11_8, 7, 1, 0},
+/*  9 */ { 3, s_11_9, 8, 1, 0},
+/* 10 */ { 2, s_11_10, 7, 1, 0},
+/* 11 */ { 3, s_11_11, 10, 1, 0},
+/* 12 */ { 3, s_11_12, 7, 2, 0},
+/* 13 */ { 3, s_11_13, 7, 3, 0},
+/* 14 */ { 4, s_11_14, -1, 1, 0},
+/* 15 */ { 5, s_11_15, 14, 1, 0},
+/* 16 */ { 6, s_11_16, 15, 1, 0},
+/* 17 */ { 6, s_11_17, 14, 3, 0},
+/* 18 */ { 2, s_11_18, -1, 1, 0},
+/* 19 */ { 3, s_11_19, 18, 1, 0},
+/* 20 */ { 4, s_11_20, 19, 1, 0},
+/* 21 */ { 3, s_11_21, 18, 1, 0},
+/* 22 */ { 4, s_11_22, 21, 1, 0},
+/* 23 */ { 4, s_11_23, 18, 2, 0},
+/* 24 */ { 4, s_11_24, 18, 3, 0},
+/* 25 */ { 3, s_11_25, -1, 1, 0},
+/* 26 */ { 4, s_11_26, 25, 1, 0},
+/* 27 */ { 5, s_11_27, 26, 1, 0},
+/* 28 */ { 4, s_11_28, 25, 1, 0},
+/* 29 */ { 5, s_11_29, 28, 1, 0},
+/* 30 */ { 5, s_11_30, 25, 2, 0},
+/* 31 */ { 5, s_11_31, 25, 3, 0},
+/* 32 */ { 5, s_11_32, -1, 1, 0},
+/* 33 */ { 6, s_11_33, 32, 1, 0},
+/* 34 */ { 6, s_11_34, -1, 2, 0},
+/* 35 */ { 2, s_11_35, -1, 1, 0},
+/* 36 */ { 3, s_11_36, 35, 1, 0},
 /* 37 */ { 4, s_11_37, 36, 1, 0},
-/* 38 */ { 3, s_11_38, 35, 4, 0},
+/* 38 */ { 3, s_11_38, 35, 1, 0},
 /* 39 */ { 4, s_11_39, 38, 1, 0},
 /* 40 */ { 4, s_11_40, 35, 2, 0},
 /* 41 */ { 4, s_11_41, 35, 3, 0}
 };
 
-static const unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 52, 14 };
+static const unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 17, 36, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1 };
 
 static const symbol s_0[] = { 'a' };
 static const symbol s_1[] = { 'e' };
 static const symbol s_2[] = { 'e' };
 static const symbol s_3[] = { 'a' };
 static const symbol s_4[] = { 'a' };
-static const symbol s_5[] = { 'a' };
-static const symbol s_6[] = { 'e' };
-static const symbol s_7[] = { 'a' };
+static const symbol s_5[] = { 'e' };
+static const symbol s_6[] = { 'a' };
+static const symbol s_7[] = { 'e' };
 static const symbol s_8[] = { 'e' };
-static const symbol s_9[] = { 'e' };
+static const symbol s_9[] = { 'a' };
 static const symbol s_10[] = { 'a' };
 static const symbol s_11[] = { 'e' };
 static const symbol s_12[] = { 'a' };
 static const symbol s_13[] = { 'e' };
-static const symbol s_14[] = { 'a' };
-static const symbol s_15[] = { 'e' };
-static const symbol s_16[] = { 'a' };
-static const symbol s_17[] = { 'e' };
-static const symbol s_18[] = { 'a' };
-static const symbol s_19[] = { 'e' };
-static const symbol s_20[] = { 'a' };
-static const symbol s_21[] = { 'e' };
-static const symbol s_22[] = { 'a' };
-static const symbol s_23[] = { 'e' };
-static const symbol s_24[] = { 'a' };
-static const symbol s_25[] = { 'e' };
-static const symbol s_26[] = { 'a' };
-static const symbol s_27[] = { 'e' };
-static const symbol s_28[] = { 'a' };
-static const symbol s_29[] = { 'e' };
-static const symbol s_30[] = { 'a' };
-static const symbol s_31[] = { 'e' };
-static const symbol s_32[] = { 'a' };
-static const symbol s_33[] = { 'e' };
-static const symbol s_34[] = { 'a' };
-static const symbol s_35[] = { 'e' };
 
-static int r_mark_regions(struct SN_env * z) {
-    z->I[0] = z->l;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 46 */
     {   int c1 = z->c; /* or, line 51 */
-        if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab1;
-        if (in_grouping_U(z, g_v, 97, 252, 1) < 0) goto lab1; /* goto */ /* non v, line 48 */
+        if (in_grouping_U(z, g_v, 97, 369, 0)) goto lab1; /* grouping v, line 48 */
+        if (in_grouping_U(z, g_v, 97, 369, 1) < 0) goto lab1; /* goto */ /* non v, line 48 */
         {   int c2 = z->c; /* or, line 49 */
-            if (z->c + 1 >= z->l || z->p[z->c + 1] >> 5 != 3 || !((101187584 >> (z->p[z->c + 1] & 0x1f)) & 1)) goto lab3;
-            if (!(find_among(z, a_0, 8))) goto lab3; /* among, line 49 */
+            if (z->c + 1 >= z->l || z->p[z->c + 1] >> 5 != 3 || !((101187584 >> (z->p[z->c + 1] & 0x1f)) & 1)) goto lab3; /* among, line 49 */
+            if (!(find_among(z, a_0, 8))) goto lab3;
             goto lab2;
         lab3:
             z->c = c2;
@@ -520,9 +498,9 @@ static int r_mark_regions(struct SN_env * z) {
         goto lab0;
     lab1:
         z->c = c1;
-        if (out_grouping_U(z, g_v, 97, 252, 0)) return 0;
+        if (out_grouping_U(z, g_v, 97, 369, 0)) return 0; /* non v, line 53 */
         {    /* gopast */ /* grouping v, line 53 */
-            int ret = out_grouping_U(z, g_v, 97, 252, 1);
+            int ret = out_grouping_U(z, g_v, 97, 369, 1);
             if (ret < 0) return 0;
             z->c += ret;
         }
@@ -532,24 +510,22 @@ lab0:
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 58 */
     return 1;
 }
 
-static int r_v_ending(struct SN_env * z) {
+static int r_v_ending(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 61 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 161 && z->p[z->c - 1] != 169)) return 0;
-    among_var = find_among_b(z, a_1, 2); /* substring, line 61 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 161 && z->p[z->c - 1] != 169)) return 0; /* substring, line 61 */
+    among_var = find_among_b(z, a_1, 2);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 61 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 61 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 61 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 61 */
         case 1:
             {   int ret = slice_from_s(z, 1, s_0); /* <-, line 62 */
                 if (ret < 0) return ret;
@@ -564,24 +540,24 @@ static int r_v_ending(struct SN_env * z) {
     return 1;
 }
 
-static int r_double(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 68 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((106790108 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-        if (!(find_among_b(z, a_2, 23))) return 0; /* among, line 68 */
-        z->c = z->l - m_test;
+static int r_double(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 68 */
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((106790108 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* among, line 68 */
+        if (!(find_among_b(z, a_2, 23))) return 0;
+        z->c = z->l - m_test1;
     }
     return 1;
 }
 
-static int r_undouble(struct SN_env * z) {
+static int r_undouble(struct SN_env * z) { /* backwardmode */
     {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
         if (ret < 0) return 0;
         z->c = ret; /* next, line 73 */
     }
     z->ket = z->c; /* [, line 73 */
-    {   int ret = skip_utf8(z->p, z->c, z->lb, z->l, - 1);
+    {   int ret = skip_utf8(z->p, z->c, z->lb, z->l, - 1); /* hop, line 73 */
         if (ret < 0) return 0;
-        z->c = ret; /* hop, line 73 */
+        z->c = ret;
     }
     z->bra = z->c; /* ], line 73 */
     {   int ret = slice_del(z); /* delete, line 73 */
@@ -590,73 +566,53 @@ static int r_undouble(struct SN_env * z) {
     return 1;
 }
 
-static int r_instrum(struct SN_env * z) {
-    int among_var;
+static int r_instrum(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 77 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] != 108) return 0;
-    among_var = find_among_b(z, a_3, 2); /* substring, line 77 */
-    if (!(among_var)) return 0;
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] != 108) return 0; /* substring, line 77 */
+    if (!(find_among_b(z, a_3, 2))) return 0;
     z->bra = z->c; /* ], line 77 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 77 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 77 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = r_double(z);
-                if (ret == 0) return 0; /* call double, line 78 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = r_double(z);
-                if (ret == 0) return 0; /* call double, line 79 */
-                if (ret < 0) return ret;
-            }
-            break;
+    {   int ret = r_double(z); /* call double, line 78 */
+        if (ret <= 0) return ret;
     }
     {   int ret = slice_del(z); /* delete, line 81 */
         if (ret < 0) return ret;
     }
-    {   int ret = r_undouble(z);
-        if (ret == 0) return 0; /* call undouble, line 82 */
-        if (ret < 0) return ret;
+    {   int ret = r_undouble(z); /* call undouble, line 82 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_case(struct SN_env * z) {
+static int r_case(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 87 */
     if (!(find_among_b(z, a_4, 44))) return 0; /* substring, line 87 */
     z->bra = z->c; /* ], line 87 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 87 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 87 */
+        if (ret <= 0) return ret;
     }
     {   int ret = slice_del(z); /* delete, line 111 */
         if (ret < 0) return ret;
     }
-    {   int ret = r_v_ending(z);
-        if (ret == 0) return 0; /* call v_ending, line 112 */
-        if (ret < 0) return ret;
+    {   int ret = r_v_ending(z); /* call v_ending, line 112 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_case_special(struct SN_env * z) {
+static int r_case_special(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 116 */
-    if (z->c - 2 <= z->lb || (z->p[z->c - 1] != 110 && z->p[z->c - 1] != 116)) return 0;
-    among_var = find_among_b(z, a_5, 3); /* substring, line 116 */
+    if (z->c - 2 <= z->lb || (z->p[z->c - 1] != 110 && z->p[z->c - 1] != 116)) return 0; /* substring, line 116 */
+    among_var = find_among_b(z, a_5, 3);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 116 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 116 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 116 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 116 */
         case 1:
             {   int ret = slice_from_s(z, 1, s_2); /* <-, line 117 */
                 if (ret < 0) return ret;
@@ -667,45 +623,33 @@ static int r_case_special(struct SN_env * z) {
                 if (ret < 0) return ret;
             }
             break;
-        case 3:
-            {   int ret = slice_from_s(z, 1, s_4); /* <-, line 119 */
-                if (ret < 0) return ret;
-            }
-            break;
     }
     return 1;
 }
 
-static int r_case_other(struct SN_env * z) {
+static int r_case_other(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 124 */
-    if (z->c - 3 <= z->lb || z->p[z->c - 1] != 108) return 0;
-    among_var = find_among_b(z, a_6, 6); /* substring, line 124 */
+    if (z->c - 3 <= z->lb || z->p[z->c - 1] != 108) return 0; /* substring, line 124 */
+    among_var = find_among_b(z, a_6, 6);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 124 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 124 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 124 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 124 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 125 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_del(z); /* delete, line 126 */
+            {   int ret = slice_from_s(z, 1, s_4); /* <-, line 127 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 1, s_5); /* <-, line 127 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 4:
-            {   int ret = slice_from_s(z, 1, s_6); /* <-, line 128 */
+            {   int ret = slice_from_s(z, 1, s_5); /* <-, line 128 */
                 if (ret < 0) return ret;
             }
             break;
@@ -713,62 +657,44 @@ static int r_case_other(struct SN_env * z) {
     return 1;
 }
 
-static int r_factive(struct SN_env * z) {
-    int among_var;
+static int r_factive(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 133 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 161 && z->p[z->c - 1] != 169)) return 0;
-    among_var = find_among_b(z, a_7, 2); /* substring, line 133 */
-    if (!(among_var)) return 0;
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 161 && z->p[z->c - 1] != 169)) return 0; /* substring, line 133 */
+    if (!(find_among_b(z, a_7, 2))) return 0;
     z->bra = z->c; /* ], line 133 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 133 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 133 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = r_double(z);
-                if (ret == 0) return 0; /* call double, line 134 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 2:
-            {   int ret = r_double(z);
-                if (ret == 0) return 0; /* call double, line 135 */
-                if (ret < 0) return ret;
-            }
-            break;
+    {   int ret = r_double(z); /* call double, line 134 */
+        if (ret <= 0) return ret;
     }
     {   int ret = slice_del(z); /* delete, line 137 */
         if (ret < 0) return ret;
     }
-    {   int ret = r_undouble(z);
-        if (ret == 0) return 0; /* call undouble, line 138 */
-        if (ret < 0) return ret;
+    {   int ret = r_undouble(z); /* call undouble, line 138 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_plural(struct SN_env * z) {
+static int r_plural(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 142 */
-    if (z->c <= z->lb || z->p[z->c - 1] != 107) return 0;
-    among_var = find_among_b(z, a_8, 7); /* substring, line 142 */
+    if (z->c <= z->lb || z->p[z->c - 1] != 107) return 0; /* substring, line 142 */
+    among_var = find_among_b(z, a_8, 7);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 142 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 142 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 142 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 142 */
         case 1:
-            {   int ret = slice_from_s(z, 1, s_7); /* <-, line 143 */
+            {   int ret = slice_from_s(z, 1, s_6); /* <-, line 143 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 1, s_8); /* <-, line 144 */
+            {   int ret = slice_from_s(z, 1, s_7); /* <-, line 144 */
                 if (ret < 0) return ret;
             }
             break;
@@ -777,85 +703,33 @@ static int r_plural(struct SN_env * z) {
                 if (ret < 0) return ret;
             }
             break;
-        case 4:
-            {   int ret = slice_del(z); /* delete, line 146 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 5:
-            {   int ret = slice_del(z); /* delete, line 147 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 6:
-            {   int ret = slice_del(z); /* delete, line 148 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 7:
-            {   int ret = slice_del(z); /* delete, line 149 */
-                if (ret < 0) return ret;
-            }
-            break;
     }
     return 1;
 }
 
-static int r_owned(struct SN_env * z) {
+static int r_owned(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 154 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 105 && z->p[z->c - 1] != 169)) return 0;
-    among_var = find_among_b(z, a_9, 12); /* substring, line 154 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 105 && z->p[z->c - 1] != 169)) return 0; /* substring, line 154 */
+    among_var = find_among_b(z, a_9, 12);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 154 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 154 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 154 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 154 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 155 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 1, s_9); /* <-, line 156 */
+            {   int ret = slice_from_s(z, 1, s_8); /* <-, line 156 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 1, s_10); /* <-, line 157 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 4:
-            {   int ret = slice_del(z); /* delete, line 158 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 5:
-            {   int ret = slice_from_s(z, 1, s_11); /* <-, line 159 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 6:
-            {   int ret = slice_from_s(z, 1, s_12); /* <-, line 160 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 7:
-            {   int ret = slice_del(z); /* delete, line 161 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 8:
-            {   int ret = slice_from_s(z, 1, s_13); /* <-, line 162 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 9:
-            {   int ret = slice_del(z); /* delete, line 163 */
+            {   int ret = slice_from_s(z, 1, s_9); /* <-, line 157 */
                 if (ret < 0) return ret;
             }
             break;
@@ -863,115 +737,28 @@ static int r_owned(struct SN_env * z) {
     return 1;
 }
 
-static int r_sing_owner(struct SN_env * z) {
+static int r_sing_owner(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 168 */
     among_var = find_among_b(z, a_10, 31); /* substring, line 168 */
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 168 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 168 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 168 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 168 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 169 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 1, s_14); /* <-, line 170 */
+            {   int ret = slice_from_s(z, 1, s_10); /* <-, line 170 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 1, s_15); /* <-, line 171 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 4:
-            {   int ret = slice_del(z); /* delete, line 172 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 5:
-            {   int ret = slice_from_s(z, 1, s_16); /* <-, line 173 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 6:
-            {   int ret = slice_from_s(z, 1, s_17); /* <-, line 174 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 7:
-            {   int ret = slice_del(z); /* delete, line 175 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 8:
-            {   int ret = slice_del(z); /* delete, line 176 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 9:
-            {   int ret = slice_del(z); /* delete, line 177 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 10:
-            {   int ret = slice_from_s(z, 1, s_18); /* <-, line 178 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 11:
-            {   int ret = slice_from_s(z, 1, s_19); /* <-, line 179 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 12:
-            {   int ret = slice_del(z); /* delete, line 180 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 13:
-            {   int ret = slice_del(z); /* delete, line 181 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 14:
-            {   int ret = slice_from_s(z, 1, s_20); /* <-, line 182 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 15:
-            {   int ret = slice_from_s(z, 1, s_21); /* <-, line 183 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 16:
-            {   int ret = slice_del(z); /* delete, line 184 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 17:
-            {   int ret = slice_del(z); /* delete, line 185 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 18:
-            {   int ret = slice_del(z); /* delete, line 186 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 19:
-            {   int ret = slice_from_s(z, 1, s_22); /* <-, line 187 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 20:
-            {   int ret = slice_from_s(z, 1, s_23); /* <-, line 188 */
+            {   int ret = slice_from_s(z, 1, s_11); /* <-, line 171 */
                 if (ret < 0) return ret;
             }
             break;
@@ -979,161 +766,29 @@ static int r_sing_owner(struct SN_env * z) {
     return 1;
 }
 
-static int r_plur_owner(struct SN_env * z) {
+static int r_plur_owner(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 193 */
-    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((10768 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_11, 42); /* substring, line 193 */
+    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((10768 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 193 */
+    among_var = find_among_b(z, a_11, 42);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 193 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 193 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 193 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 193 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 194 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 1, s_24); /* <-, line 195 */
+            {   int ret = slice_from_s(z, 1, s_12); /* <-, line 195 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 1, s_25); /* <-, line 196 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 4:
-            {   int ret = slice_del(z); /* delete, line 197 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 5:
-            {   int ret = slice_del(z); /* delete, line 198 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 6:
-            {   int ret = slice_del(z); /* delete, line 199 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 7:
-            {   int ret = slice_from_s(z, 1, s_26); /* <-, line 200 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 8:
-            {   int ret = slice_from_s(z, 1, s_27); /* <-, line 201 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 9:
-            {   int ret = slice_del(z); /* delete, line 202 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 10:
-            {   int ret = slice_del(z); /* delete, line 203 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 11:
-            {   int ret = slice_del(z); /* delete, line 204 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 12:
-            {   int ret = slice_from_s(z, 1, s_28); /* <-, line 205 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 13:
-            {   int ret = slice_from_s(z, 1, s_29); /* <-, line 206 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 14:
-            {   int ret = slice_del(z); /* delete, line 207 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 15:
-            {   int ret = slice_del(z); /* delete, line 208 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 16:
-            {   int ret = slice_del(z); /* delete, line 209 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 17:
-            {   int ret = slice_del(z); /* delete, line 210 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 18:
-            {   int ret = slice_from_s(z, 1, s_30); /* <-, line 211 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 19:
-            {   int ret = slice_from_s(z, 1, s_31); /* <-, line 212 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 20:
-            {   int ret = slice_del(z); /* delete, line 214 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 21:
-            {   int ret = slice_del(z); /* delete, line 215 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 22:
-            {   int ret = slice_from_s(z, 1, s_32); /* <-, line 216 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 23:
-            {   int ret = slice_from_s(z, 1, s_33); /* <-, line 217 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 24:
-            {   int ret = slice_del(z); /* delete, line 218 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 25:
-            {   int ret = slice_del(z); /* delete, line 219 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 26:
-            {   int ret = slice_del(z); /* delete, line 220 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 27:
-            {   int ret = slice_from_s(z, 1, s_34); /* <-, line 221 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 28:
-            {   int ret = slice_from_s(z, 1, s_35); /* <-, line 222 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 29:
-            {   int ret = slice_del(z); /* delete, line 223 */
+            {   int ret = slice_from_s(z, 1, s_13); /* <-, line 196 */
                 if (ret < 0) return ret;
             }
             break;
@@ -1141,10 +796,10 @@ static int r_plur_owner(struct SN_env * z) {
     return 1;
 }
 
-extern int hungarian_UTF_8_stem(struct SN_env * z) {
+extern int hungarian_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 229 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab0; /* call mark_regions, line 229 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 229 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
@@ -1153,72 +808,72 @@ extern int hungarian_UTF_8_stem(struct SN_env * z) {
     z->lb = z->c; z->c = z->l; /* backwards, line 230 */
 
     {   int m2 = z->l - z->c; (void)m2; /* do, line 231 */
-        {   int ret = r_instrum(z);
-            if (ret == 0) goto lab1; /* call instrum, line 231 */
+        {   int ret = r_instrum(z); /* call instrum, line 231 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
     {   int m3 = z->l - z->c; (void)m3; /* do, line 232 */
-        {   int ret = r_case(z);
-            if (ret == 0) goto lab2; /* call case, line 232 */
+        {   int ret = r_case(z); /* call case, line 232 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
         z->c = z->l - m3;
     }
     {   int m4 = z->l - z->c; (void)m4; /* do, line 233 */
-        {   int ret = r_case_special(z);
-            if (ret == 0) goto lab3; /* call case_special, line 233 */
+        {   int ret = r_case_special(z); /* call case_special, line 233 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
         z->c = z->l - m4;
     }
     {   int m5 = z->l - z->c; (void)m5; /* do, line 234 */
-        {   int ret = r_case_other(z);
-            if (ret == 0) goto lab4; /* call case_other, line 234 */
+        {   int ret = r_case_other(z); /* call case_other, line 234 */
+            if (ret == 0) goto lab4;
             if (ret < 0) return ret;
         }
     lab4:
         z->c = z->l - m5;
     }
     {   int m6 = z->l - z->c; (void)m6; /* do, line 235 */
-        {   int ret = r_factive(z);
-            if (ret == 0) goto lab5; /* call factive, line 235 */
+        {   int ret = r_factive(z); /* call factive, line 235 */
+            if (ret == 0) goto lab5;
             if (ret < 0) return ret;
         }
     lab5:
         z->c = z->l - m6;
     }
     {   int m7 = z->l - z->c; (void)m7; /* do, line 236 */
-        {   int ret = r_owned(z);
-            if (ret == 0) goto lab6; /* call owned, line 236 */
+        {   int ret = r_owned(z); /* call owned, line 236 */
+            if (ret == 0) goto lab6;
             if (ret < 0) return ret;
         }
     lab6:
         z->c = z->l - m7;
     }
     {   int m8 = z->l - z->c; (void)m8; /* do, line 237 */
-        {   int ret = r_sing_owner(z);
-            if (ret == 0) goto lab7; /* call sing_owner, line 237 */
+        {   int ret = r_sing_owner(z); /* call sing_owner, line 237 */
+            if (ret == 0) goto lab7;
             if (ret < 0) return ret;
         }
     lab7:
         z->c = z->l - m8;
     }
     {   int m9 = z->l - z->c; (void)m9; /* do, line 238 */
-        {   int ret = r_plur_owner(z);
-            if (ret == 0) goto lab8; /* call plur_owner, line 238 */
+        {   int ret = r_plur_owner(z); /* call plur_owner, line 238 */
+            if (ret == 0) goto lab8;
             if (ret < 0) return ret;
         }
     lab8:
         z->c = z->l - m9;
     }
     {   int m10 = z->l - z->c; (void)m10; /* do, line 239 */
-        {   int ret = r_plural(z);
-            if (ret == 0) goto lab9; /* call plural, line 239 */
+        {   int ret = r_plural(z); /* call plural, line 239 */
+            if (ret == 0) goto lab9;
             if (ret < 0) return ret;
         }
     lab9:
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_italian.c b/src/backend/snowball/libstemmer/stem_UTF_8_italian.c
index 395e38a548..7546960fac 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_italian.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_italian.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -476,34 +476,29 @@ static const symbol s_2[] = { 0xC3, 0xAC };
 static const symbol s_3[] = { 0xC3, 0xB2 };
 static const symbol s_4[] = { 0xC3, 0xB9 };
 static const symbol s_5[] = { 'q', 'U' };
-static const symbol s_6[] = { 'u' };
-static const symbol s_7[] = { 'U' };
+static const symbol s_6[] = { 'U' };
+static const symbol s_7[] = { 'I' };
 static const symbol s_8[] = { 'i' };
-static const symbol s_9[] = { 'I' };
-static const symbol s_10[] = { 'i' };
-static const symbol s_11[] = { 'u' };
-static const symbol s_12[] = { 'e' };
-static const symbol s_13[] = { 'i', 'c' };
-static const symbol s_14[] = { 'l', 'o', 'g' };
-static const symbol s_15[] = { 'u' };
-static const symbol s_16[] = { 'e', 'n', 't', 'e' };
-static const symbol s_17[] = { 'a', 't' };
-static const symbol s_18[] = { 'a', 't' };
-static const symbol s_19[] = { 'i', 'c' };
-static const symbol s_20[] = { 'i' };
-static const symbol s_21[] = { 'h' };
+static const symbol s_9[] = { 'u' };
+static const symbol s_10[] = { 'e' };
+static const symbol s_11[] = { 'i', 'c' };
+static const symbol s_12[] = { 'l', 'o', 'g' };
+static const symbol s_13[] = { 'u' };
+static const symbol s_14[] = { 'e', 'n', 't', 'e' };
+static const symbol s_15[] = { 'a', 't' };
+static const symbol s_16[] = { 'a', 't' };
+static const symbol s_17[] = { 'i', 'c' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     int among_var;
-    {   int c_test = z->c; /* test, line 35 */
+    {   int c_test1 = z->c; /* test, line 35 */
         while(1) { /* repeat, line 35 */
-            int c1 = z->c;
+            int c2 = 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;
+            switch (among_var) { /* among, line 36 */
                 case 1:
                     {   int ret = slice_from_s(z, 2, s_0); /* <-, line 37 */
                         if (ret < 0) return ret;
@@ -543,39 +538,41 @@ static int r_prelude(struct SN_env * z) {
             }
             continue;
         lab0:
-            z->c = c1;
+            z->c = c2;
             break;
         }
-        z->c = c_test;
+        z->c = c_test1;
     }
     while(1) { /* repeat, line 46 */
-        int c2 = z->c;
+        int c3 = z->c;
         while(1) { /* goto, line 46 */
-            int c3 = z->c;
-            if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab2;
+            int c4 = z->c;
+            if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab2; /* grouping v, line 47 */
             z->bra = z->c; /* [, line 47 */
-            {   int c4 = z->c; /* or, line 47 */
-                if (!(eq_s(z, 1, s_6))) goto lab4;
+            {   int c5 = z->c; /* or, line 47 */
+                if (z->c == z->l || z->p[z->c] != 'u') goto lab4; /* literal, line 47 */
+                z->c++;
                 z->ket = z->c; /* ], line 47 */
-                if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab4;
-                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 47 */
+                if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab4; /* grouping v, line 47 */
+                {   int ret = slice_from_s(z, 1, s_6); /* <-, line 47 */
                     if (ret < 0) return ret;
                 }
                 goto lab3;
             lab4:
-                z->c = c4;
-                if (!(eq_s(z, 1, s_8))) goto lab2;
+                z->c = c5;
+                if (z->c == z->l || z->p[z->c] != 'i') goto lab2; /* literal, line 48 */
+                z->c++;
                 z->ket = z->c; /* ], line 48 */
-                if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab2;
-                {   int ret = slice_from_s(z, 1, s_9); /* <-, line 48 */
+                if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab2; /* grouping v, line 48 */
+                {   int ret = slice_from_s(z, 1, s_7); /* <-, line 48 */
                     if (ret < 0) return ret;
                 }
             }
         lab3:
-            z->c = c3;
+            z->c = c4;
             break;
         lab2:
-            z->c = c3;
+            z->c = c4;
             {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
                 if (ret < 0) goto lab1;
                 z->c = ret; /* goto, line 46 */
@@ -583,21 +580,21 @@ static int r_prelude(struct SN_env * z) {
         }
         continue;
     lab1:
-        z->c = c2;
+        z->c = c3;
         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;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 54 */
+    z->I[1] = z->l; /* $p1 = <integer expression>, line 55 */
+    z->I[2] = z->l; /* $p2 = <integer expression>, line 56 */
     {   int c1 = z->c; /* do, line 58 */
         {   int c2 = z->c; /* or, line 60 */
-            if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab2;
+            if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab2; /* grouping v, line 59 */
             {   int c3 = z->c; /* or, line 59 */
-                if (out_grouping_U(z, g_v, 97, 249, 0)) goto lab4;
+                if (out_grouping_U(z, g_v, 97, 249, 0)) goto lab4; /* non v, line 59 */
                 {    /* gopast */ /* grouping v, line 59 */
                     int ret = out_grouping_U(z, g_v, 97, 249, 1);
                     if (ret < 0) goto lab4;
@@ -606,7 +603,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab3;
             lab4:
                 z->c = c3;
-                if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab2;
+                if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab2; /* grouping v, line 59 */
                 {    /* gopast */ /* non v, line 59 */
                     int ret = in_grouping_U(z, g_v, 97, 249, 1);
                     if (ret < 0) goto lab2;
@@ -617,9 +614,9 @@ static int r_mark_regions(struct SN_env * z) {
             goto lab1;
         lab2:
             z->c = c2;
-            if (out_grouping_U(z, g_v, 97, 249, 0)) goto lab0;
+            if (out_grouping_U(z, g_v, 97, 249, 0)) goto lab0; /* non v, line 61 */
             {   int c4 = z->c; /* or, line 61 */
-                if (out_grouping_U(z, g_v, 97, 249, 0)) goto lab6;
+                if (out_grouping_U(z, g_v, 97, 249, 0)) goto lab6; /* non v, line 61 */
                 {    /* gopast */ /* grouping v, line 61 */
                     int ret = out_grouping_U(z, g_v, 97, 249, 1);
                     if (ret < 0) goto lab6;
@@ -628,7 +625,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab5;
             lab6:
                 z->c = c4;
-                if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab0;
+                if (in_grouping_U(z, g_v, 97, 249, 0)) goto lab0; /* grouping v, line 61 */
                 {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
                     if (ret < 0) goto lab0;
                     z->c = ret; /* next, line 61 */
@@ -671,24 +668,23 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 70 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 72 */
-        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 85)) among_var = 3; else
-        among_var = find_among(z, a_1, 3); /* substring, line 72 */
+        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 85)) among_var = 3; else /* substring, line 72 */
+        among_var = find_among(z, a_1, 3);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 72 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 72 */
             case 1:
-                {   int ret = slice_from_s(z, 1, s_10); /* <-, line 73 */
+                {   int ret = slice_from_s(z, 1, s_8); /* <-, line 73 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_11); /* <-, line 74 */
+                {   int ret = slice_from_s(z, 1, s_9); /* <-, line 74 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -707,43 +703,41 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_RV(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_RV(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 82 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 83 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[2] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[2] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 84 */
     return 1;
 }
 
-static int r_attached_pronoun(struct SN_env * z) {
+static int r_attached_pronoun(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 87 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((33314 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    if (!(find_among_b(z, a_2, 37))) return 0; /* substring, line 87 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((33314 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 87 */
+    if (!(find_among_b(z, a_2, 37))) return 0;
     z->bra = z->c; /* ], line 87 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 111 && z->p[z->c - 1] != 114)) return 0;
-    among_var = find_among_b(z, a_3, 5); /* among, line 97 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 111 && z->p[z->c - 1] != 114)) return 0; /* among, line 97 */
+    among_var = find_among_b(z, a_3, 5);
     if (!(among_var)) return 0;
-    {   int ret = r_RV(z);
-        if (ret == 0) return 0; /* call RV, line 97 */
-        if (ret < 0) return ret;
+    {   int ret = r_RV(z); /* call RV, line 97 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 97 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 98 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 1, s_12); /* <-, line 99 */
+            {   int ret = slice_from_s(z, 1, s_10); /* <-, line 99 */
                 if (ret < 0) return ret;
             }
             break;
@@ -751,37 +745,34 @@ static int r_attached_pronoun(struct SN_env * z) {
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     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;
+    switch (among_var) { /* among, line 104 */
         case 1:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 111 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 111 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R2(z); /* call R2, line 113 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 113 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 114 */
+            {   int m1 = z->l - z->c; (void)m1; /* try, line 114 */
                 z->ket = z->c; /* [, line 114 */
-                if (!(eq_s_b(z, 2, s_13))) { z->c = z->l - m_keep; goto lab0; }
+                if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m1; goto lab0; } /* literal, line 114 */
                 z->bra = z->c; /* ], line 114 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call R2, line 114 */
+                {   int ret = r_R2(z); /* call R2, line 114 */
+                    if (ret == 0) { z->c = z->l - m1; goto lab0; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 114 */
@@ -792,70 +783,64 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 3:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 117 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 117 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_14); /* <-, line 117 */
+            {   int ret = slice_from_s(z, 3, s_12); /* <-, 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 = r_R2(z); /* call R2, line 119 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 1, s_15); /* <-, line 119 */
+            {   int ret = slice_from_s(z, 1, s_13); /* <-, 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 = r_R2(z); /* call R2, line 121 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 4, s_16); /* <-, line 121 */
+            {   int ret = slice_from_s(z, 4, s_14); /* <-, 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 = r_RV(z); /* call RV, line 123 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R1(z); /* call R1, line 125 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 125 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 126 */
+            {   int m2 = z->l - z->c; (void)m2; /* try, line 126 */
                 z->ket = z->c; /* [, line 127 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4722696 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab1; }
-                among_var = find_among_b(z, a_4, 4); /* substring, line 127 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab1; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4722696 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m2; goto lab1; } /* substring, line 127 */
+                among_var = find_among_b(z, a_4, 4);
+                if (!(among_var)) { z->c = z->l - m2; goto lab1; }
                 z->bra = z->c; /* ], line 127 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call R2, line 127 */
+                {   int ret = r_R2(z); /* call R2, line 127 */
+                    if (ret == 0) { z->c = z->l - m2; goto lab1; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 127 */
                     if (ret < 0) return ret;
                 }
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab1; }
+                switch (among_var) { /* among, line 127 */
                     case 1:
                         z->ket = z->c; /* [, line 128 */
-                        if (!(eq_s_b(z, 2, s_17))) { z->c = z->l - m_keep; goto lab1; }
+                        if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m2; goto lab1; } /* literal, line 128 */
                         z->bra = z->c; /* ], line 128 */
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call R2, line 128 */
+                        {   int ret = r_R2(z); /* call R2, line 128 */
+                            if (ret == 0) { z->c = z->l - m2; goto lab1; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 128 */
@@ -868,59 +853,51 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 8:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 134 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 134 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 134 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 135 */
+            {   int m3 = z->l - z->c; (void)m3; /* try, line 135 */
                 z->ket = z->c; /* [, line 136 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab2; }
-                among_var = find_among_b(z, a_5, 3); /* substring, line 136 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab2; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m3; goto lab2; } /* substring, line 136 */
+                if (!(find_among_b(z, a_5, 3))) { z->c = z->l - m3; goto lab2; }
                 z->bra = z->c; /* ], line 136 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab2; }
-                    case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab2; } /* call R2, line 137 */
-                            if (ret < 0) return ret;
-                        }
-                        {   int ret = slice_del(z); /* delete, line 137 */
-                            if (ret < 0) return ret;
-                        }
-                        break;
+                {   int ret = r_R2(z); /* call R2, line 137 */
+                    if (ret == 0) { z->c = z->l - m3; goto lab2; }
+                    if (ret < 0) return ret;
+                }
+                {   int ret = slice_del(z); /* delete, line 137 */
+                    if (ret < 0) return ret;
                 }
             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 = r_R2(z); /* call R2, line 142 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 142 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 143 */
+            {   int m4 = z->l - z->c; (void)m4; /* try, line 143 */
                 z->ket = z->c; /* [, line 143 */
-                if (!(eq_s_b(z, 2, s_18))) { z->c = z->l - m_keep; goto lab3; }
+                if (!(eq_s_b(z, 2, s_16))) { z->c = z->l - m4; goto lab3; } /* literal, line 143 */
                 z->bra = z->c; /* ], line 143 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 143 */
+                {   int ret = r_R2(z); /* call R2, line 143 */
+                    if (ret == 0) { z->c = z->l - m4; goto lab3; }
                     if (ret < 0) return ret;
                 }
                 {   int 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_keep; goto lab3; }
+                if (!(eq_s_b(z, 2, s_17))) { z->c = z->l - m4; goto lab3; } /* literal, line 143 */
                 z->bra = z->c; /* ], line 143 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 143 */
+                {   int ret = r_R2(z); /* call R2, line 143 */
+                    if (ret == 0) { z->c = z->l - m4; goto lab3; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 143 */
@@ -934,48 +911,40 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_verb_suffix(struct SN_env * z) {
-    int among_var;
-    {   int mlimit; /* setlimit, line 148 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_verb_suffix(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 148 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 148 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 149 */
-        among_var = find_among_b(z, a_7, 87); /* substring, line 149 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(find_among_b(z, a_7, 87))) { z->lb = mlimit1; return 0; } /* substring, line 149 */
         z->bra = z->c; /* ], line 149 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
-            case 1:
-                {   int ret = slice_del(z); /* delete, line 163 */
-                    if (ret < 0) return ret;
-                }
-                break;
+        {   int ret = slice_del(z); /* delete, line 163 */
+            if (ret < 0) return ret;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_vowel_suffix(struct SN_env * z) {
-    {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 171 */
+static int r_vowel_suffix(struct SN_env * z) { /* backwardmode */
+    {   int m1 = z->l - z->c; (void)m1; /* try, line 171 */
         z->ket = z->c; /* [, line 172 */
-        if (in_grouping_b_U(z, g_AEIO, 97, 242, 0)) { z->c = z->l - m_keep; goto lab0; }
+        if (in_grouping_b_U(z, g_AEIO, 97, 242, 0)) { z->c = z->l - m1; goto lab0; } /* grouping AEIO, line 172 */
         z->bra = z->c; /* ], line 172 */
-        {   int ret = r_RV(z);
-            if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call RV, line 172 */
+        {   int ret = r_RV(z); /* call RV, line 172 */
+            if (ret == 0) { z->c = z->l - m1; goto lab0; }
             if (ret < 0) return ret;
         }
         {   int 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_keep; goto lab0; }
+        if (z->c <= z->lb || z->p[z->c - 1] != 'i') { z->c = z->l - m1; goto lab0; } /* literal, line 173 */
+        z->c--;
         z->bra = z->c; /* ], line 173 */
-        {   int ret = r_RV(z);
-            if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call RV, line 173 */
+        {   int ret = r_RV(z); /* call RV, line 173 */
+            if (ret == 0) { z->c = z->l - m1; goto lab0; }
             if (ret < 0) return ret;
         }
         {   int ret = slice_del(z); /* delete, line 173 */
@@ -984,13 +953,14 @@ static int r_vowel_suffix(struct SN_env * z) {
     lab0:
         ;
     }
-    {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 175 */
+    {   int m2 = z->l - z->c; (void)m2; /* try, line 175 */
         z->ket = z->c; /* [, line 176 */
-        if (!(eq_s_b(z, 1, s_21))) { z->c = z->l - m_keep; goto lab1; }
+        if (z->c <= z->lb || z->p[z->c - 1] != 'h') { z->c = z->l - m2; goto lab1; } /* literal, line 176 */
+        z->c--;
         z->bra = z->c; /* ], line 176 */
-        if (in_grouping_b_U(z, g_CG, 99, 103, 0)) { z->c = z->l - m_keep; goto lab1; }
-        {   int ret = r_RV(z);
-            if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call RV, line 176 */
+        if (in_grouping_b_U(z, g_CG, 99, 103, 0)) { z->c = z->l - m2; goto lab1; } /* grouping CG, line 176 */
+        {   int ret = r_RV(z); /* call RV, line 176 */
+            if (ret == 0) { z->c = z->l - m2; goto lab1; }
             if (ret < 0) return ret;
         }
         {   int ret = slice_del(z); /* delete, line 176 */
@@ -1002,67 +972,65 @@ static int r_vowel_suffix(struct SN_env * z) {
     return 1;
 }
 
-extern int italian_UTF_8_stem(struct SN_env * z) {
+extern int italian_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 182 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 182 */
+        {   int ret = r_prelude(z); /* call prelude, line 182 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    {   int c2 = 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 = c2;
+    /* do, line 183 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 183 */
+        if (ret == 0) goto lab1;
+        if (ret < 0) return ret;
     }
+lab1:
     z->lb = z->c; z->c = z->l; /* backwards, line 184 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 185 */
-        {   int ret = r_attached_pronoun(z);
-            if (ret == 0) goto lab2; /* call attached_pronoun, line 185 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 185 */
+        {   int ret = r_attached_pronoun(z); /* call attached_pronoun, line 185 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
-        z->c = z->l - m3;
+        z->c = z->l - m2;
     }
-    {   int m4 = z->l - z->c; (void)m4; /* do, line 186 */
-        {   int m5 = z->l - z->c; (void)m5; /* or, line 186 */
-            {   int ret = r_standard_suffix(z);
-                if (ret == 0) goto lab5; /* call standard_suffix, line 186 */
+    {   int m3 = z->l - z->c; (void)m3; /* do, line 186 */
+        {   int m4 = z->l - z->c; (void)m4; /* or, line 186 */
+            {   int ret = r_standard_suffix(z); /* call standard_suffix, line 186 */
+                if (ret == 0) goto lab5;
                 if (ret < 0) return ret;
             }
             goto lab4;
         lab5:
-            z->c = z->l - m5;
-            {   int ret = r_verb_suffix(z);
-                if (ret == 0) goto lab3; /* call verb_suffix, line 186 */
+            z->c = z->l - m4;
+            {   int ret = r_verb_suffix(z); /* call verb_suffix, line 186 */
+                if (ret == 0) goto lab3;
                 if (ret < 0) return ret;
             }
         }
     lab4:
     lab3:
-        z->c = z->l - m4;
+        z->c = z->l - m3;
     }
-    {   int m6 = z->l - z->c; (void)m6; /* do, line 187 */
-        {   int ret = r_vowel_suffix(z);
-            if (ret == 0) goto lab6; /* call vowel_suffix, line 187 */
+    {   int m5 = z->l - z->c; (void)m5; /* do, line 187 */
+        {   int ret = r_vowel_suffix(z); /* call vowel_suffix, line 187 */
+            if (ret == 0) goto lab6;
             if (ret < 0) return ret;
         }
     lab6:
-        z->c = z->l - m6;
+        z->c = z->l - m5;
     }
     z->c = z->lb;
-    {   int c7 = z->c; /* do, line 189 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab7; /* call postlude, line 189 */
+    {   int c6 = z->c; /* do, line 189 */
+        {   int ret = r_postlude(z); /* call postlude, line 189 */
+            if (ret == 0) goto lab7;
             if (ret < 0) return ret;
         }
     lab7:
-        z->c = c7;
+        z->c = c6;
     }
     return 1;
 }
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_norwegian.c b/src/backend/snowball/libstemmer/stem_UTF_8_norwegian.c
index cbb0cd4601..62d221be55 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_norwegian.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_norwegian.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -129,18 +129,17 @@ static const unsigned char g_v[] = { 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 
 static const unsigned char g_s_ending[] = { 119, 125, 149, 1 };
 
-static const symbol s_0[] = { 'k' };
-static const symbol s_1[] = { 'e', 'r' };
+static const symbol s_0[] = { '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 ret = skip_utf8(z->p, z->c, 0, z->l, + 3);
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 28 */
+    {   int c_test1 = z->c; /* test, line 30 */
+        {   int ret = skip_utf8(z->p, z->c, 0, z->l, + 3); /* hop, line 30 */
             if (ret < 0) return 0;
-            z->c = ret; /* hop, line 30 */
+            z->c = ret;
         }
         z->I[1] = z->c; /* setmark x, line 30 */
-        z->c = c_test;
+        z->c = c_test1;
     }
     if (out_grouping_U(z, g_v, 97, 248, 1) < 0) return 0; /* goto */ /* grouping v, line 31 */
     {    /* gopast */ /* non v, line 31 */
@@ -149,30 +148,27 @@ static int r_mark_regions(struct SN_env * z) {
         z->c += ret;
     }
     z->I[0] = z->c; /* setmark p1, line 31 */
-     /* try, line 32 */
-    if (!(z->I[0] < z->I[1])) goto lab0;
-    z->I[0] = z->I[1];
+    /* try, line 32 */
+    if (!(z->I[0] < z->I[1])) goto lab0; /* $(<integer expression> < <integer expression>), line 32 */
+    z->I[0] = z->I[1]; /* $p1 = <integer expression>, line 32 */
 lab0:
     return 1;
 }
 
-static int r_main_suffix(struct SN_env * z) {
+static int r_main_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 38 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 38 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 38 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 38 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851426 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_0, 29); /* substring, line 38 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851426 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 38 */
+        among_var = find_among_b(z, a_0, 29);
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 38 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 39 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 44 */
                 if (ret < 0) return ret;
@@ -180,12 +176,13 @@ static int r_main_suffix(struct SN_env * z) {
             break;
         case 2:
             {   int m2 = z->l - z->c; (void)m2; /* or, line 46 */
-                if (in_grouping_b_U(z, g_s_ending, 98, 122, 0)) goto lab1;
+                if (in_grouping_b_U(z, g_s_ending, 98, 122, 0)) goto lab1; /* grouping s_ending, line 46 */
                 goto lab0;
             lab1:
                 z->c = z->l - m2;
-                if (!(eq_s_b(z, 1, s_0))) return 0;
-                if (out_grouping_b_U(z, g_v, 97, 248, 0)) return 0;
+                if (z->c <= z->lb || z->p[z->c - 1] != 'k') return 0; /* literal, line 46 */
+                z->c--;
+                if (out_grouping_b_U(z, g_v, 97, 248, 0)) return 0; /* non v, line 46 */
             }
         lab0:
             {   int ret = slice_del(z); /* delete, line 46 */
@@ -193,7 +190,7 @@ static int r_main_suffix(struct SN_env * z) {
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 2, s_1); /* <-, line 48 */
+            {   int ret = slice_from_s(z, 2, s_0); /* <-, line 48 */
                 if (ret < 0) return ret;
             }
             break;
@@ -201,21 +198,19 @@ static int r_main_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_consonant_pair(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 53 */
-        {   int mlimit; /* setlimit, line 54 */
-            int m1 = z->l - z->c; (void)m1;
+static int r_consonant_pair(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 53 */
+
+        {   int mlimit2; /* setlimit, line 54 */
             if (z->c < z->I[0]) return 0;
-            z->c = z->I[0]; /* tomark, line 54 */
-            mlimit = z->lb; z->lb = z->c;
-            z->c = z->l - m1;
+            mlimit2 = z->lb; z->lb = z->I[0];
             z->ket = z->c; /* [, line 54 */
-            if (z->c - 1 <= z->lb || z->p[z->c - 1] != 116) { z->lb = mlimit; return 0; }
-            if (!(find_among_b(z, a_1, 2))) { z->lb = mlimit; return 0; } /* substring, line 54 */
+            if (z->c - 1 <= z->lb || z->p[z->c - 1] != 116) { z->lb = mlimit2; return 0; } /* substring, line 54 */
+            if (!(find_among_b(z, a_1, 2))) { z->lb = mlimit2; return 0; }
             z->bra = z->c; /* ], line 54 */
-            z->lb = mlimit;
+            z->lb = mlimit2;
         }
-        z->c = z->l - m_test;
+        z->c = z->l - m_test1;
     }
     {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
         if (ret < 0) return 0;
@@ -228,36 +223,27 @@ static int r_consonant_pair(struct SN_env * z) {
     return 1;
 }
 
-static int r_other_suffix(struct SN_env * z) {
-    int among_var;
-    {   int mlimit; /* setlimit, line 63 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_other_suffix(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 63 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 63 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 63 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718720 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_2, 11); /* substring, line 63 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718720 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 63 */
+        if (!(find_among_b(z, a_2, 11))) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 63 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 67 */
-                if (ret < 0) return ret;
-            }
-            break;
+    {   int ret = slice_del(z); /* delete, line 67 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-extern int norwegian_UTF_8_stem(struct SN_env * z) {
+extern int norwegian_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 74 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab0; /* call mark_regions, line 74 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 74 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
@@ -266,24 +252,24 @@ extern int norwegian_UTF_8_stem(struct SN_env * z) {
     z->lb = z->c; z->c = z->l; /* backwards, line 75 */
 
     {   int m2 = z->l - z->c; (void)m2; /* do, line 76 */
-        {   int ret = r_main_suffix(z);
-            if (ret == 0) goto lab1; /* call main_suffix, line 76 */
+        {   int ret = r_main_suffix(z); /* call main_suffix, line 76 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
     {   int m3 = z->l - z->c; (void)m3; /* do, line 77 */
-        {   int ret = r_consonant_pair(z);
-            if (ret == 0) goto lab2; /* call consonant_pair, line 77 */
+        {   int ret = r_consonant_pair(z); /* call consonant_pair, line 77 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
         z->c = z->l - m3;
     }
     {   int m4 = z->l - z->c; (void)m4; /* do, line 78 */
-        {   int ret = r_other_suffix(z);
-            if (ret == 0) goto lab3; /* call other_suffix, line 78 */
+        {   int ret = r_other_suffix(z); /* call other_suffix, line 78 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_porter.c b/src/backend/snowball/libstemmer/stem_UTF_8_porter.c
index 421cc0e74a..bb83a7449a 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_porter.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_porter.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -115,21 +115,21 @@ static const struct among a_3[20] =
 /*  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},
+/*  5 */ { 5, s_3_5, -1, 11, 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},
+/*  7 */ { 5, s_3_7, -1, 9, 0},
+/*  8 */ { 6, s_3_8, -1, 13, 0},
+/*  9 */ { 5, s_3_9, -1, 12, 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},
+/* 12 */ { 5, s_3_12, -1, 9, 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}
+/* 17 */ { 7, s_3_17, -1, 12, 0},
+/* 18 */ { 7, s_3_18, -1, 10, 0},
+/* 19 */ { 7, s_3_19, -1, 11, 0}
 };
 
 static const symbol s_4_0[5] = { 'i', 'c', 'a', 't', 'e' };
@@ -203,63 +203,51 @@ static const symbol s_1[] = { 'i' };
 static const symbol s_2[] = { 'e', 'e' };
 static const symbol s_3[] = { 'e' };
 static const symbol s_4[] = { 'e' };
-static const symbol s_5[] = { 'y' };
-static const symbol s_6[] = { 'Y' };
-static const symbol s_7[] = { 'i' };
-static const symbol s_8[] = { 't', 'i', 'o', 'n' };
-static const symbol s_9[] = { 'e', 'n', 'c', 'e' };
-static const symbol s_10[] = { 'a', 'n', 'c', 'e' };
-static const symbol s_11[] = { 'a', 'b', 'l', 'e' };
-static const symbol s_12[] = { 'e', 'n', 't' };
-static const symbol s_13[] = { 'e' };
-static const symbol s_14[] = { 'i', 'z', 'e' };
-static const symbol s_15[] = { 'a', 't', 'e' };
-static const symbol s_16[] = { 'a', 'l' };
-static const symbol s_17[] = { 'a', 'l' };
-static const symbol s_18[] = { 'f', 'u', 'l' };
-static const symbol s_19[] = { 'o', 'u', 's' };
-static const symbol s_20[] = { 'i', 'v', 'e' };
-static const symbol s_21[] = { 'b', 'l', 'e' };
-static const symbol s_22[] = { 'a', 'l' };
-static const symbol s_23[] = { 'i', 'c' };
-static const symbol s_24[] = { 's' };
-static const symbol s_25[] = { 't' };
-static const symbol s_26[] = { 'e' };
-static const symbol s_27[] = { 'l' };
-static const symbol s_28[] = { 'l' };
-static const symbol s_29[] = { 'y' };
-static const symbol s_30[] = { 'Y' };
-static const symbol s_31[] = { 'y' };
-static const symbol s_32[] = { 'Y' };
-static const symbol s_33[] = { 'Y' };
-static const symbol s_34[] = { 'y' };
+static const symbol s_5[] = { 'i' };
+static const symbol s_6[] = { 't', 'i', 'o', 'n' };
+static const symbol s_7[] = { 'e', 'n', 'c', 'e' };
+static const symbol s_8[] = { 'a', 'n', 'c', 'e' };
+static const symbol s_9[] = { 'a', 'b', 'l', 'e' };
+static const symbol s_10[] = { 'e', 'n', 't' };
+static const symbol s_11[] = { 'e' };
+static const symbol s_12[] = { 'i', 'z', 'e' };
+static const symbol s_13[] = { 'a', 't', 'e' };
+static const symbol s_14[] = { 'a', 'l' };
+static const symbol s_15[] = { 'f', 'u', 'l' };
+static const symbol s_16[] = { 'o', 'u', 's' };
+static const symbol s_17[] = { 'i', 'v', 'e' };
+static const symbol s_18[] = { 'b', 'l', 'e' };
+static const symbol s_19[] = { 'a', 'l' };
+static const symbol s_20[] = { 'i', 'c' };
+static const symbol s_21[] = { 'Y' };
+static const symbol s_22[] = { 'Y' };
+static const symbol s_23[] = { 'y' };
 
-static int r_shortv(struct SN_env * z) {
-    if (out_grouping_b_U(z, g_v_WXY, 89, 121, 0)) return 0;
-    if (in_grouping_b_U(z, g_v, 97, 121, 0)) return 0;
-    if (out_grouping_b_U(z, g_v, 97, 121, 0)) return 0;
+static int r_shortv(struct SN_env * z) { /* backwardmode */
+    if (out_grouping_b_U(z, g_v_WXY, 89, 121, 0)) return 0; /* non v_WXY, line 19 */
+    if (in_grouping_b_U(z, g_v, 97, 121, 0)) return 0; /* grouping v, line 19 */
+    if (out_grouping_b_U(z, g_v, 97, 121, 0)) return 0; /* non v, line 19 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 21 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 22 */
     return 1;
 }
 
-static int r_Step_1a(struct SN_env * z) {
+static int r_Step_1a(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 25 */
-    if (z->c <= z->lb || z->p[z->c - 1] != 115) return 0;
-    among_var = find_among_b(z, a_0, 4); /* substring, line 25 */
+    if (z->c <= z->lb || z->p[z->c - 1] != 115) return 0; /* substring, line 25 */
+    among_var = find_among_b(z, a_0, 4);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 25 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 25 */
         case 1:
             {   int ret = slice_from_s(z, 2, s_0); /* <-, line 26 */
                 if (ret < 0) return ret;
@@ -279,48 +267,47 @@ static int r_Step_1a(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_1b(struct SN_env * z) {
+static int r_Step_1b(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 34 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 103)) return 0;
-    among_var = find_among_b(z, a_2, 3); /* substring, line 34 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 100 && z->p[z->c - 1] != 103)) return 0; /* substring, line 34 */
+    among_var = find_among_b(z, a_2, 3);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 34 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 34 */
         case 1:
-            {   int ret = r_R1(z);
-                if (ret == 0) return 0; /* call R1, line 35 */
-                if (ret < 0) return ret;
+            {   int ret = r_R1(z); /* call R1, line 35 */
+                if (ret <= 0) return ret;
             }
             {   int 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 */
+            {   int m_test1 = z->l - z->c; /* test, line 38 */
                 {    /* gopast */ /* grouping v, line 38 */
                     int ret = out_grouping_b_U(z, g_v, 97, 121, 1);
                     if (ret < 0) return 0;
                     z->c -= ret;
                 }
-                z->c = z->l - m_test;
+                z->c = z->l - m_test1;
             }
             {   int ret = slice_del(z); /* delete, line 38 */
                 if (ret < 0) return ret;
             }
-            {   int m_test = z->l - z->c; /* test, line 39 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68514004 >> (z->p[z->c - 1] & 0x1f)) & 1)) among_var = 3; else
-                among_var = find_among_b(z, a_1, 13); /* substring, line 39 */
+            {   int m_test2 = z->l - z->c; /* test, line 39 */
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((68514004 >> (z->p[z->c - 1] & 0x1f)) & 1)) among_var = 3; else /* substring, line 39 */
+                among_var = find_among_b(z, a_1, 13);
                 if (!(among_var)) return 0;
-                z->c = z->l - m_test;
+                z->c = z->l - m_test2;
             }
-            switch(among_var) {
-                case 0: return 0;
+            switch (among_var) { /* among, line 39 */
                 case 1:
-                    {   int c_keep = z->c;
-                        int ret = insert_s(z, z->c, z->c, 1, s_3); /* <+, line 41 */
-                        z->c = c_keep;
+                    {   int ret;
+                        {   int saved_c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_3); /* <+, line 41 */
+                            z->c = saved_c;
+                        }
                         if (ret < 0) return ret;
                     }
                     break;
@@ -337,16 +324,17 @@ static int r_Step_1b(struct SN_env * z) {
                     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;
+                    {   int m_test3 = z->l - z->c; /* test, line 45 */
+                        {   int ret = r_shortv(z); /* call shortv, line 45 */
+                            if (ret <= 0) return ret;
                         }
-                        z->c = z->l - m_test;
+                        z->c = z->l - m_test3;
                     }
-                    {   int c_keep = z->c;
-                        int ret = insert_s(z, z->c, z->c, 1, s_4); /* <+, line 45 */
-                        z->c = c_keep;
+                    {   int ret;
+                        {   int saved_c = z->c;
+                            ret = insert_s(z, z->c, z->c, 1, s_4); /* <+, line 45 */
+                            z->c = saved_c;
+                        }
                         if (ret < 0) return ret;
                     }
                     break;
@@ -356,14 +344,16 @@ static int r_Step_1b(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_1c(struct SN_env * z) {
+static int r_Step_1c(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 52 */
     {   int m1 = z->l - z->c; (void)m1; /* or, line 52 */
-        if (!(eq_s_b(z, 1, s_5))) goto lab1;
+        if (z->c <= z->lb || z->p[z->c - 1] != 'y') goto lab1; /* literal, line 52 */
+        z->c--;
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        if (!(eq_s_b(z, 1, s_6))) return 0;
+        if (z->c <= z->lb || z->p[z->c - 1] != 'Y') return 0; /* literal, line 52 */
+        z->c--;
     }
 lab0:
     z->bra = z->c; /* ], line 52 */
@@ -372,92 +362,85 @@ lab0:
         if (ret < 0) return 0;
         z->c -= ret;
     }
-    {   int ret = slice_from_s(z, 1, s_7); /* <-, line 54 */
+    {   int ret = slice_from_s(z, 1, s_5); /* <-, line 54 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_Step_2(struct SN_env * z) {
+static int r_Step_2(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 58 */
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((815616 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_3, 20); /* substring, line 58 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((815616 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 58 */
+    among_var = find_among_b(z, a_3, 20);
     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;
+    {   int ret = r_R1(z); /* call R1, line 58 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 58 */
         case 1:
-            {   int ret = slice_from_s(z, 4, s_8); /* <-, line 59 */
+            {   int ret = slice_from_s(z, 4, s_6); /* <-, line 59 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 4, s_9); /* <-, line 60 */
+            {   int ret = slice_from_s(z, 4, s_7); /* <-, line 60 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 4, s_10); /* <-, line 61 */
+            {   int ret = slice_from_s(z, 4, s_8); /* <-, line 61 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 4, s_11); /* <-, line 62 */
+            {   int ret = slice_from_s(z, 4, s_9); /* <-, line 62 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
-            {   int ret = slice_from_s(z, 3, s_12); /* <-, line 63 */
+            {   int ret = slice_from_s(z, 3, s_10); /* <-, line 63 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            {   int ret = slice_from_s(z, 1, s_13); /* <-, line 64 */
+            {   int ret = slice_from_s(z, 1, s_11); /* <-, line 64 */
                 if (ret < 0) return ret;
             }
             break;
         case 7:
-            {   int ret = slice_from_s(z, 3, s_14); /* <-, line 66 */
+            {   int ret = slice_from_s(z, 3, s_12); /* <-, line 66 */
                 if (ret < 0) return ret;
             }
             break;
         case 8:
-            {   int ret = slice_from_s(z, 3, s_15); /* <-, line 68 */
+            {   int ret = slice_from_s(z, 3, s_13); /* <-, line 68 */
                 if (ret < 0) return ret;
             }
             break;
         case 9:
-            {   int ret = slice_from_s(z, 2, s_16); /* <-, line 69 */
+            {   int ret = slice_from_s(z, 2, s_14); /* <-, line 69 */
                 if (ret < 0) return ret;
             }
             break;
         case 10:
-            {   int ret = slice_from_s(z, 2, s_17); /* <-, line 71 */
+            {   int ret = slice_from_s(z, 3, s_15); /* <-, line 72 */
                 if (ret < 0) return ret;
             }
             break;
         case 11:
-            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 72 */
+            {   int ret = slice_from_s(z, 3, s_16); /* <-, line 74 */
                 if (ret < 0) return ret;
             }
             break;
         case 12:
-            {   int ret = slice_from_s(z, 3, s_19); /* <-, line 74 */
+            {   int ret = slice_from_s(z, 3, s_17); /* <-, line 76 */
                 if (ret < 0) return ret;
             }
             break;
         case 13:
-            {   int ret = slice_from_s(z, 3, s_20); /* <-, line 76 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 14:
-            {   int ret = slice_from_s(z, 3, s_21); /* <-, line 77 */
+            {   int ret = slice_from_s(z, 3, s_18); /* <-, line 77 */
                 if (ret < 0) return ret;
             }
             break;
@@ -465,26 +448,24 @@ static int r_Step_2(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_3(struct SN_env * z) {
+static int r_Step_3(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 82 */
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((528928 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_4, 7); /* substring, line 82 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((528928 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 82 */
+    among_var = find_among_b(z, a_4, 7);
     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;
+    {   int ret = r_R1(z); /* call R1, line 82 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 82 */
         case 1:
-            {   int ret = slice_from_s(z, 2, s_22); /* <-, line 83 */
+            {   int ret = slice_from_s(z, 2, s_19); /* <-, line 83 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 2, s_23); /* <-, line 85 */
+            {   int ret = slice_from_s(z, 2, s_20); /* <-, line 85 */
                 if (ret < 0) return ret;
             }
             break;
@@ -497,19 +478,17 @@ static int r_Step_3(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_4(struct SN_env * z) {
+static int r_Step_4(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 92 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((3961384 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_5, 19); /* substring, line 92 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((3961384 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 92 */
+    among_var = find_among_b(z, a_5, 19);
     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;
+    {   int ret = r_R2(z); /* call R2, line 92 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 92 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 95 */
                 if (ret < 0) return ret;
@@ -517,11 +496,13 @@ static int r_Step_4(struct SN_env * z) {
             break;
         case 2:
             {   int m1 = z->l - z->c; (void)m1; /* or, line 96 */
-                if (!(eq_s_b(z, 1, s_24))) goto lab1;
+                if (z->c <= z->lb || z->p[z->c - 1] != 's') goto lab1; /* literal, line 96 */
+                z->c--;
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                if (!(eq_s_b(z, 1, s_25))) return 0;
+                if (z->c <= z->lb || z->p[z->c - 1] != 't') return 0; /* literal, line 96 */
+                z->c--;
             }
         lab0:
             {   int ret = slice_del(z); /* delete, line 96 */
@@ -532,25 +513,25 @@ static int r_Step_4(struct SN_env * z) {
     return 1;
 }
 
-static int r_Step_5a(struct SN_env * z) {
+static int r_Step_5a(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 101 */
-    if (!(eq_s_b(z, 1, s_26))) return 0;
+    if (z->c <= z->lb || z->p[z->c - 1] != 'e') return 0; /* literal, line 101 */
+    z->c--;
     z->bra = z->c; /* ], line 101 */
     {   int m1 = z->l - z->c; (void)m1; /* or, line 102 */
-        {   int ret = r_R2(z);
-            if (ret == 0) goto lab1; /* call R2, line 102 */
+        {   int ret = r_R2(z); /* call R2, line 102 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        {   int ret = r_R1(z);
-            if (ret == 0) return 0; /* call R1, line 102 */
-            if (ret < 0) return ret;
+        {   int ret = r_R1(z); /* call R1, line 102 */
+            if (ret <= 0) return ret;
         }
         {   int m2 = z->l - z->c; (void)m2; /* not, line 102 */
-            {   int ret = r_shortv(z);
-                if (ret == 0) goto lab2; /* call shortv, line 102 */
+            {   int ret = r_shortv(z); /* call shortv, line 102 */
+                if (ret == 0) goto lab2;
                 if (ret < 0) return ret;
             }
             return 0;
@@ -565,28 +546,30 @@ lab0:
     return 1;
 }
 
-static int r_Step_5b(struct SN_env * z) {
+static int r_Step_5b(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 107 */
-    if (!(eq_s_b(z, 1, s_27))) return 0;
+    if (z->c <= z->lb || z->p[z->c - 1] != 'l') return 0; /* literal, line 107 */
+    z->c--;
     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;
+    {   int ret = r_R2(z); /* call R2, line 108 */
+        if (ret <= 0) return ret;
     }
-    if (!(eq_s_b(z, 1, s_28))) return 0;
+    if (z->c <= z->lb || z->p[z->c - 1] != 'l') return 0; /* literal, line 108 */
+    z->c--;
     {   int ret = slice_del(z); /* delete, line 109 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-extern int porter_UTF_8_stem(struct SN_env * z) {
+extern int porter_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     z->B[0] = 0; /* unset Y_found, line 115 */
     {   int c1 = z->c; /* do, line 116 */
         z->bra = z->c; /* [, line 116 */
-        if (!(eq_s(z, 1, s_29))) goto lab0;
+        if (z->c == z->l || z->p[z->c] != 'y') goto lab0; /* literal, line 116 */
+        z->c++;
         z->ket = z->c; /* ], line 116 */
-        {   int ret = slice_from_s(z, 1, s_30); /* <-, line 116 */
+        {   int ret = slice_from_s(z, 1, s_21); /* <-, line 116 */
             if (ret < 0) return ret;
         }
         z->B[0] = 1; /* set Y_found, line 116 */
@@ -598,9 +581,10 @@ extern int porter_UTF_8_stem(struct SN_env * z) {
             int c3 = z->c;
             while(1) { /* goto, line 117 */
                 int c4 = z->c;
-                if (in_grouping_U(z, g_v, 97, 121, 0)) goto lab3;
+                if (in_grouping_U(z, g_v, 97, 121, 0)) goto lab3; /* grouping v, line 117 */
                 z->bra = z->c; /* [, line 117 */
-                if (!(eq_s(z, 1, s_31))) goto lab3;
+                if (z->c == z->l || z->p[z->c] != 'y') goto lab3; /* literal, line 117 */
+                z->c++;
                 z->ket = z->c; /* ], line 117 */
                 z->c = c4;
                 break;
@@ -611,7 +595,7 @@ extern int porter_UTF_8_stem(struct SN_env * z) {
                     z->c = ret; /* goto, line 117 */
                 }
             }
-            {   int ret = slice_from_s(z, 1, s_32); /* <-, line 117 */
+            {   int ret = slice_from_s(z, 1, s_22); /* <-, line 117 */
                 if (ret < 0) return ret;
             }
             z->B[0] = 1; /* set Y_found, line 117 */
@@ -622,8 +606,8 @@ extern int porter_UTF_8_stem(struct SN_env * z) {
         }
         z->c = c2;
     }
-    z->I[0] = z->l;
-    z->I[1] = z->l;
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 119 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 120 */
     {   int c5 = z->c; /* do, line 121 */
         {    /* gopast */ /* grouping v, line 122 */
             int ret = out_grouping_U(z, g_v, 97, 121, 1);
@@ -653,64 +637,64 @@ extern int porter_UTF_8_stem(struct SN_env * z) {
     z->lb = z->c; z->c = z->l; /* backwards, line 126 */
 
     {   int m6 = z->l - z->c; (void)m6; /* do, line 127 */
-        {   int ret = r_Step_1a(z);
-            if (ret == 0) goto lab5; /* call Step_1a, line 127 */
+        {   int ret = r_Step_1a(z); /* call Step_1a, line 127 */
+            if (ret == 0) goto lab5;
             if (ret < 0) return ret;
         }
     lab5:
         z->c = z->l - m6;
     }
     {   int m7 = z->l - z->c; (void)m7; /* do, line 128 */
-        {   int ret = r_Step_1b(z);
-            if (ret == 0) goto lab6; /* call Step_1b, line 128 */
+        {   int ret = r_Step_1b(z); /* call Step_1b, line 128 */
+            if (ret == 0) goto lab6;
             if (ret < 0) return ret;
         }
     lab6:
         z->c = z->l - m7;
     }
     {   int m8 = z->l - z->c; (void)m8; /* do, line 129 */
-        {   int ret = r_Step_1c(z);
-            if (ret == 0) goto lab7; /* call Step_1c, line 129 */
+        {   int ret = r_Step_1c(z); /* call Step_1c, line 129 */
+            if (ret == 0) goto lab7;
             if (ret < 0) return ret;
         }
     lab7:
         z->c = z->l - m8;
     }
     {   int m9 = z->l - z->c; (void)m9; /* do, line 130 */
-        {   int ret = r_Step_2(z);
-            if (ret == 0) goto lab8; /* call Step_2, line 130 */
+        {   int ret = r_Step_2(z); /* call Step_2, line 130 */
+            if (ret == 0) goto lab8;
             if (ret < 0) return ret;
         }
     lab8:
         z->c = z->l - m9;
     }
     {   int m10 = z->l - z->c; (void)m10; /* do, line 131 */
-        {   int ret = r_Step_3(z);
-            if (ret == 0) goto lab9; /* call Step_3, line 131 */
+        {   int ret = r_Step_3(z); /* call Step_3, line 131 */
+            if (ret == 0) goto lab9;
             if (ret < 0) return ret;
         }
     lab9:
         z->c = z->l - m10;
     }
     {   int m11 = z->l - z->c; (void)m11; /* do, line 132 */
-        {   int ret = r_Step_4(z);
-            if (ret == 0) goto lab10; /* call Step_4, line 132 */
+        {   int ret = r_Step_4(z); /* call Step_4, line 132 */
+            if (ret == 0) goto lab10;
             if (ret < 0) return ret;
         }
     lab10:
         z->c = z->l - m11;
     }
     {   int m12 = z->l - z->c; (void)m12; /* do, line 133 */
-        {   int ret = r_Step_5a(z);
-            if (ret == 0) goto lab11; /* call Step_5a, line 133 */
+        {   int ret = r_Step_5a(z); /* call Step_5a, line 133 */
+            if (ret == 0) goto lab11;
             if (ret < 0) return ret;
         }
     lab11:
         z->c = z->l - m12;
     }
     {   int m13 = z->l - z->c; (void)m13; /* do, line 134 */
-        {   int ret = r_Step_5b(z);
-            if (ret == 0) goto lab12; /* call Step_5b, line 134 */
+        {   int ret = r_Step_5b(z); /* call Step_5b, line 134 */
+            if (ret == 0) goto lab12;
             if (ret < 0) return ret;
         }
     lab12:
@@ -724,7 +708,8 @@ extern int porter_UTF_8_stem(struct SN_env * z) {
             while(1) { /* goto, line 137 */
                 int c16 = z->c;
                 z->bra = z->c; /* [, line 137 */
-                if (!(eq_s(z, 1, s_33))) goto lab15;
+                if (z->c == z->l || z->p[z->c] != 'Y') goto lab15; /* literal, line 137 */
+                z->c++;
                 z->ket = z->c; /* ], line 137 */
                 z->c = c16;
                 break;
@@ -735,7 +720,7 @@ extern int porter_UTF_8_stem(struct SN_env * z) {
                     z->c = ret; /* goto, line 137 */
                 }
             }
-            {   int ret = slice_from_s(z, 1, s_34); /* <-, line 137 */
+            {   int ret = slice_from_s(z, 1, s_23); /* <-, line 137 */
                 if (ret < 0) return ret;
             }
             continue;
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_portuguese.c b/src/backend/snowball/libstemmer/stem_UTF_8_portuguese.c
index 8939cfe016..f5f2e0fe0c 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_portuguese.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_portuguese.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -90,42 +90,42 @@ static const struct among a_4[3] =
 static const symbol s_5_0[3] = { 'i', 'c', 'a' };
 static const symbol s_5_1[6] = { 0xC3, 0xA2, 'n', 'c', 'i', 'a' };
 static const symbol s_5_2[6] = { 0xC3, 0xAA, 'n', 'c', 'i', 'a' };
-static const symbol s_5_3[3] = { 'i', 'r', 'a' };
-static const symbol s_5_4[5] = { 'a', 'd', 'o', 'r', 'a' };
-static const symbol s_5_5[3] = { 'o', 's', 'a' };
-static const symbol s_5_6[4] = { 'i', 's', 't', 'a' };
-static const symbol s_5_7[3] = { 'i', 'v', 'a' };
-static const symbol s_5_8[3] = { 'e', 'z', 'a' };
-static const symbol s_5_9[6] = { 'l', 'o', 'g', 0xC3, 0xAD, 'a' };
+static const symbol s_5_3[5] = { 'l', 'o', 'g', 'i', 'a' };
+static const symbol s_5_4[3] = { 'i', 'r', 'a' };
+static const symbol s_5_5[5] = { 'a', 'd', 'o', 'r', 'a' };
+static const symbol s_5_6[3] = { 'o', 's', 'a' };
+static const symbol s_5_7[4] = { 'i', 's', 't', 'a' };
+static const symbol s_5_8[3] = { 'i', 'v', 'a' };
+static const symbol s_5_9[3] = { 'e', 'z', 'a' };
 static const symbol s_5_10[5] = { 'i', 'd', 'a', 'd', 'e' };
 static const symbol s_5_11[4] = { 'a', 'n', 't', 'e' };
 static const symbol s_5_12[5] = { 'm', 'e', 'n', 't', 'e' };
 static const symbol s_5_13[6] = { 'a', 'm', 'e', 'n', 't', 'e' };
 static const symbol s_5_14[5] = { 0xC3, 0xA1, 'v', 'e', 'l' };
 static const symbol s_5_15[5] = { 0xC3, 0xAD, 'v', 'e', 'l' };
-static const symbol s_5_16[6] = { 'u', 'c', 'i', 0xC3, 0xB3, 'n' };
-static const symbol s_5_17[3] = { 'i', 'c', 'o' };
-static const symbol s_5_18[4] = { 'i', 's', 'm', 'o' };
-static const symbol s_5_19[3] = { 'o', 's', 'o' };
-static const symbol s_5_20[6] = { 'a', 'm', 'e', 'n', 't', 'o' };
-static const symbol s_5_21[6] = { 'i', 'm', 'e', 'n', 't', 'o' };
-static const symbol s_5_22[3] = { 'i', 'v', 'o' };
-static const symbol s_5_23[6] = { 'a', 0xC3, 0xA7, 'a', '~', 'o' };
+static const symbol s_5_16[3] = { 'i', 'c', 'o' };
+static const symbol s_5_17[4] = { 'i', 's', 'm', 'o' };
+static const symbol s_5_18[3] = { 'o', 's', 'o' };
+static const symbol s_5_19[6] = { 'a', 'm', 'e', 'n', 't', 'o' };
+static const symbol s_5_20[6] = { 'i', 'm', 'e', 'n', 't', 'o' };
+static const symbol s_5_21[3] = { 'i', 'v', 'o' };
+static const symbol s_5_22[6] = { 'a', 0xC3, 0xA7, 'a', '~', 'o' };
+static const symbol s_5_23[6] = { 'u', 0xC3, 0xA7, 'a', '~', 'o' };
 static const symbol s_5_24[4] = { 'a', 'd', 'o', 'r' };
 static const symbol s_5_25[4] = { 'i', 'c', 'a', 's' };
 static const symbol s_5_26[7] = { 0xC3, 0xAA, 'n', 'c', 'i', 'a', 's' };
-static const symbol s_5_27[4] = { 'i', 'r', 'a', 's' };
-static const symbol s_5_28[6] = { 'a', 'd', 'o', 'r', 'a', 's' };
-static const symbol s_5_29[4] = { 'o', 's', 'a', 's' };
-static const symbol s_5_30[5] = { 'i', 's', 't', 'a', 's' };
-static const symbol s_5_31[4] = { 'i', 'v', 'a', 's' };
-static const symbol s_5_32[4] = { 'e', 'z', 'a', 's' };
-static const symbol s_5_33[7] = { 'l', 'o', 'g', 0xC3, 0xAD, 'a', 's' };
+static const symbol s_5_27[6] = { 'l', 'o', 'g', 'i', 'a', 's' };
+static const symbol s_5_28[4] = { 'i', 'r', 'a', 's' };
+static const symbol s_5_29[6] = { 'a', 'd', 'o', 'r', 'a', 's' };
+static const symbol s_5_30[4] = { 'o', 's', 'a', 's' };
+static const symbol s_5_31[5] = { 'i', 's', 't', 'a', 's' };
+static const symbol s_5_32[4] = { 'i', 'v', 'a', 's' };
+static const symbol s_5_33[4] = { 'e', 'z', 'a', 's' };
 static const symbol s_5_34[6] = { 'i', 'd', 'a', 'd', 'e', 's' };
-static const symbol s_5_35[7] = { 'u', 'c', 'i', 'o', 'n', 'e', 's' };
-static const symbol s_5_36[6] = { 'a', 'd', 'o', 'r', 'e', 's' };
-static const symbol s_5_37[5] = { 'a', 'n', 't', 'e', 's' };
-static const symbol s_5_38[7] = { 'a', 0xC3, 0xA7, 'o', '~', 'e', 's' };
+static const symbol s_5_35[6] = { 'a', 'd', 'o', 'r', 'e', 's' };
+static const symbol s_5_36[5] = { 'a', 'n', 't', 'e', 's' };
+static const symbol s_5_37[7] = { 'a', 0xC3, 0xA7, 'o', '~', 'e', 's' };
+static const symbol s_5_38[7] = { 'u', 0xC3, 0xA7, 'o', '~', 'e', 's' };
 static const symbol s_5_39[4] = { 'i', 'c', 'o', 's' };
 static const symbol s_5_40[5] = { 'i', 's', 'm', 'o', 's' };
 static const symbol s_5_41[4] = { 'o', 's', 'o', 's' };
@@ -138,42 +138,42 @@ static const 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},
+/*  3 */ { 5, s_5_3, -1, 2, 0},
+/*  4 */ { 3, s_5_4, -1, 9, 0},
+/*  5 */ { 5, s_5_5, -1, 1, 0},
+/*  6 */ { 3, s_5_6, -1, 1, 0},
+/*  7 */ { 4, s_5_7, -1, 1, 0},
+/*  8 */ { 3, s_5_8, -1, 8, 0},
+/*  9 */ { 3, s_5_9, -1, 1, 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},
+/* 16 */ { 3, s_5_16, -1, 1, 0},
+/* 17 */ { 4, s_5_17, -1, 1, 0},
+/* 18 */ { 3, s_5_18, -1, 1, 0},
+/* 19 */ { 6, 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},
+/* 21 */ { 3, s_5_21, -1, 8, 0},
+/* 22 */ { 6, s_5_22, -1, 1, 0},
+/* 23 */ { 6, s_5_23, -1, 3, 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},
+/* 27 */ { 6, s_5_27, -1, 2, 0},
+/* 28 */ { 4, s_5_28, -1, 9, 0},
+/* 29 */ { 6, s_5_29, -1, 1, 0},
+/* 30 */ { 4, s_5_30, -1, 1, 0},
+/* 31 */ { 5, s_5_31, -1, 1, 0},
+/* 32 */ { 4, s_5_32, -1, 8, 0},
+/* 33 */ { 4, s_5_33, -1, 1, 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},
+/* 35 */ { 6, s_5_35, -1, 1, 0},
+/* 36 */ { 5, s_5_36, -1, 1, 0},
+/* 37 */ { 7, s_5_37, -1, 1, 0},
+/* 38 */ { 7, s_5_38, -1, 3, 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},
@@ -470,27 +470,19 @@ static const symbol s_5[] = { 'u' };
 static const symbol s_6[] = { 'e', 'n', 't', 'e' };
 static const symbol s_7[] = { 'a', 't' };
 static const symbol s_8[] = { 'a', 't' };
-static const symbol s_9[] = { 'e' };
-static const symbol s_10[] = { 'i', 'r' };
-static const symbol s_11[] = { 'u' };
-static const symbol s_12[] = { 'g' };
-static const symbol s_13[] = { 'i' };
-static const symbol s_14[] = { 'c' };
-static const symbol s_15[] = { 'c' };
-static const symbol s_16[] = { 'i' };
-static const symbol s_17[] = { 'c' };
+static const symbol s_9[] = { 'i', 'r' };
+static const symbol s_10[] = { 'c' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 36 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 37 */
-        if (z->c + 1 >= z->l || (z->p[z->c + 1] != 163 && z->p[z->c + 1] != 181)) among_var = 3; else
-        among_var = find_among(z, a_0, 3); /* substring, line 37 */
+        if (z->c + 1 >= z->l || (z->p[z->c + 1] != 163 && z->p[z->c + 1] != 181)) among_var = 3; else /* substring, line 37 */
+        among_var = find_among(z, a_0, 3);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 37 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 37 */
             case 1:
                 {   int ret = slice_from_s(z, 2, s_0); /* <-, line 38 */
                     if (ret < 0) return ret;
@@ -516,15 +508,15 @@ static int r_prelude(struct SN_env * z) {
     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;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 46 */
+    z->I[1] = z->l; /* $p1 = <integer expression>, line 47 */
+    z->I[2] = z->l; /* $p2 = <integer expression>, line 48 */
     {   int c1 = z->c; /* do, line 50 */
         {   int c2 = z->c; /* or, line 52 */
-            if (in_grouping_U(z, g_v, 97, 250, 0)) goto lab2;
+            if (in_grouping_U(z, g_v, 97, 250, 0)) goto lab2; /* grouping v, line 51 */
             {   int c3 = z->c; /* or, line 51 */
-                if (out_grouping_U(z, g_v, 97, 250, 0)) goto lab4;
+                if (out_grouping_U(z, g_v, 97, 250, 0)) goto lab4; /* non v, line 51 */
                 {    /* gopast */ /* grouping v, line 51 */
                     int ret = out_grouping_U(z, g_v, 97, 250, 1);
                     if (ret < 0) goto lab4;
@@ -533,7 +525,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab3;
             lab4:
                 z->c = c3;
-                if (in_grouping_U(z, g_v, 97, 250, 0)) goto lab2;
+                if (in_grouping_U(z, g_v, 97, 250, 0)) goto lab2; /* grouping v, line 51 */
                 {    /* gopast */ /* non v, line 51 */
                     int ret = in_grouping_U(z, g_v, 97, 250, 1);
                     if (ret < 0) goto lab2;
@@ -544,9 +536,9 @@ static int r_mark_regions(struct SN_env * z) {
             goto lab1;
         lab2:
             z->c = c2;
-            if (out_grouping_U(z, g_v, 97, 250, 0)) goto lab0;
+            if (out_grouping_U(z, g_v, 97, 250, 0)) goto lab0; /* non v, line 53 */
             {   int c4 = z->c; /* or, line 53 */
-                if (out_grouping_U(z, g_v, 97, 250, 0)) goto lab6;
+                if (out_grouping_U(z, g_v, 97, 250, 0)) goto lab6; /* non v, line 53 */
                 {    /* gopast */ /* grouping v, line 53 */
                     int ret = out_grouping_U(z, g_v, 97, 250, 1);
                     if (ret < 0) goto lab6;
@@ -555,7 +547,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab5;
             lab6:
                 z->c = c4;
-                if (in_grouping_U(z, g_v, 97, 250, 0)) goto lab0;
+                if (in_grouping_U(z, g_v, 97, 250, 0)) goto lab0; /* grouping v, line 53 */
                 {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
                     if (ret < 0) goto lab0;
                     z->c = ret; /* next, line 53 */
@@ -598,17 +590,16 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 62 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 63 */
-        if (z->c + 1 >= z->l || z->p[z->c + 1] != 126) among_var = 3; else
-        among_var = find_among(z, a_1, 3); /* substring, line 63 */
+        if (z->c + 1 >= z->l || z->p[z->c + 1] != 126) among_var = 3; else /* substring, line 63 */
+        among_var = find_among(z, a_1, 3);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 63 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 63 */
             case 1:
                 {   int ret = slice_from_s(z, 2, s_2); /* <-, line 64 */
                     if (ret < 0) return ret;
@@ -634,95 +625,88 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_RV(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_RV(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 72 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 73 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[2] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[2] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 74 */
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 77 */
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((839714 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_5, 45); /* substring, line 77 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((823330 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 77 */
+    among_var = find_among_b(z, a_5, 45);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 77 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 77 */
         case 1:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 93 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 93 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R2(z); /* call R2, line 98 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R2(z); /* call R2, line 102 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R2(z); /* call R2, line 106 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R1(z); /* call R1, line 110 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 110 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 111 */
+            {   int m1 = z->l - z->c; (void)m1; /* try, line 111 */
                 z->ket = z->c; /* [, line 112 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718616 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab0; }
-                among_var = find_among_b(z, a_2, 4); /* substring, line 112 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab0; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718616 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m1; goto lab0; } /* substring, line 112 */
+                among_var = find_among_b(z, a_2, 4);
+                if (!(among_var)) { z->c = z->l - m1; goto lab0; }
                 z->bra = z->c; /* ], line 112 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call R2, line 112 */
+                {   int ret = r_R2(z); /* call R2, line 112 */
+                    if (ret == 0) { z->c = z->l - m1; goto lab0; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 112 */
                     if (ret < 0) return ret;
                 }
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab0; }
+                switch (among_var) { /* among, line 112 */
                     case 1:
                         z->ket = z->c; /* [, line 113 */
-                        if (!(eq_s_b(z, 2, s_7))) { z->c = z->l - m_keep; goto lab0; }
+                        if (!(eq_s_b(z, 2, s_7))) { z->c = z->l - m1; goto lab0; } /* literal, line 113 */
                         z->bra = z->c; /* ], line 113 */
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call R2, line 113 */
+                        {   int ret = r_R2(z); /* call R2, line 113 */
+                            if (ret == 0) { z->c = z->l - m1; goto lab0; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 113 */
@@ -735,79 +719,64 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 6:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 122 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 122 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 122 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 123 */
+            {   int m2 = z->l - z->c; (void)m2; /* try, line 123 */
                 z->ket = z->c; /* [, line 124 */
-                if (z->c - 3 <= z->lb || (z->p[z->c - 1] != 101 && z->p[z->c - 1] != 108)) { z->c = z->l - m_keep; goto lab1; }
-                among_var = find_among_b(z, a_3, 3); /* substring, line 124 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab1; }
+                if (z->c - 3 <= z->lb || (z->p[z->c - 1] != 101 && z->p[z->c - 1] != 108)) { z->c = z->l - m2; goto lab1; } /* substring, line 124 */
+                if (!(find_among_b(z, a_3, 3))) { z->c = z->l - m2; goto lab1; }
                 z->bra = z->c; /* ], line 124 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab1; }
-                    case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call R2, line 127 */
-                            if (ret < 0) return ret;
-                        }
-                        {   int ret = slice_del(z); /* delete, line 127 */
-                            if (ret < 0) return ret;
-                        }
-                        break;
+                {   int ret = r_R2(z); /* call R2, line 127 */
+                    if (ret == 0) { z->c = z->l - m2; goto lab1; }
+                    if (ret < 0) return ret;
+                }
+                {   int ret = slice_del(z); /* delete, line 127 */
+                    if (ret < 0) return ret;
                 }
             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 = r_R2(z); /* call R2, line 134 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 134 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 135 */
+            {   int m3 = z->l - z->c; (void)m3; /* try, line 135 */
                 z->ket = z->c; /* [, line 136 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab2; }
-                among_var = find_among_b(z, a_4, 3); /* substring, line 136 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab2; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m3; goto lab2; } /* substring, line 136 */
+                if (!(find_among_b(z, a_4, 3))) { z->c = z->l - m3; goto lab2; }
                 z->bra = z->c; /* ], line 136 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab2; }
-                    case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab2; } /* call R2, line 139 */
-                            if (ret < 0) return ret;
-                        }
-                        {   int ret = slice_del(z); /* delete, line 139 */
-                            if (ret < 0) return ret;
-                        }
-                        break;
+                {   int ret = r_R2(z); /* call R2, line 139 */
+                    if (ret == 0) { z->c = z->l - m3; goto lab2; }
+                    if (ret < 0) return ret;
+                }
+                {   int ret = slice_del(z); /* delete, line 139 */
+                    if (ret < 0) return ret;
                 }
             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 = r_R2(z); /* call R2, line 146 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 146 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 147 */
+            {   int m4 = z->l - z->c; (void)m4; /* try, line 147 */
                 z->ket = z->c; /* [, line 148 */
-                if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m_keep; goto lab3; }
+                if (!(eq_s_b(z, 2, s_8))) { z->c = z->l - m4; goto lab3; } /* literal, line 148 */
                 z->bra = z->c; /* ], line 148 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 148 */
+                {   int ret = r_R2(z); /* call R2, line 148 */
+                    if (ret == 0) { z->c = z->l - m4; goto lab3; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 148 */
@@ -818,12 +787,12 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 9:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 153 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 153 */
+                if (ret <= 0) return ret;
             }
-            if (!(eq_s_b(z, 1, s_9))) return 0;
-            {   int ret = slice_from_s(z, 2, s_10); /* <-, line 154 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'e') return 0; /* literal, line 153 */
+            z->c--;
+            {   int ret = slice_from_s(z, 2, s_9); /* <-, line 154 */
                 if (ret < 0) return ret;
             }
             break;
@@ -831,97 +800,81 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_verb_suffix(struct SN_env * z) {
-    int among_var;
-    {   int mlimit; /* setlimit, line 159 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_verb_suffix(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 159 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 159 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 160 */
-        among_var = find_among_b(z, a_6, 120); /* substring, line 160 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(find_among_b(z, a_6, 120))) { z->lb = mlimit1; return 0; } /* substring, line 160 */
         z->bra = z->c; /* ], line 160 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
-            case 1:
-                {   int ret = slice_del(z); /* delete, line 179 */
-                    if (ret < 0) return ret;
-                }
-                break;
+        {   int ret = slice_del(z); /* delete, line 179 */
+            if (ret < 0) return ret;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_residual_suffix(struct SN_env * z) {
-    int among_var;
+static int r_residual_suffix(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 184 */
-    among_var = find_among_b(z, a_7, 7); /* substring, line 184 */
-    if (!(among_var)) return 0;
+    if (!(find_among_b(z, a_7, 7))) return 0; /* substring, line 184 */
     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 = slice_del(z); /* delete, line 187 */
-                if (ret < 0) return ret;
-            }
-            break;
+    {   int ret = r_RV(z); /* call RV, line 187 */
+        if (ret <= 0) return ret;
+    }
+    {   int ret = slice_del(z); /* delete, line 187 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_residual_form(struct SN_env * z) {
+static int r_residual_form(struct SN_env * z) { /* backwardmode */
     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;
+    switch (among_var) { /* among, line 192 */
         case 1:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 194 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 194 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 194 */
                 if (ret < 0) return ret;
             }
             z->ket = z->c; /* [, line 194 */
             {   int m1 = z->l - z->c; (void)m1; /* or, line 194 */
-                if (!(eq_s_b(z, 1, s_11))) goto lab1;
+                if (z->c <= z->lb || z->p[z->c - 1] != 'u') goto lab1; /* literal, line 194 */
+                z->c--;
                 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;
+                {   int m_test2 = z->l - z->c; /* test, line 194 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'g') goto lab1; /* literal, line 194 */
+                    z->c--;
+                    z->c = z->l - m_test2;
                 }
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                if (!(eq_s_b(z, 1, s_13))) return 0;
+                if (z->c <= z->lb || z->p[z->c - 1] != 'i') return 0; /* literal, line 195 */
+                z->c--;
                 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;
+                {   int m_test3 = z->l - z->c; /* test, line 195 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'c') return 0; /* literal, line 195 */
+                    z->c--;
+                    z->c = z->l - m_test3;
                 }
             }
         lab0:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 195 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 195 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 195 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 1, s_15); /* <-, line 196 */
+            {   int ret = slice_from_s(z, 1, s_10); /* <-, line 196 */
                 if (ret < 0) return ret;
             }
             break;
@@ -929,77 +882,77 @@ static int r_residual_form(struct SN_env * z) {
     return 1;
 }
 
-extern int portuguese_UTF_8_stem(struct SN_env * z) {
+extern int portuguese_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 202 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 202 */
+        {   int ret = r_prelude(z); /* call prelude, line 202 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    {   int c2 = 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 = c2;
+    /* do, line 203 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 203 */
+        if (ret == 0) goto lab1;
+        if (ret < 0) return ret;
     }
+lab1:
     z->lb = z->c; z->c = z->l; /* backwards, line 204 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 205 */
-        {   int m4 = z->l - z->c; (void)m4; /* or, line 209 */
-            {   int m5 = z->l - z->c; (void)m5; /* and, line 207 */
-                {   int m6 = z->l - z->c; (void)m6; /* or, line 206 */
-                    {   int ret = r_standard_suffix(z);
-                        if (ret == 0) goto lab6; /* call standard_suffix, line 206 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 205 */
+        {   int m3 = z->l - z->c; (void)m3; /* or, line 209 */
+            {   int m4 = z->l - z->c; (void)m4; /* and, line 207 */
+                {   int m5 = z->l - z->c; (void)m5; /* or, line 206 */
+                    {   int ret = r_standard_suffix(z); /* call standard_suffix, line 206 */
+                        if (ret == 0) goto lab6;
                         if (ret < 0) return ret;
                     }
                     goto lab5;
                 lab6:
-                    z->c = z->l - m6;
-                    {   int ret = r_verb_suffix(z);
-                        if (ret == 0) goto lab4; /* call verb_suffix, line 206 */
+                    z->c = z->l - m5;
+                    {   int ret = r_verb_suffix(z); /* call verb_suffix, line 206 */
+                        if (ret == 0) goto lab4;
                         if (ret < 0) return ret;
                     }
                 }
             lab5:
-                z->c = z->l - m5;
-                {   int m7 = z->l - z->c; (void)m7; /* do, line 207 */
+                z->c = z->l - m4;
+                {   int m6 = z->l - z->c; (void)m6; /* do, line 207 */
                     z->ket = z->c; /* [, line 207 */
-                    if (!(eq_s_b(z, 1, s_16))) goto lab7;
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'i') goto lab7; /* literal, line 207 */
+                    z->c--;
                     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 m_test7 = z->l - z->c; /* test, line 207 */
+                        if (z->c <= z->lb || z->p[z->c - 1] != 'c') goto lab7; /* literal, line 207 */
+                        z->c--;
+                        z->c = z->l - m_test7;
                     }
-                    {   int ret = r_RV(z);
-                        if (ret == 0) goto lab7; /* call RV, line 207 */
+                    {   int ret = r_RV(z); /* call RV, line 207 */
+                        if (ret == 0) goto lab7;
                         if (ret < 0) return ret;
                     }
                     {   int ret = slice_del(z); /* delete, line 207 */
                         if (ret < 0) return ret;
                     }
                 lab7:
-                    z->c = z->l - m7;
+                    z->c = z->l - m6;
                 }
             }
             goto lab3;
         lab4:
-            z->c = z->l - m4;
-            {   int ret = r_residual_suffix(z);
-                if (ret == 0) goto lab2; /* call residual_suffix, line 209 */
+            z->c = z->l - m3;
+            {   int ret = r_residual_suffix(z); /* call residual_suffix, line 209 */
+                if (ret == 0) goto lab2;
                 if (ret < 0) return ret;
             }
         }
     lab3:
     lab2:
-        z->c = z->l - m3;
+        z->c = z->l - m2;
     }
     {   int m8 = z->l - z->c; (void)m8; /* do, line 211 */
-        {   int ret = r_residual_form(z);
-            if (ret == 0) goto lab8; /* call residual_form, line 211 */
+        {   int ret = r_residual_form(z); /* call residual_form, line 211 */
+            if (ret == 0) goto lab8;
             if (ret < 0) return ret;
         }
     lab8:
@@ -1007,8 +960,8 @@ extern int portuguese_UTF_8_stem(struct SN_env * z) {
     }
     z->c = z->lb;
     {   int c9 = z->c; /* do, line 213 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab9; /* call postlude, line 213 */
+        {   int ret = r_postlude(z); /* call postlude, line 213 */
+            if (ret == 0) goto lab9;
             if (ret < 0) return ret;
         }
     lab9:
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_romanian.c b/src/backend/snowball/libstemmer/stem_UTF_8_romanian.c
index e82ebfe95f..0e1e5fcd08 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_romanian.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_romanian.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -516,51 +516,50 @@ static const struct among a_5[5] =
 
 static const unsigned char g_v[] = { 17, 65, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 32, 0, 0, 4 };
 
-static const symbol s_0[] = { 'u' };
-static const symbol s_1[] = { 'U' };
+static const symbol s_0[] = { 'U' };
+static const symbol s_1[] = { 'I' };
 static const symbol s_2[] = { 'i' };
-static const symbol s_3[] = { 'I' };
-static const symbol s_4[] = { 'i' };
-static const symbol s_5[] = { 'u' };
-static const symbol s_6[] = { 'a' };
-static const symbol s_7[] = { 'e' };
+static const symbol s_3[] = { 'u' };
+static const symbol s_4[] = { 'a' };
+static const symbol s_5[] = { 'e' };
+static const symbol s_6[] = { 'i' };
+static const symbol s_7[] = { 'a', 'b' };
 static const symbol s_8[] = { 'i' };
-static const symbol s_9[] = { 'a', 'b' };
-static const symbol s_10[] = { 'i' };
-static const symbol s_11[] = { 'a', 't' };
-static const symbol s_12[] = { 'a', 0xC5, 0xA3, 'i' };
-static const symbol s_13[] = { 'a', 'b', 'i', 'l' };
-static const symbol s_14[] = { 'i', 'b', 'i', 'l' };
-static const symbol s_15[] = { 'i', 'v' };
-static const symbol s_16[] = { 'i', 'c' };
-static const symbol s_17[] = { 'a', 't' };
-static const symbol s_18[] = { 'i', 't' };
-static const symbol s_19[] = { 0xC5, 0xA3 };
-static const symbol s_20[] = { 't' };
-static const symbol s_21[] = { 'i', 's', 't' };
-static const symbol s_22[] = { 'u' };
+static const symbol s_9[] = { 'a', 't' };
+static const symbol s_10[] = { 'a', 0xC5, 0xA3, 'i' };
+static const symbol s_11[] = { 'a', 'b', 'i', 'l' };
+static const symbol s_12[] = { 'i', 'b', 'i', 'l' };
+static const symbol s_13[] = { 'i', 'v' };
+static const symbol s_14[] = { 'i', 'c' };
+static const symbol s_15[] = { 'a', 't' };
+static const symbol s_16[] = { 'i', 't' };
+static const symbol s_17[] = { 0xC5, 0xA3 };
+static const symbol s_18[] = { 't' };
+static const symbol s_19[] = { 'i', 's', 't' };
 
-static int r_prelude(struct SN_env * z) {
+static int r_prelude(struct SN_env * z) { /* forwardmode */
     while(1) { /* repeat, line 32 */
         int c1 = z->c;
         while(1) { /* goto, line 32 */
             int c2 = z->c;
-            if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab1;
+            if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab1; /* grouping v, line 33 */
             z->bra = z->c; /* [, line 33 */
             {   int c3 = z->c; /* or, line 33 */
-                if (!(eq_s(z, 1, s_0))) goto lab3;
+                if (z->c == z->l || z->p[z->c] != 'u') goto lab3; /* literal, line 33 */
+                z->c++;
                 z->ket = z->c; /* ], line 33 */
-                if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab3;
-                {   int ret = slice_from_s(z, 1, s_1); /* <-, line 33 */
+                if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab3; /* grouping v, line 33 */
+                {   int ret = slice_from_s(z, 1, s_0); /* <-, line 33 */
                     if (ret < 0) return ret;
                 }
                 goto lab2;
             lab3:
                 z->c = c3;
-                if (!(eq_s(z, 1, s_2))) goto lab1;
+                if (z->c == z->l || z->p[z->c] != 'i') goto lab1; /* literal, line 34 */
+                z->c++;
                 z->ket = z->c; /* ], line 34 */
-                if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab1;
-                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 34 */
+                if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab1; /* grouping v, line 34 */
+                {   int ret = slice_from_s(z, 1, s_1); /* <-, line 34 */
                     if (ret < 0) return ret;
                 }
             }
@@ -582,15 +581,15 @@ static int r_prelude(struct SN_env * z) {
     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;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 40 */
+    z->I[1] = z->l; /* $p1 = <integer expression>, line 41 */
+    z->I[2] = z->l; /* $p2 = <integer expression>, line 42 */
     {   int c1 = z->c; /* do, line 44 */
         {   int c2 = z->c; /* or, line 46 */
-            if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab2;
+            if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab2; /* grouping v, line 45 */
             {   int c3 = z->c; /* or, line 45 */
-                if (out_grouping_U(z, g_v, 97, 259, 0)) goto lab4;
+                if (out_grouping_U(z, g_v, 97, 259, 0)) goto lab4; /* non v, line 45 */
                 {    /* gopast */ /* grouping v, line 45 */
                     int ret = out_grouping_U(z, g_v, 97, 259, 1);
                     if (ret < 0) goto lab4;
@@ -599,7 +598,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab3;
             lab4:
                 z->c = c3;
-                if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab2;
+                if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab2; /* grouping v, line 45 */
                 {    /* gopast */ /* non v, line 45 */
                     int ret = in_grouping_U(z, g_v, 97, 259, 1);
                     if (ret < 0) goto lab2;
@@ -610,9 +609,9 @@ static int r_mark_regions(struct SN_env * z) {
             goto lab1;
         lab2:
             z->c = c2;
-            if (out_grouping_U(z, g_v, 97, 259, 0)) goto lab0;
+            if (out_grouping_U(z, g_v, 97, 259, 0)) goto lab0; /* non v, line 47 */
             {   int c4 = z->c; /* or, line 47 */
-                if (out_grouping_U(z, g_v, 97, 259, 0)) goto lab6;
+                if (out_grouping_U(z, g_v, 97, 259, 0)) goto lab6; /* non v, line 47 */
                 {    /* gopast */ /* grouping v, line 47 */
                     int ret = out_grouping_U(z, g_v, 97, 259, 1);
                     if (ret < 0) goto lab6;
@@ -621,7 +620,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab5;
             lab6:
                 z->c = c4;
-                if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab0;
+                if (in_grouping_U(z, g_v, 97, 259, 0)) goto lab0; /* grouping v, line 47 */
                 {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
                     if (ret < 0) goto lab0;
                     z->c = ret; /* next, line 47 */
@@ -664,24 +663,23 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 56 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 58 */
-        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 85)) among_var = 3; else
-        among_var = find_among(z, a_0, 3); /* substring, line 58 */
+        if (z->c >= z->l || (z->p[z->c + 0] != 73 && z->p[z->c + 0] != 85)) among_var = 3; else /* substring, line 58 */
+        among_var = find_among(z, a_0, 3);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 58 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 58 */
             case 1:
-                {   int ret = slice_from_s(z, 1, s_4); /* <-, line 59 */
+                {   int ret = slice_from_s(z, 1, s_2); /* <-, line 59 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 1, s_5); /* <-, line 60 */
+                {   int ret = slice_from_s(z, 1, s_3); /* <-, line 60 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -700,72 +698,70 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_RV(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_RV(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 68 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 69 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[2] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[2] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 70 */
     return 1;
 }
 
-static int r_step_0(struct SN_env * z) {
+static int r_step_0(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 73 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((266786 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_1, 16); /* substring, line 73 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((266786 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 73 */
+    among_var = find_among_b(z, a_1, 16);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 73 */
-    {   int ret = r_R1(z);
-        if (ret == 0) return 0; /* call R1, line 73 */
-        if (ret < 0) return ret;
+    {   int ret = r_R1(z); /* call R1, line 73 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 73 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 75 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 1, s_6); /* <-, line 77 */
+            {   int ret = slice_from_s(z, 1, s_4); /* <-, line 77 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 1, s_7); /* <-, line 79 */
+            {   int ret = slice_from_s(z, 1, s_5); /* <-, line 79 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 1, s_8); /* <-, line 81 */
+            {   int ret = slice_from_s(z, 1, s_6); /* <-, line 81 */
                 if (ret < 0) return ret;
             }
             break;
         case 5:
             {   int m1 = z->l - z->c; (void)m1; /* not, line 83 */
-                if (!(eq_s_b(z, 2, s_9))) goto lab0;
+                if (!(eq_s_b(z, 2, s_7))) goto lab0; /* literal, line 83 */
                 return 0;
             lab0:
                 z->c = z->l - m1;
             }
-            {   int ret = slice_from_s(z, 1, s_10); /* <-, line 83 */
+            {   int ret = slice_from_s(z, 1, s_8); /* <-, line 83 */
                 if (ret < 0) return ret;
             }
             break;
         case 6:
-            {   int ret = slice_from_s(z, 2, s_11); /* <-, line 85 */
+            {   int ret = slice_from_s(z, 2, s_9); /* <-, line 85 */
                 if (ret < 0) return ret;
             }
             break;
         case 7:
-            {   int ret = slice_from_s(z, 4, s_12); /* <-, line 87 */
+            {   int ret = slice_from_s(z, 4, s_10); /* <-, line 87 */
                 if (ret < 0) return ret;
             }
             break;
@@ -773,63 +769,61 @@ static int r_step_0(struct SN_env * z) {
     return 1;
 }
 
-static int r_combo_suffix(struct SN_env * z) {
+static int r_combo_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int m_test = z->l - z->c; /* test, line 91 */
+    {   int m_test1 = z->l - z->c; /* test, line 91 */
         z->ket = z->c; /* [, line 92 */
         among_var = find_among_b(z, a_2, 46); /* substring, line 92 */
         if (!(among_var)) return 0;
         z->bra = z->c; /* ], line 92 */
-        {   int ret = r_R1(z);
-            if (ret == 0) return 0; /* call R1, line 92 */
-            if (ret < 0) return ret;
+        {   int ret = r_R1(z); /* call R1, line 92 */
+            if (ret <= 0) return ret;
         }
-        switch(among_var) {
-            case 0: return 0;
+        switch (among_var) { /* among, line 93 */
             case 1:
-                {   int ret = slice_from_s(z, 4, s_13); /* <-, line 101 */
+                {   int ret = slice_from_s(z, 4, s_11); /* <-, line 101 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_from_s(z, 4, s_14); /* <-, line 104 */
+                {   int ret = slice_from_s(z, 4, s_12); /* <-, line 104 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 3:
-                {   int ret = slice_from_s(z, 2, s_15); /* <-, line 107 */
+                {   int ret = slice_from_s(z, 2, s_13); /* <-, line 107 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 4:
-                {   int ret = slice_from_s(z, 2, s_16); /* <-, line 113 */
+                {   int ret = slice_from_s(z, 2, s_14); /* <-, line 113 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 5:
-                {   int ret = slice_from_s(z, 2, s_17); /* <-, line 118 */
+                {   int ret = slice_from_s(z, 2, s_15); /* <-, line 118 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 6:
-                {   int ret = slice_from_s(z, 2, s_18); /* <-, line 122 */
+                {   int ret = slice_from_s(z, 2, s_16); /* <-, line 122 */
                     if (ret < 0) return ret;
                 }
                 break;
         }
         z->B[0] = 1; /* set standard_suffix_removed, line 125 */
-        z->c = z->l - m_test;
+        z->c = z->l - m_test1;
     }
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->B[0] = 0; /* unset standard_suffix_removed, line 130 */
     while(1) { /* repeat, line 131 */
         int m1 = z->l - z->c; (void)m1;
-        {   int ret = r_combo_suffix(z);
-            if (ret == 0) goto lab0; /* call combo_suffix, line 131 */
+        {   int ret = r_combo_suffix(z); /* call combo_suffix, line 131 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
         continue;
@@ -841,26 +835,24 @@ static int r_standard_suffix(struct SN_env * z) {
     among_var = find_among_b(z, a_3, 62); /* substring, line 132 */
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 132 */
-    {   int ret = r_R2(z);
-        if (ret == 0) return 0; /* call R2, line 132 */
-        if (ret < 0) return ret;
+    {   int ret = r_R2(z); /* call R2, line 132 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 133 */
         case 1:
             {   int ret = slice_del(z); /* delete, line 149 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            if (!(eq_s_b(z, 2, s_19))) return 0;
+            if (!(eq_s_b(z, 2, s_17))) return 0; /* literal, line 152 */
             z->bra = z->c; /* ], line 152 */
-            {   int ret = slice_from_s(z, 1, s_20); /* <-, line 152 */
+            {   int ret = slice_from_s(z, 1, s_18); /* <-, line 152 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 3, s_21); /* <-, line 156 */
+            {   int ret = slice_from_s(z, 3, s_19); /* <-, line 156 */
                 if (ret < 0) return ret;
             }
             break;
@@ -869,27 +861,25 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_verb_suffix(struct SN_env * z) {
+static int r_verb_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 164 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 164 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 164 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 165 */
         among_var = find_among_b(z, a_4, 94); /* substring, line 165 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 165 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
+        switch (among_var) { /* among, line 165 */
             case 1:
                 {   int m2 = z->l - z->c; (void)m2; /* or, line 200 */
-                    if (out_grouping_b_U(z, g_v, 97, 259, 0)) goto lab1;
+                    if (out_grouping_b_U(z, g_v, 97, 259, 0)) goto lab1; /* non v, line 200 */
                     goto lab0;
                 lab1:
                     z->c = z->l - m2;
-                    if (!(eq_s_b(z, 1, s_22))) { z->lb = mlimit; return 0; }
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'u') { z->lb = mlimit1; return 0; } /* literal, line 200 */
+                    z->c--;
                 }
             lab0:
                 {   int ret = slice_del(z); /* delete, line 200 */
@@ -902,98 +892,88 @@ static int r_verb_suffix(struct SN_env * z) {
                 }
                 break;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_vowel_suffix(struct SN_env * z) {
-    int among_var;
+static int r_vowel_suffix(struct SN_env * z) { /* backwardmode */
     z->ket = z->c; /* [, line 219 */
-    among_var = find_among_b(z, a_5, 5); /* substring, line 219 */
-    if (!(among_var)) return 0;
+    if (!(find_among_b(z, a_5, 5))) return 0; /* substring, line 219 */
     z->bra = z->c; /* ], line 219 */
-    {   int ret = r_RV(z);
-        if (ret == 0) return 0; /* call RV, line 219 */
+    {   int ret = r_RV(z); /* call RV, line 219 */
+        if (ret <= 0) return ret;
+    }
+    {   int ret = slice_del(z); /* delete, line 220 */
         if (ret < 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 220 */
-                if (ret < 0) return ret;
-            }
-            break;
-    }
     return 1;
 }
 
-extern int romanian_UTF_8_stem(struct SN_env * z) {
+extern int romanian_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 226 */
-        {   int ret = r_prelude(z);
-            if (ret == 0) goto lab0; /* call prelude, line 226 */
+        {   int ret = r_prelude(z); /* call prelude, line 226 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = c1;
     }
-    {   int c2 = z->c; /* do, line 227 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab1; /* call mark_regions, line 227 */
-            if (ret < 0) return ret;
-        }
-    lab1:
-        z->c = c2;
+    /* do, line 227 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 227 */
+        if (ret == 0) goto lab1;
+        if (ret < 0) return ret;
     }
+lab1:
     z->lb = z->c; z->c = z->l; /* backwards, line 228 */
 
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 229 */
-        {   int ret = r_step_0(z);
-            if (ret == 0) goto lab2; /* call step_0, line 229 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 229 */
+        {   int ret = r_step_0(z); /* call step_0, line 229 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
-        z->c = z->l - m3;
+        z->c = z->l - m2;
     }
-    {   int m4 = z->l - z->c; (void)m4; /* do, line 230 */
-        {   int ret = r_standard_suffix(z);
-            if (ret == 0) goto lab3; /* call standard_suffix, line 230 */
+    {   int m3 = z->l - z->c; (void)m3; /* do, line 230 */
+        {   int ret = r_standard_suffix(z); /* call standard_suffix, line 230 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
-        z->c = z->l - m4;
+        z->c = z->l - m3;
     }
-    {   int m5 = z->l - z->c; (void)m5; /* do, line 231 */
-        {   int m6 = z->l - z->c; (void)m6; /* or, line 231 */
+    {   int m4 = z->l - z->c; (void)m4; /* do, line 231 */
+        {   int m5 = z->l - z->c; (void)m5; /* or, line 231 */
             if (!(z->B[0])) goto lab6; /* Boolean test standard_suffix_removed, line 231 */
             goto lab5;
         lab6:
-            z->c = z->l - m6;
-            {   int ret = r_verb_suffix(z);
-                if (ret == 0) goto lab4; /* call verb_suffix, line 231 */
+            z->c = z->l - m5;
+            {   int ret = r_verb_suffix(z); /* call verb_suffix, line 231 */
+                if (ret == 0) goto lab4;
                 if (ret < 0) return ret;
             }
         }
     lab5:
     lab4:
-        z->c = z->l - m5;
+        z->c = z->l - m4;
     }
-    {   int m7 = z->l - z->c; (void)m7; /* do, line 232 */
-        {   int ret = r_vowel_suffix(z);
-            if (ret == 0) goto lab7; /* call vowel_suffix, line 232 */
+    {   int m6 = z->l - z->c; (void)m6; /* do, line 232 */
+        {   int ret = r_vowel_suffix(z); /* call vowel_suffix, line 232 */
+            if (ret == 0) goto lab7;
             if (ret < 0) return ret;
         }
     lab7:
-        z->c = z->l - m7;
+        z->c = z->l - m6;
     }
     z->c = z->lb;
-    {   int c8 = z->c; /* do, line 234 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab8; /* call postlude, line 234 */
+    {   int c7 = z->c; /* do, line 234 */
+        {   int ret = r_postlude(z); /* call postlude, line 234 */
+            if (ret == 0) goto lab8;
             if (ret < 0) return ret;
         }
     lab8:
-        z->c = c8;
+        z->c = c7;
     }
     return 1;
 }
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_russian.c b/src/backend/snowball/libstemmer/stem_UTF_8_russian.c
index fcbcc6cf46..5e5fd20fa3 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_russian.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_russian.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -349,68 +349,69 @@ static const symbol s_5[] = { 0xD1, 0x8F };
 static const symbol s_6[] = { 0xD0, 0xBD };
 static const symbol s_7[] = { 0xD0, 0xBD };
 static const symbol s_8[] = { 0xD0, 0xBD };
-static const symbol s_9[] = { 0xD0, 0xB8 };
+static const symbol s_9[] = { 0xD1, 0x91 };
+static const symbol s_10[] = { 0xD0, 0xB5 };
+static const symbol s_11[] = { 0xD0, 0xB8 };
 
-static int r_mark_regions(struct SN_env * z) {
-    z->I[0] = z->l;
-    z->I[1] = z->l;
-    {   int c1 = z->c; /* do, line 61 */
-        {    /* gopast */ /* grouping v, line 62 */
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 61 */
+    z->I[1] = z->l; /* $p2 = <integer expression>, line 62 */
+    {   int c1 = z->c; /* do, line 63 */
+        {    /* gopast */ /* grouping v, line 64 */
             int ret = out_grouping_U(z, g_v, 1072, 1103, 1);
             if (ret < 0) goto lab0;
             z->c += ret;
         }
-        z->I[0] = z->c; /* setmark pV, line 62 */
-        {    /* gopast */ /* non v, line 62 */
+        z->I[0] = z->c; /* setmark pV, line 64 */
+        {    /* gopast */ /* non v, line 64 */
             int ret = in_grouping_U(z, g_v, 1072, 1103, 1);
             if (ret < 0) goto lab0;
             z->c += ret;
         }
-        {    /* gopast */ /* grouping v, line 63 */
+        {    /* gopast */ /* grouping v, line 65 */
             int ret = out_grouping_U(z, g_v, 1072, 1103, 1);
             if (ret < 0) goto lab0;
             z->c += ret;
         }
-        {    /* gopast */ /* non v, line 63 */
+        {    /* gopast */ /* non v, line 65 */
             int ret = in_grouping_U(z, g_v, 1072, 1103, 1);
             if (ret < 0) goto lab0;
             z->c += ret;
         }
-        z->I[1] = z->c; /* setmark p2, line 63 */
+        z->I[1] = z->c; /* setmark p2, line 65 */
     lab0:
         z->c = c1;
     }
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 71 */
     return 1;
 }
 
-static int r_perfective_gerund(struct SN_env * z) {
+static int r_perfective_gerund(struct SN_env * z) { /* backwardmode */
     int among_var;
-    z->ket = z->c; /* [, line 72 */
-    among_var = find_among_b(z, a_0, 9); /* substring, line 72 */
+    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 72 */
-    switch(among_var) {
-        case 0: return 0;
+    z->bra = z->c; /* ], line 74 */
+    switch (among_var) { /* among, line 74 */
         case 1:
-            {   int m1 = z->l - z->c; (void)m1; /* or, line 76 */
-                if (!(eq_s_b(z, 2, s_0))) goto lab1;
+            {   int m1 = z->l - z->c; (void)m1; /* or, line 78 */
+                if (!(eq_s_b(z, 2, s_0))) goto lab1; /* literal, line 78 */
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                if (!(eq_s_b(z, 2, s_1))) return 0;
+                if (!(eq_s_b(z, 2, s_1))) return 0; /* literal, line 78 */
             }
         lab0:
-            {   int ret = slice_del(z); /* delete, line 76 */
+            {   int ret = slice_del(z); /* delete, line 78 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_del(z); /* delete, line 83 */
+            {   int ret = slice_del(z); /* delete, line 85 */
                 if (ret < 0) return ret;
             }
             break;
@@ -418,51 +419,42 @@ static int r_perfective_gerund(struct SN_env * z) {
     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 = 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 */
+static int r_adjective(struct SN_env * z) { /* backwardmode */
+    z->ket = z->c; /* [, line 90 */
+    if (!(find_among_b(z, a_1, 26))) return 0; /* substring, line 90 */
+    z->bra = z->c; /* ], line 90 */
+    {   int ret = slice_del(z); /* delete, line 99 */
         if (ret < 0) return ret;
     }
-    {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* 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_keep; goto lab0; }
-        z->bra = z->c; /* ], line 110 */
-        switch(among_var) {
-            case 0: { z->c = z->l - m_keep; goto lab0; }
+    return 1;
+}
+
+static int r_adjectival(struct SN_env * z) { /* backwardmode */
+    int among_var;
+    {   int ret = r_adjective(z); /* call adjective, line 104 */
+        if (ret <= 0) return ret;
+    }
+    {   int m1 = z->l - z->c; (void)m1; /* 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 - m1; goto lab0; }
+        z->bra = z->c; /* ], line 112 */
+        switch (among_var) { /* among, line 112 */
             case 1:
-                {   int m1 = z->l - z->c; (void)m1; /* or, line 115 */
-                    if (!(eq_s_b(z, 2, s_2))) goto lab2;
+                {   int m2 = z->l - z->c; (void)m2; /* or, line 117 */
+                    if (!(eq_s_b(z, 2, s_2))) goto lab2; /* literal, line 117 */
                     goto lab1;
                 lab2:
-                    z->c = z->l - m1;
-                    if (!(eq_s_b(z, 2, s_3))) { z->c = z->l - m_keep; goto lab0; }
+                    z->c = z->l - m2;
+                    if (!(eq_s_b(z, 2, s_3))) { z->c = z->l - m1; goto lab0; } /* literal, line 117 */
                 }
             lab1:
-                {   int ret = slice_del(z); /* delete, line 115 */
+                {   int ret = slice_del(z); /* delete, line 117 */
                     if (ret < 0) return ret;
                 }
                 break;
             case 2:
-                {   int ret = slice_del(z); /* delete, line 122 */
+                {   int ret = slice_del(z); /* delete, line 124 */
                     if (ret < 0) return ret;
                 }
                 break;
@@ -473,47 +465,39 @@ static int r_adjectival(struct SN_env * z) {
     return 1;
 }
 
-static int r_reflexive(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 129 */
-    if (z->c - 3 <= z->lb || (z->p[z->c - 1] != 140 && z->p[z->c - 1] != 143)) return 0;
-    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 = slice_del(z); /* delete, line 132 */
-                if (ret < 0) return ret;
-            }
-            break;
+static int r_reflexive(struct SN_env * z) { /* backwardmode */
+    z->ket = z->c; /* [, line 131 */
+    if (z->c - 3 <= z->lb || (z->p[z->c - 1] != 140 && z->p[z->c - 1] != 143)) return 0; /* substring, line 131 */
+    if (!(find_among_b(z, a_3, 2))) return 0;
+    z->bra = z->c; /* ], line 131 */
+    {   int ret = slice_del(z); /* delete, line 134 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_verb(struct SN_env * z) {
+static int r_verb(struct SN_env * z) { /* backwardmode */
     int among_var;
-    z->ket = z->c; /* [, line 137 */
-    among_var = find_among_b(z, a_4, 46); /* substring, line 137 */
+    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 137 */
-    switch(among_var) {
-        case 0: return 0;
+    z->bra = z->c; /* ], line 139 */
+    switch (among_var) { /* among, line 139 */
         case 1:
-            {   int m1 = z->l - z->c; (void)m1; /* or, line 143 */
-                if (!(eq_s_b(z, 2, s_4))) goto lab1;
+            {   int m1 = z->l - z->c; (void)m1; /* or, line 145 */
+                if (!(eq_s_b(z, 2, s_4))) goto lab1; /* literal, line 145 */
                 goto lab0;
             lab1:
                 z->c = z->l - m1;
-                if (!(eq_s_b(z, 2, s_5))) return 0;
+                if (!(eq_s_b(z, 2, s_5))) return 0; /* literal, line 145 */
             }
         lab0:
-            {   int ret = slice_del(z); /* delete, line 143 */
+            {   int ret = slice_del(z); /* delete, line 145 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_del(z); /* delete, line 151 */
+            {   int ret = slice_del(z); /* delete, line 153 */
                 if (ret < 0) return ret;
             }
             break;
@@ -521,168 +505,175 @@ static int r_verb(struct SN_env * z) {
     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 = slice_del(z); /* delete, line 167 */
-                if (ret < 0) return ret;
-            }
-            break;
+static int r_noun(struct SN_env * z) { /* backwardmode */
+    z->ket = z->c; /* [, line 162 */
+    if (!(find_among_b(z, a_5, 36))) return 0; /* substring, line 162 */
+    z->bra = z->c; /* ], line 162 */
+    {   int ret = slice_del(z); /* delete, line 169 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_derivational(struct SN_env * z) {
-    int among_var;
-    z->ket = z->c; /* [, line 176 */
-    if (z->c - 5 <= z->lb || (z->p[z->c - 1] != 130 && z->p[z->c - 1] != 140)) return 0;
-    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;
+static int r_derivational(struct SN_env * z) { /* backwardmode */
+    z->ket = z->c; /* [, line 178 */
+    if (z->c - 5 <= z->lb || (z->p[z->c - 1] != 130 && z->p[z->c - 1] != 140)) return 0; /* substring, line 178 */
+    if (!(find_among_b(z, a_6, 2))) return 0;
+    z->bra = z->c; /* ], line 178 */
+    {   int ret = r_R2(z); /* call R2, line 178 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            {   int ret = slice_del(z); /* delete, line 179 */
-                if (ret < 0) return ret;
-            }
-            break;
+    {   int ret = slice_del(z); /* delete, line 181 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_tidy_up(struct SN_env * z) {
+static int r_tidy_up(struct SN_env * z) { /* backwardmode */
     int among_var;
-    z->ket = z->c; /* [, line 184 */
-    among_var = find_among_b(z, a_7, 4); /* substring, line 184 */
+    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 184 */
-    switch(among_var) {
-        case 0: return 0;
+    z->bra = z->c; /* ], line 186 */
+    switch (among_var) { /* among, line 186 */
         case 1:
-            {   int ret = slice_del(z); /* delete, line 188 */
+            {   int ret = slice_del(z); /* delete, line 190 */
                 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 = slice_del(z); /* delete, line 189 */
+            z->ket = z->c; /* [, line 191 */
+            if (!(eq_s_b(z, 2, s_6))) return 0; /* literal, line 191 */
+            z->bra = z->c; /* ], line 191 */
+            if (!(eq_s_b(z, 2, s_7))) return 0; /* literal, line 191 */
+            {   int ret = slice_del(z); /* delete, line 191 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            if (!(eq_s_b(z, 2, s_8))) return 0;
-            {   int ret = slice_del(z); /* delete, line 192 */
-                if (ret < 0) return ret;
-            }
-            break;
-        case 3:
+            if (!(eq_s_b(z, 2, s_8))) return 0; /* literal, line 194 */
             {   int ret = slice_del(z); /* delete, line 194 */
                 if (ret < 0) return ret;
             }
             break;
+        case 3:
+            {   int ret = slice_del(z); /* delete, line 196 */
+                if (ret < 0) return ret;
+            }
+            break;
     }
     return 1;
 }
 
-extern int russian_UTF_8_stem(struct SN_env * z) {
-    {   int c1 = 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;
+extern int russian_UTF_8_stem(struct SN_env * z) { /* forwardmode */
+    {   int c1 = z->c; /* do, line 205 */
+        while(1) { /* repeat, line 205 */
+            int c2 = z->c;
+            while(1) { /* goto, line 205 */
+                int c3 = z->c;
+                z->bra = z->c; /* [, line 205 */
+                if (!(eq_s(z, 2, s_9))) goto lab2; /* literal, line 205 */
+                z->ket = z->c; /* ], line 205 */
+                z->c = c3;
+                break;
+            lab2:
+                z->c = c3;
+                {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
+                    if (ret < 0) goto lab1;
+                    z->c = ret; /* goto, line 205 */
+                }
+            }
+            {   int ret = slice_from_s(z, 2, s_10); /* <-, line 205 */
+                if (ret < 0) return ret;
+            }
+            continue;
+        lab1:
+            z->c = c2;
+            break;
         }
-    lab0:
         z->c = c1;
     }
-    z->lb = z->c; z->c = z->l; /* backwards, line 202 */
+    /* do, line 207 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 207 */
+        if (ret == 0) goto lab3;
+        if (ret < 0) return ret;
+    }
+lab3:
+    z->lb = z->c; z->c = z->l; /* backwards, line 208 */
 
-    {   int mlimit; /* setlimit, line 202 */
-        int m2 = z->l - z->c; (void)m2;
+
+    {   int mlimit4; /* setlimit, line 208 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 202 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m2;
-        {   int m3 = z->l - z->c; (void)m3; /* do, line 203 */
-            {   int m4 = z->l - z->c; (void)m4; /* or, line 204 */
-                {   int ret = r_perfective_gerund(z);
-                    if (ret == 0) goto lab3; /* call perfective_gerund, line 204 */
+        mlimit4 = z->lb; z->lb = z->I[0];
+        {   int m5 = z->l - z->c; (void)m5; /* do, line 209 */
+            {   int m6 = z->l - z->c; (void)m6; /* or, line 210 */
+                {   int ret = r_perfective_gerund(z); /* call perfective_gerund, line 210 */
+                    if (ret == 0) goto lab6;
                     if (ret < 0) return ret;
                 }
-                goto lab2;
-            lab3:
-                z->c = z->l - m4;
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 205 */
-                    {   int ret = r_reflexive(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab4; } /* call reflexive, line 205 */
+                goto lab5;
+            lab6:
+                z->c = z->l - m6;
+                {   int m7 = z->l - z->c; (void)m7; /* try, line 211 */
+                    {   int ret = r_reflexive(z); /* call reflexive, line 211 */
+                        if (ret == 0) { z->c = z->l - m7; goto lab7; }
                         if (ret < 0) return ret;
                     }
-                lab4:
-                    ;
-                }
-                {   int m5 = z->l - z->c; (void)m5; /* 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 - m5;
-                    {   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 - m5;
-                    {   int ret = r_noun(z);
-                        if (ret == 0) goto lab1; /* call noun, line 206 */
+                    ;
+                }
+                {   int m8 = z->l - z->c; (void)m8; /* or, line 212 */
+                    {   int ret = r_adjectival(z); /* call adjectival, line 212 */
+                        if (ret == 0) goto lab9;
+                        if (ret < 0) return ret;
+                    }
+                    goto lab8;
+                lab9:
+                    z->c = z->l - m8;
+                    {   int ret = r_verb(z); /* call verb, line 212 */
+                        if (ret == 0) goto lab10;
+                        if (ret < 0) return ret;
+                    }
+                    goto lab8;
+                lab10:
+                    z->c = z->l - m8;
+                    {   int ret = r_noun(z); /* call noun, line 212 */
+                        if (ret == 0) goto lab4;
                         if (ret < 0) return ret;
                     }
                 }
-            lab5:
+            lab8:
                 ;
             }
-        lab2:
-        lab1:
-            z->c = z->l - m3;
+        lab5:
+        lab4:
+            z->c = z->l - m5;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 209 */
-            z->ket = z->c; /* [, line 209 */
-            if (!(eq_s_b(z, 2, s_9))) { z->c = z->l - m_keep; goto lab8; }
-            z->bra = z->c; /* ], line 209 */
-            {   int ret = slice_del(z); /* delete, line 209 */
+        {   int m9 = z->l - z->c; (void)m9; /* try, line 215 */
+            z->ket = z->c; /* [, line 215 */
+            if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m9; goto lab11; } /* literal, line 215 */
+            z->bra = z->c; /* ], line 215 */
+            {   int ret = slice_del(z); /* delete, line 215 */
                 if (ret < 0) return ret;
             }
-        lab8:
+        lab11:
             ;
         }
-        {   int m6 = z->l - z->c; (void)m6; /* do, line 212 */
-            {   int ret = r_derivational(z);
-                if (ret == 0) goto lab9; /* call derivational, line 212 */
+        {   int m10 = z->l - z->c; (void)m10; /* do, line 218 */
+            {   int ret = r_derivational(z); /* call derivational, line 218 */
+                if (ret == 0) goto lab12;
                 if (ret < 0) return ret;
             }
-        lab9:
-            z->c = z->l - m6;
+        lab12:
+            z->c = z->l - m10;
         }
-        {   int m7 = z->l - z->c; (void)m7; /* do, line 213 */
-            {   int ret = r_tidy_up(z);
-                if (ret == 0) goto lab10; /* call tidy_up, line 213 */
+        {   int m11 = z->l - z->c; (void)m11; /* do, line 219 */
+            {   int ret = r_tidy_up(z); /* call tidy_up, line 219 */
+                if (ret == 0) goto lab13;
                 if (ret < 0) return ret;
             }
-        lab10:
-            z->c = z->l - m7;
+        lab13:
+            z->c = z->l - m11;
         }
-        z->lb = mlimit;
+        z->lb = mlimit4;
     }
     z->c = z->lb;
     return 1;
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_spanish.c b/src/backend/snowball/libstemmer/stem_UTF_8_spanish.c
index 5ac83fdc1d..a3755d4d84 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_spanish.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_spanish.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -497,28 +497,22 @@ static const symbol s_6[] = { 'a', 'n', 'd', 'o' };
 static const symbol s_7[] = { 'a', 'r' };
 static const symbol s_8[] = { 'e', 'r' };
 static const symbol s_9[] = { 'i', 'r' };
-static const symbol s_10[] = { 'u' };
-static const symbol s_11[] = { 'i', 'c' };
-static const symbol s_12[] = { 'l', 'o', 'g' };
-static const symbol s_13[] = { 'u' };
-static const symbol s_14[] = { 'e', 'n', 't', 'e' };
+static const symbol s_10[] = { 'i', 'c' };
+static const symbol s_11[] = { 'l', 'o', 'g' };
+static const symbol s_12[] = { 'u' };
+static const symbol s_13[] = { 'e', 'n', 't', 'e' };
+static const symbol s_14[] = { 'a', 't' };
 static const symbol s_15[] = { 'a', 't' };
-static const symbol s_16[] = { 'a', 't' };
-static const symbol s_17[] = { 'u' };
-static const symbol s_18[] = { 'u' };
-static const symbol s_19[] = { 'g' };
-static const symbol s_20[] = { 'u' };
-static const 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;
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $pV = <integer expression>, line 33 */
+    z->I[1] = z->l; /* $p1 = <integer expression>, line 34 */
+    z->I[2] = z->l; /* $p2 = <integer expression>, line 35 */
     {   int c1 = z->c; /* do, line 37 */
         {   int c2 = z->c; /* or, line 39 */
-            if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab2;
+            if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab2; /* grouping v, line 38 */
             {   int c3 = z->c; /* or, line 38 */
-                if (out_grouping_U(z, g_v, 97, 252, 0)) goto lab4;
+                if (out_grouping_U(z, g_v, 97, 252, 0)) goto lab4; /* non v, line 38 */
                 {    /* gopast */ /* grouping v, line 38 */
                     int ret = out_grouping_U(z, g_v, 97, 252, 1);
                     if (ret < 0) goto lab4;
@@ -527,7 +521,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab3;
             lab4:
                 z->c = c3;
-                if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab2;
+                if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab2; /* grouping v, line 38 */
                 {    /* gopast */ /* non v, line 38 */
                     int ret = in_grouping_U(z, g_v, 97, 252, 1);
                     if (ret < 0) goto lab2;
@@ -538,9 +532,9 @@ static int r_mark_regions(struct SN_env * z) {
             goto lab1;
         lab2:
             z->c = c2;
-            if (out_grouping_U(z, g_v, 97, 252, 0)) goto lab0;
+            if (out_grouping_U(z, g_v, 97, 252, 0)) goto lab0; /* non v, line 40 */
             {   int c4 = z->c; /* or, line 40 */
-                if (out_grouping_U(z, g_v, 97, 252, 0)) goto lab6;
+                if (out_grouping_U(z, g_v, 97, 252, 0)) goto lab6; /* non v, line 40 */
                 {    /* gopast */ /* grouping v, line 40 */
                     int ret = out_grouping_U(z, g_v, 97, 252, 1);
                     if (ret < 0) goto lab6;
@@ -549,7 +543,7 @@ static int r_mark_regions(struct SN_env * z) {
                 goto lab5;
             lab6:
                 z->c = c4;
-                if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab0;
+                if (in_grouping_U(z, g_v, 97, 252, 0)) goto lab0; /* grouping v, line 40 */
                 {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
                     if (ret < 0) goto lab0;
                     z->c = ret; /* next, line 40 */
@@ -592,17 +586,16 @@ static int r_mark_regions(struct SN_env * z) {
     return 1;
 }
 
-static int r_postlude(struct SN_env * z) {
+static int r_postlude(struct SN_env * z) { /* forwardmode */
     int among_var;
     while(1) { /* repeat, line 49 */
         int c1 = z->c;
         z->bra = z->c; /* [, line 50 */
-        if (z->c + 1 >= z->l || z->p[z->c + 1] >> 5 != 5 || !((67641858 >> (z->p[z->c + 1] & 0x1f)) & 1)) among_var = 6; else
-        among_var = find_among(z, a_0, 6); /* substring, line 50 */
+        if (z->c + 1 >= z->l || z->p[z->c + 1] >> 5 != 5 || !((67641858 >> (z->p[z->c + 1] & 0x1f)) & 1)) among_var = 6; else /* substring, line 50 */
+        among_var = find_among(z, a_0, 6);
         if (!(among_var)) goto lab0;
         z->ket = z->c; /* ], line 50 */
-        switch(among_var) {
-            case 0: goto lab0;
+        switch (among_var) { /* among, line 50 */
             case 1:
                 {   int ret = slice_from_s(z, 1, s_0); /* <-, line 51 */
                     if (ret < 0) return ret;
@@ -643,36 +636,34 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-static int r_RV(struct SN_env * z) {
-    if (!(z->I[0] <= z->c)) return 0;
+static int r_RV(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[0] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 63 */
     return 1;
 }
 
-static int r_R1(struct SN_env * z) {
-    if (!(z->I[1] <= z->c)) return 0;
+static int r_R1(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[1] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 64 */
     return 1;
 }
 
-static int r_R2(struct SN_env * z) {
-    if (!(z->I[2] <= z->c)) return 0;
+static int r_R2(struct SN_env * z) { /* backwardmode */
+    if (!(z->I[2] <= z->c)) return 0; /* $(<integer expression> <= <integer expression>), line 65 */
     return 1;
 }
 
-static int r_attached_pronoun(struct SN_env * z) {
+static int r_attached_pronoun(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 68 */
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((557090 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    if (!(find_among_b(z, a_1, 13))) return 0; /* substring, line 68 */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((557090 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 68 */
+    if (!(find_among_b(z, a_1, 13))) return 0;
     z->bra = z->c; /* ], line 68 */
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 111 && z->p[z->c - 1] != 114)) return 0;
-    among_var = find_among_b(z, a_2, 11); /* substring, line 72 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 111 && z->p[z->c - 1] != 114)) return 0; /* substring, line 72 */
+    among_var = find_among_b(z, a_2, 11);
     if (!(among_var)) return 0;
-    {   int ret = r_RV(z);
-        if (ret == 0) return 0; /* call RV, line 72 */
-        if (ret < 0) return ret;
+    {   int ret = r_RV(z); /* call RV, line 72 */
+        if (ret <= 0) return ret;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 72 */
         case 1:
             z->bra = z->c; /* ], line 73 */
             {   int ret = slice_from_s(z, 5, s_5); /* <-, line 73 */
@@ -709,7 +700,8 @@ static int r_attached_pronoun(struct SN_env * z) {
             }
             break;
         case 7:
-            if (!(eq_s_b(z, 1, s_10))) return 0;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'u') return 0; /* literal, line 82 */
+            z->c--;
             {   int ret = slice_del(z); /* delete, line 82 */
                 if (ret < 0) return ret;
             }
@@ -718,38 +710,35 @@ static int r_attached_pronoun(struct SN_env * z) {
     return 1;
 }
 
-static int r_standard_suffix(struct SN_env * z) {
+static int r_standard_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
     z->ket = z->c; /* [, line 87 */
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((835634 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    among_var = find_among_b(z, a_6, 46); /* substring, line 87 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((835634 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* substring, line 87 */
+    among_var = find_among_b(z, a_6, 46);
     if (!(among_var)) return 0;
     z->bra = z->c; /* ], line 87 */
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 87 */
         case 1:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 99 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 99 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_R2(z); /* call R2, line 105 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 105 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 106 */
+            {   int m1 = z->l - z->c; (void)m1; /* try, line 106 */
                 z->ket = z->c; /* [, line 106 */
-                if (!(eq_s_b(z, 2, s_11))) { z->c = z->l - m_keep; goto lab0; }
+                if (!(eq_s_b(z, 2, s_10))) { z->c = z->l - m1; goto lab0; } /* literal, line 106 */
                 z->bra = z->c; /* ], line 106 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call R2, line 106 */
+                {   int ret = r_R2(z); /* call R2, line 106 */
+                    if (ret == 0) { z->c = z->l - m1; goto lab0; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 106 */
@@ -760,61 +749,56 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 3:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 111 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 111 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 3, s_12); /* <-, line 111 */
+            {   int ret = slice_from_s(z, 3, s_11); /* <-, 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 = r_R2(z); /* call R2, line 115 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 1, s_13); /* <-, line 115 */
+            {   int ret = slice_from_s(z, 1, s_12); /* <-, 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 = r_R2(z); /* call R2, line 119 */
+                if (ret <= 0) return ret;
             }
-            {   int ret = slice_from_s(z, 4, s_14); /* <-, line 119 */
+            {   int ret = slice_from_s(z, 4, s_13); /* <-, 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 = r_R1(z); /* call R1, line 123 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 123 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 124 */
+            {   int m2 = z->l - z->c; (void)m2; /* try, line 124 */
                 z->ket = z->c; /* [, line 125 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718616 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab1; }
-                among_var = find_among_b(z, a_3, 4); /* substring, line 125 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab1; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4718616 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m2; goto lab1; } /* substring, line 125 */
+                among_var = find_among_b(z, a_3, 4);
+                if (!(among_var)) { z->c = z->l - m2; goto lab1; }
                 z->bra = z->c; /* ], line 125 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call R2, line 125 */
+                {   int ret = r_R2(z); /* call R2, line 125 */
+                    if (ret == 0) { z->c = z->l - m2; goto lab1; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 125 */
                     if (ret < 0) return ret;
                 }
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab1; }
+                switch (among_var) { /* among, line 125 */
                     case 1:
                         z->ket = z->c; /* [, line 126 */
-                        if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m_keep; goto lab1; }
+                        if (!(eq_s_b(z, 2, s_14))) { z->c = z->l - m2; goto lab1; } /* literal, line 126 */
                         z->bra = z->c; /* ], line 126 */
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab1; } /* call R2, line 126 */
+                        {   int ret = r_R2(z); /* call R2, line 126 */
+                            if (ret == 0) { z->c = z->l - m2; goto lab1; }
                             if (ret < 0) return ret;
                         }
                         {   int ret = slice_del(z); /* delete, line 126 */
@@ -827,79 +811,64 @@ static int r_standard_suffix(struct SN_env * z) {
             }
             break;
         case 7:
-            {   int ret = r_R2(z);
-                if (ret == 0) return 0; /* call R2, line 135 */
-                if (ret < 0) return ret;
+            {   int ret = r_R2(z); /* call R2, line 135 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 135 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 136 */
+            {   int m3 = z->l - z->c; (void)m3; /* try, line 136 */
                 z->ket = z->c; /* [, line 137 */
-                if (z->c - 3 <= z->lb || z->p[z->c - 1] != 101) { z->c = z->l - m_keep; goto lab2; }
-                among_var = find_among_b(z, a_4, 3); /* substring, line 137 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab2; }
+                if (z->c - 3 <= z->lb || z->p[z->c - 1] != 101) { z->c = z->l - m3; goto lab2; } /* substring, line 137 */
+                if (!(find_among_b(z, a_4, 3))) { z->c = z->l - m3; goto lab2; }
                 z->bra = z->c; /* ], line 137 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab2; }
-                    case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab2; } /* call R2, line 140 */
-                            if (ret < 0) return ret;
-                        }
-                        {   int ret = slice_del(z); /* delete, line 140 */
-                            if (ret < 0) return ret;
-                        }
-                        break;
+                {   int ret = r_R2(z); /* call R2, line 140 */
+                    if (ret == 0) { z->c = z->l - m3; goto lab2; }
+                    if (ret < 0) return ret;
+                }
+                {   int ret = slice_del(z); /* delete, line 140 */
+                    if (ret < 0) return ret;
                 }
             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 = r_R2(z); /* call R2, line 147 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 147 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 148 */
+            {   int m4 = z->l - z->c; (void)m4; /* try, line 148 */
                 z->ket = z->c; /* [, line 149 */
-                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m_keep; goto lab3; }
-                among_var = find_among_b(z, a_5, 3); /* substring, line 149 */
-                if (!(among_var)) { z->c = z->l - m_keep; goto lab3; }
+                if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((4198408 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->c = z->l - m4; goto lab3; } /* substring, line 149 */
+                if (!(find_among_b(z, a_5, 3))) { z->c = z->l - m4; goto lab3; }
                 z->bra = z->c; /* ], line 149 */
-                switch(among_var) {
-                    case 0: { z->c = z->l - m_keep; goto lab3; }
-                    case 1:
-                        {   int ret = r_R2(z);
-                            if (ret == 0) { z->c = z->l - m_keep; goto lab3; } /* call R2, line 152 */
-                            if (ret < 0) return ret;
-                        }
-                        {   int ret = slice_del(z); /* delete, line 152 */
-                            if (ret < 0) return ret;
-                        }
-                        break;
+                {   int ret = r_R2(z); /* call R2, line 152 */
+                    if (ret == 0) { z->c = z->l - m4; goto lab3; }
+                    if (ret < 0) return ret;
+                }
+                {   int ret = slice_del(z); /* delete, line 152 */
+                    if (ret < 0) return ret;
                 }
             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 = r_R2(z); /* call R2, line 159 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 159 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 160 */
+            {   int m5 = z->l - z->c; (void)m5; /* try, line 160 */
                 z->ket = z->c; /* [, line 161 */
-                if (!(eq_s_b(z, 2, s_16))) { z->c = z->l - m_keep; goto lab4; }
+                if (!(eq_s_b(z, 2, s_15))) { z->c = z->l - m5; goto lab4; } /* literal, line 161 */
                 z->bra = z->c; /* ], line 161 */
-                {   int ret = r_R2(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab4; } /* call R2, line 161 */
+                {   int ret = r_R2(z); /* call R2, line 161 */
+                    if (ret == 0) { z->c = z->l - m5; goto lab4; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 161 */
@@ -913,54 +882,45 @@ static int r_standard_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_y_verb_suffix(struct SN_env * z) {
-    int among_var;
-    {   int mlimit; /* setlimit, line 168 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_y_verb_suffix(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 168 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 168 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 168 */
-        among_var = find_among_b(z, a_7, 12); /* substring, line 168 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(find_among_b(z, a_7, 12))) { z->lb = mlimit1; return 0; } /* substring, line 168 */
         z->bra = z->c; /* ], line 168 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
-        case 1:
-            if (!(eq_s_b(z, 1, s_17))) return 0;
-            {   int ret = slice_del(z); /* delete, line 171 */
-                if (ret < 0) return ret;
-            }
-            break;
+    if (z->c <= z->lb || z->p[z->c - 1] != 'u') return 0; /* literal, line 171 */
+    z->c--;
+    {   int ret = slice_del(z); /* delete, line 171 */
+        if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_verb_suffix(struct SN_env * z) {
+static int r_verb_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 176 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 176 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 176 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 176 */
         among_var = find_among_b(z, a_8, 96); /* substring, line 176 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 176 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 176 */
         case 1:
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 179 */
-                if (!(eq_s_b(z, 1, s_18))) { z->c = z->l - m_keep; 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_keep; goto lab0; }
-                    z->c = z->l - m_test;
+            {   int m2 = z->l - z->c; (void)m2; /* try, line 179 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'u') { z->c = z->l - m2; goto lab0; } /* literal, line 179 */
+                z->c--;
+                {   int m_test3 = z->l - z->c; /* test, line 179 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'g') { z->c = z->l - m2; goto lab0; } /* literal, line 179 */
+                    z->c--;
+                    z->c = z->l - m_test3;
                 }
             lab0:
                 ;
@@ -979,41 +939,40 @@ static int r_verb_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_residual_suffix(struct SN_env * z) {
+static int r_residual_suffix(struct SN_env * z) { /* backwardmode */
     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;
+    switch (among_var) { /* among, line 205 */
         case 1:
-            {   int ret = r_RV(z);
-                if (ret == 0) return 0; /* call RV, line 208 */
-                if (ret < 0) return ret;
+            {   int ret = r_RV(z); /* call RV, line 208 */
+                if (ret <= 0) return ret;
             }
             {   int 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 = r_RV(z); /* call RV, line 210 */
+                if (ret <= 0) return ret;
             }
             {   int ret = slice_del(z); /* delete, line 210 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 210 */
+            {   int m1 = z->l - z->c; (void)m1; /* try, line 210 */
                 z->ket = z->c; /* [, line 210 */
-                if (!(eq_s_b(z, 1, s_20))) { z->c = z->l - m_keep; goto lab0; }
+                if (z->c <= z->lb || z->p[z->c - 1] != 'u') { z->c = z->l - m1; goto lab0; } /* literal, line 210 */
+                z->c--;
                 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_keep; goto lab0; }
-                    z->c = z->l - m_test;
+                {   int m_test2 = z->l - z->c; /* test, line 210 */
+                    if (z->c <= z->lb || z->p[z->c - 1] != 'g') { z->c = z->l - m1; goto lab0; } /* literal, line 210 */
+                    z->c--;
+                    z->c = z->l - m_test2;
                 }
-                {   int ret = r_RV(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab0; } /* call RV, line 210 */
+                {   int ret = r_RV(z); /* call RV, line 210 */
+                    if (ret == 0) { z->c = z->l - m1; goto lab0; }
                     if (ret < 0) return ret;
                 }
                 {   int ret = slice_del(z); /* delete, line 210 */
@@ -1027,66 +986,64 @@ static int r_residual_suffix(struct SN_env * z) {
     return 1;
 }
 
-extern int spanish_UTF_8_stem(struct SN_env * z) {
-    {   int c1 = 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 = c1;
+extern int spanish_UTF_8_stem(struct SN_env * z) { /* forwardmode */
+    /* do, line 216 */
+    {   int ret = r_mark_regions(z); /* call mark_regions, line 216 */
+        if (ret == 0) goto lab0;
+        if (ret < 0) return ret;
     }
+lab0:
     z->lb = z->c; z->c = z->l; /* backwards, line 217 */
 
-    {   int m2 = z->l - z->c; (void)m2; /* do, line 218 */
-        {   int ret = r_attached_pronoun(z);
-            if (ret == 0) goto lab1; /* call attached_pronoun, line 218 */
+    {   int m1 = z->l - z->c; (void)m1; /* do, line 218 */
+        {   int ret = r_attached_pronoun(z); /* call attached_pronoun, line 218 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
-        z->c = z->l - m2;
+        z->c = z->l - m1;
     }
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 219 */
-        {   int m4 = z->l - z->c; (void)m4; /* or, line 219 */
-            {   int ret = r_standard_suffix(z);
-                if (ret == 0) goto lab4; /* call standard_suffix, line 219 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 219 */
+        {   int m3 = z->l - z->c; (void)m3; /* or, line 219 */
+            {   int ret = r_standard_suffix(z); /* call standard_suffix, line 219 */
+                if (ret == 0) goto lab4;
                 if (ret < 0) return ret;
             }
             goto lab3;
         lab4:
-            z->c = z->l - m4;
-            {   int ret = r_y_verb_suffix(z);
-                if (ret == 0) goto lab5; /* call y_verb_suffix, line 220 */
+            z->c = z->l - m3;
+            {   int ret = r_y_verb_suffix(z); /* call y_verb_suffix, line 220 */
+                if (ret == 0) goto lab5;
                 if (ret < 0) return ret;
             }
             goto lab3;
         lab5:
-            z->c = z->l - m4;
-            {   int ret = r_verb_suffix(z);
-                if (ret == 0) goto lab2; /* call verb_suffix, line 221 */
+            z->c = z->l - m3;
+            {   int ret = r_verb_suffix(z); /* call verb_suffix, line 221 */
+                if (ret == 0) goto lab2;
                 if (ret < 0) return ret;
             }
         }
     lab3:
     lab2:
-        z->c = z->l - m3;
+        z->c = z->l - m2;
     }
-    {   int m5 = z->l - z->c; (void)m5; /* do, line 223 */
-        {   int ret = r_residual_suffix(z);
-            if (ret == 0) goto lab6; /* call residual_suffix, line 223 */
+    {   int m4 = z->l - z->c; (void)m4; /* do, line 223 */
+        {   int ret = r_residual_suffix(z); /* call residual_suffix, line 223 */
+            if (ret == 0) goto lab6;
             if (ret < 0) return ret;
         }
     lab6:
-        z->c = z->l - m5;
+        z->c = z->l - m4;
     }
     z->c = z->lb;
-    {   int c6 = z->c; /* do, line 225 */
-        {   int ret = r_postlude(z);
-            if (ret == 0) goto lab7; /* call postlude, line 225 */
+    {   int c5 = z->c; /* do, line 225 */
+        {   int ret = r_postlude(z); /* call postlude, line 225 */
+            if (ret == 0) goto lab7;
             if (ret < 0) return ret;
         }
     lab7:
-        z->c = c6;
+        z->c = c5;
     }
     return 1;
 }
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_swedish.c b/src/backend/snowball/libstemmer/stem_UTF_8_swedish.c
index 1372cec1ee..c47777d7c5 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_swedish.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_swedish.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -146,15 +146,15 @@ static const unsigned char g_s_ending[] = { 119, 127, 149 };
 static const symbol s_0[] = { 'l', 0xC3, 0xB6, 's' };
 static const 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 ret = skip_utf8(z->p, z->c, 0, z->l, + 3);
+static int r_mark_regions(struct SN_env * z) { /* forwardmode */
+    z->I[0] = z->l; /* $p1 = <integer expression>, line 28 */
+    {   int c_test1 = z->c; /* test, line 29 */
+        {   int ret = skip_utf8(z->p, z->c, 0, z->l, + 3); /* hop, line 29 */
             if (ret < 0) return 0;
-            z->c = ret; /* hop, line 29 */
+            z->c = ret;
         }
         z->I[1] = z->c; /* setmark x, line 29 */
-        z->c = c_test;
+        z->c = c_test1;
     }
     if (out_grouping_U(z, g_v, 97, 246, 1) < 0) return 0; /* goto */ /* grouping v, line 30 */
     {    /* gopast */ /* non v, line 30 */
@@ -163,37 +163,34 @@ static int r_mark_regions(struct SN_env * z) {
         z->c += ret;
     }
     z->I[0] = z->c; /* setmark p1, line 30 */
-     /* try, line 31 */
-    if (!(z->I[0] < z->I[1])) goto lab0;
-    z->I[0] = z->I[1];
+    /* try, line 31 */
+    if (!(z->I[0] < z->I[1])) goto lab0; /* $(<integer expression> < <integer expression>), line 31 */
+    z->I[0] = z->I[1]; /* $p1 = <integer expression>, line 31 */
 lab0:
     return 1;
 }
 
-static int r_main_suffix(struct SN_env * z) {
+static int r_main_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 37 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 37 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 37 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 37 */
-        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851442 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_0, 37); /* substring, line 37 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1851442 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 37 */
+        among_var = find_among_b(z, a_0, 37);
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 37 */
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
-    switch(among_var) {
-        case 0: return 0;
+    switch (among_var) { /* among, line 38 */
         case 1:
             {   int 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, 0)) return 0;
+            if (in_grouping_b_U(z, g_s_ending, 98, 121, 0)) return 0; /* grouping s_ending, line 46 */
             {   int ret = slice_del(z); /* delete, line 46 */
                 if (ret < 0) return ret;
             }
@@ -202,20 +199,18 @@ static int r_main_suffix(struct SN_env * z) {
     return 1;
 }
 
-static int r_consonant_pair(struct SN_env * z) {
-    {   int mlimit; /* setlimit, line 50 */
-        int m1 = z->l - z->c; (void)m1;
+static int r_consonant_pair(struct SN_env * z) { /* backwardmode */
+
+    {   int mlimit1; /* setlimit, line 50 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 50 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         {   int m2 = z->l - z->c; (void)m2; /* and, line 52 */
-            if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1064976 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-            if (!(find_among_b(z, a_1, 7))) { z->lb = mlimit; return 0; } /* among, line 51 */
+            if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1064976 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* among, line 51 */
+            if (!(find_among_b(z, a_1, 7))) { z->lb = mlimit1; return 0; }
             z->c = z->l - m2;
             z->ket = z->c; /* [, line 52 */
             {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
-                if (ret < 0) { z->lb = mlimit; return 0; }
+                if (ret < 0) { z->lb = mlimit1; return 0; }
                 z->c = ret; /* next, line 52 */
             }
             z->bra = z->c; /* ], line 52 */
@@ -223,26 +218,23 @@ static int r_consonant_pair(struct SN_env * z) {
                 if (ret < 0) return ret;
             }
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-static int r_other_suffix(struct SN_env * z) {
+static int r_other_suffix(struct SN_env * z) { /* backwardmode */
     int among_var;
-    {   int mlimit; /* setlimit, line 55 */
-        int m1 = z->l - z->c; (void)m1;
+
+    {   int mlimit1; /* setlimit, line 55 */
         if (z->c < z->I[0]) return 0;
-        z->c = z->I[0]; /* tomark, line 55 */
-        mlimit = z->lb; z->lb = z->c;
-        z->c = z->l - m1;
+        mlimit1 = z->lb; z->lb = z->I[0];
         z->ket = z->c; /* [, line 56 */
-        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1572992 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit; return 0; }
-        among_var = find_among_b(z, a_2, 5); /* substring, line 56 */
-        if (!(among_var)) { z->lb = mlimit; return 0; }
+        if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((1572992 >> (z->p[z->c - 1] & 0x1f)) & 1)) { z->lb = mlimit1; return 0; } /* substring, line 56 */
+        among_var = find_among_b(z, a_2, 5);
+        if (!(among_var)) { z->lb = mlimit1; return 0; }
         z->bra = z->c; /* ], line 56 */
-        switch(among_var) {
-            case 0: { z->lb = mlimit; return 0; }
+        switch (among_var) { /* among, line 56 */
             case 1:
                 {   int ret = slice_del(z); /* delete, line 57 */
                     if (ret < 0) return ret;
@@ -259,15 +251,15 @@ static int r_other_suffix(struct SN_env * z) {
                 }
                 break;
         }
-        z->lb = mlimit;
+        z->lb = mlimit1;
     }
     return 1;
 }
 
-extern int swedish_UTF_8_stem(struct SN_env * z) {
+extern int swedish_UTF_8_stem(struct SN_env * z) { /* forwardmode */
     {   int c1 = z->c; /* do, line 66 */
-        {   int ret = r_mark_regions(z);
-            if (ret == 0) goto lab0; /* call mark_regions, line 66 */
+        {   int ret = r_mark_regions(z); /* call mark_regions, line 66 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
@@ -276,24 +268,24 @@ extern int swedish_UTF_8_stem(struct SN_env * z) {
     z->lb = z->c; z->c = z->l; /* backwards, line 67 */
 
     {   int m2 = z->l - z->c; (void)m2; /* do, line 68 */
-        {   int ret = r_main_suffix(z);
-            if (ret == 0) goto lab1; /* call main_suffix, line 68 */
+        {   int ret = r_main_suffix(z); /* call main_suffix, line 68 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
     {   int m3 = z->l - z->c; (void)m3; /* do, line 69 */
-        {   int ret = r_consonant_pair(z);
-            if (ret == 0) goto lab2; /* call consonant_pair, line 69 */
+        {   int ret = r_consonant_pair(z); /* call consonant_pair, line 69 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
         z->c = z->l - m3;
     }
     {   int m4 = z->l - z->c; (void)m4; /* do, line 70 */
-        {   int ret = r_other_suffix(z);
-            if (ret == 0) goto lab3; /* call other_suffix, line 70 */
+        {   int ret = r_other_suffix(z); /* call other_suffix, line 70 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
     lab3:
diff --git a/src/backend/snowball/libstemmer/stem_UTF_8_turkish.c b/src/backend/snowball/libstemmer/stem_UTF_8_turkish.c
index 587351d126..85eee41ada 100644
--- a/src/backend/snowball/libstemmer/stem_UTF_8_turkish.c
+++ b/src/backend/snowball/libstemmer/stem_UTF_8_turkish.c
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #include "header.h"
 
@@ -438,575 +438,495 @@ static const unsigned char g_vowel5[] = { 65 };
 
 static const unsigned char g_vowel6[] = { 65 };
 
-static const symbol s_0[] = { 'a' };
-static const symbol s_1[] = { 'e' };
-static const symbol s_2[] = { 0xC4, 0xB1 };
-static const symbol s_3[] = { 'i' };
-static const symbol s_4[] = { 'o' };
-static const symbol s_5[] = { 0xC3, 0xB6 };
-static const symbol s_6[] = { 'u' };
-static const symbol s_7[] = { 0xC3, 0xBC };
-static const symbol s_8[] = { 'n' };
-static const symbol s_9[] = { 'n' };
-static const symbol s_10[] = { 's' };
-static const symbol s_11[] = { 's' };
-static const symbol s_12[] = { 'y' };
-static const symbol s_13[] = { 'y' };
-static const symbol s_14[] = { 'k', 'i' };
-static const symbol s_15[] = { 'k', 'e', 'n' };
-static const symbol s_16[] = { 'p' };
-static const symbol s_17[] = { 0xC3, 0xA7 };
-static const symbol s_18[] = { 't' };
-static const symbol s_19[] = { 'k' };
-static const symbol s_20[] = { 'd' };
-static const symbol s_21[] = { 'g' };
-static const symbol s_22[] = { 'a' };
-static const symbol s_23[] = { 0xC4, 0xB1 };
-static const symbol s_24[] = { 0xC4, 0xB1 };
-static const symbol s_25[] = { 'e' };
-static const symbol s_26[] = { 'i' };
-static const symbol s_27[] = { 'i' };
-static const symbol s_28[] = { 'o' };
-static const symbol s_29[] = { 'u' };
-static const symbol s_30[] = { 'u' };
-static const symbol s_31[] = { 0xC3, 0xB6 };
-static const symbol s_32[] = { 0xC3, 0xBC };
-static const symbol s_33[] = { 0xC3, 0xBC };
-static const symbol s_34[] = { 'a', 'd' };
-static const symbol s_35[] = { 's', 'o', 'y', 'a', 'd' };
+static const symbol s_0[] = { 0xC4, 0xB1 };
+static const symbol s_1[] = { 0xC3, 0xB6 };
+static const symbol s_2[] = { 0xC3, 0xBC };
+static const symbol s_3[] = { 'k', 'i' };
+static const symbol s_4[] = { 'k', 'e', 'n' };
+static const symbol s_5[] = { 'p' };
+static const symbol s_6[] = { 0xC3, 0xA7 };
+static const symbol s_7[] = { 't' };
+static const symbol s_8[] = { 'k' };
+static const symbol s_9[] = { 0xC4, 0xB1 };
+static const symbol s_10[] = { 0xC4, 0xB1 };
+static const symbol s_11[] = { 'i' };
+static const symbol s_12[] = { 'u' };
+static const symbol s_13[] = { 0xC3, 0xB6 };
+static const symbol s_14[] = { 0xC3, 0xBC };
+static const symbol s_15[] = { 0xC3, 0xBC };
+static const symbol s_16[] = { 'a', 'd' };
+static const symbol s_17[] = { 's', 'o', 'y' };
 
-static int r_check_vowel_harmony(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 112 */
-        if (out_grouping_b_U(z, g_vowel, 97, 305, 1) < 0) return 0; /* goto */ /* grouping vowel, line 114 */
-        {   int m1 = z->l - z->c; (void)m1; /* or, line 116 */
-            if (!(eq_s_b(z, 1, s_0))) goto lab1;
-            if (out_grouping_b_U(z, g_vowel1, 97, 305, 1) < 0) goto lab1; /* goto */ /* grouping vowel1, line 116 */
+static int r_check_vowel_harmony(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 110 */
+        if (out_grouping_b_U(z, g_vowel, 97, 305, 1) < 0) return 0; /* goto */ /* grouping vowel, line 112 */
+        {   int m2 = z->l - z->c; (void)m2; /* or, line 114 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'a') goto lab1; /* literal, line 114 */
+            z->c--;
+            if (out_grouping_b_U(z, g_vowel1, 97, 305, 1) < 0) goto lab1; /* goto */ /* grouping vowel1, line 114 */
             goto lab0;
         lab1:
-            z->c = z->l - m1;
-            if (!(eq_s_b(z, 1, s_1))) goto lab2;
-            if (out_grouping_b_U(z, g_vowel2, 101, 252, 1) < 0) goto lab2; /* goto */ /* grouping vowel2, line 117 */
+            z->c = z->l - m2;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'e') goto lab2; /* literal, line 115 */
+            z->c--;
+            if (out_grouping_b_U(z, g_vowel2, 101, 252, 1) < 0) goto lab2; /* goto */ /* grouping vowel2, line 115 */
             goto lab0;
         lab2:
-            z->c = z->l - m1;
-            if (!(eq_s_b(z, 2, s_2))) goto lab3;
-            if (out_grouping_b_U(z, g_vowel3, 97, 305, 1) < 0) goto lab3; /* goto */ /* grouping vowel3, line 118 */
+            z->c = z->l - m2;
+            if (!(eq_s_b(z, 2, s_0))) goto lab3; /* literal, line 116 */
+            if (out_grouping_b_U(z, g_vowel3, 97, 305, 1) < 0) goto lab3; /* goto */ /* grouping vowel3, line 116 */
             goto lab0;
         lab3:
-            z->c = z->l - m1;
-            if (!(eq_s_b(z, 1, s_3))) goto lab4;
-            if (out_grouping_b_U(z, g_vowel4, 101, 105, 1) < 0) goto lab4; /* goto */ /* grouping vowel4, line 119 */
+            z->c = z->l - m2;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'i') goto lab4; /* literal, line 117 */
+            z->c--;
+            if (out_grouping_b_U(z, g_vowel4, 101, 105, 1) < 0) goto lab4; /* goto */ /* grouping vowel4, line 117 */
             goto lab0;
         lab4:
-            z->c = z->l - m1;
-            if (!(eq_s_b(z, 1, s_4))) goto lab5;
-            if (out_grouping_b_U(z, g_vowel5, 111, 117, 1) < 0) goto lab5; /* goto */ /* grouping vowel5, line 120 */
+            z->c = z->l - m2;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'o') goto lab5; /* literal, line 118 */
+            z->c--;
+            if (out_grouping_b_U(z, g_vowel5, 111, 117, 1) < 0) goto lab5; /* goto */ /* grouping vowel5, line 118 */
             goto lab0;
         lab5:
-            z->c = z->l - m1;
-            if (!(eq_s_b(z, 2, s_5))) goto lab6;
-            if (out_grouping_b_U(z, g_vowel6, 246, 252, 1) < 0) goto lab6; /* goto */ /* grouping vowel6, line 121 */
+            z->c = z->l - m2;
+            if (!(eq_s_b(z, 2, s_1))) goto lab6; /* literal, line 119 */
+            if (out_grouping_b_U(z, g_vowel6, 246, 252, 1) < 0) goto lab6; /* goto */ /* grouping vowel6, line 119 */
             goto lab0;
         lab6:
-            z->c = z->l - m1;
-            if (!(eq_s_b(z, 1, s_6))) goto lab7;
-            if (out_grouping_b_U(z, g_vowel5, 111, 117, 1) < 0) goto lab7; /* goto */ /* grouping vowel5, line 122 */
+            z->c = z->l - m2;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'u') goto lab7; /* literal, line 120 */
+            z->c--;
+            if (out_grouping_b_U(z, g_vowel5, 111, 117, 1) < 0) goto lab7; /* goto */ /* grouping vowel5, line 120 */
             goto lab0;
         lab7:
-            z->c = z->l - m1;
-            if (!(eq_s_b(z, 2, s_7))) return 0;
-            if (out_grouping_b_U(z, g_vowel6, 246, 252, 1) < 0) return 0; /* goto */ /* grouping vowel6, line 123 */
+            z->c = z->l - m2;
+            if (!(eq_s_b(z, 2, s_2))) return 0; /* literal, line 121 */
+            if (out_grouping_b_U(z, g_vowel6, 246, 252, 1) < 0) return 0; /* goto */ /* grouping vowel6, line 121 */
         }
     lab0:
-        z->c = z->l - m_test;
+        z->c = z->l - m_test1;
     }
     return 1;
 }
 
-static int r_mark_suffix_with_optional_n_consonant(struct SN_env * z) {
-    {   int m1 = z->l - z->c; (void)m1; /* or, line 134 */
-        {   int m_test = z->l - z->c; /* test, line 133 */
-            if (!(eq_s_b(z, 1, s_8))) goto lab1;
-            z->c = z->l - m_test;
-        }
-        {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
-            if (ret < 0) goto lab1;
-            z->c = ret; /* next, line 133 */
-        }
-        {   int m_test = z->l - z->c; /* test, line 133 */
-            if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) goto lab1;
-            z->c = z->l - m_test;
+static int r_mark_suffix_with_optional_n_consonant(struct SN_env * z) { /* backwardmode */
+    {   int m1 = z->l - z->c; (void)m1; /* or, line 132 */
+        if (z->c <= z->lb || z->p[z->c - 1] != 'n') goto lab1; /* literal, line 131 */
+        z->c--;
+        {   int m_test2 = z->l - z->c; /* test, line 131 */
+            if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) goto lab1; /* grouping vowel, line 131 */
+            z->c = z->l - m_test2;
         }
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        {   int m2 = z->l - z->c; (void)m2; /* not, line 135 */
-            {   int m_test = z->l - z->c; /* test, line 135 */
-                if (!(eq_s_b(z, 1, s_9))) goto lab2;
-                z->c = z->l - m_test;
+        {   int m3 = z->l - z->c; (void)m3; /* not, line 133 */
+            {   int m_test4 = z->l - z->c; /* test, line 133 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'n') goto lab2; /* literal, line 133 */
+                z->c--;
+                z->c = z->l - m_test4;
             }
             return 0;
         lab2:
-            z->c = z->l - m2;
+            z->c = z->l - m3;
         }
-        {   int m_test = z->l - z->c; /* test, line 135 */
+        {   int m_test5 = z->l - z->c; /* test, line 133 */
             {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
                 if (ret < 0) return 0;
-                z->c = ret; /* next, line 135 */
-            }
-            {   int m_test = z->l - z->c; /* test, line 135 */
-                if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) return 0;
-                z->c = z->l - m_test;
+                z->c = ret; /* next, line 133 */
             }
-            z->c = z->l - m_test;
+            if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) return 0; /* grouping vowel, line 133 */
+            z->c = z->l - m_test5;
         }
     }
 lab0:
     return 1;
 }
 
-static int r_mark_suffix_with_optional_s_consonant(struct SN_env * z) {
-    {   int m1 = z->l - z->c; (void)m1; /* or, line 145 */
-        {   int m_test = z->l - z->c; /* test, line 144 */
-            if (!(eq_s_b(z, 1, s_10))) goto lab1;
-            z->c = z->l - m_test;
-        }
-        {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
-            if (ret < 0) goto lab1;
-            z->c = ret; /* next, line 144 */
-        }
-        {   int m_test = z->l - z->c; /* test, line 144 */
-            if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) goto lab1;
-            z->c = z->l - m_test;
+static int r_mark_suffix_with_optional_s_consonant(struct SN_env * z) { /* backwardmode */
+    {   int m1 = z->l - z->c; (void)m1; /* or, line 143 */
+        if (z->c <= z->lb || z->p[z->c - 1] != 's') goto lab1; /* literal, line 142 */
+        z->c--;
+        {   int m_test2 = z->l - z->c; /* test, line 142 */
+            if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) goto lab1; /* grouping vowel, line 142 */
+            z->c = z->l - m_test2;
         }
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        {   int m2 = z->l - z->c; (void)m2; /* not, line 146 */
-            {   int m_test = z->l - z->c; /* test, line 146 */
-                if (!(eq_s_b(z, 1, s_11))) goto lab2;
-                z->c = z->l - m_test;
+        {   int m3 = z->l - z->c; (void)m3; /* not, line 144 */
+            {   int m_test4 = z->l - z->c; /* test, line 144 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 's') goto lab2; /* literal, line 144 */
+                z->c--;
+                z->c = z->l - m_test4;
             }
             return 0;
         lab2:
-            z->c = z->l - m2;
+            z->c = z->l - m3;
         }
-        {   int m_test = z->l - z->c; /* test, line 146 */
+        {   int m_test5 = z->l - z->c; /* test, line 144 */
             {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
                 if (ret < 0) return 0;
-                z->c = ret; /* next, line 146 */
-            }
-            {   int m_test = z->l - z->c; /* test, line 146 */
-                if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) return 0;
-                z->c = z->l - m_test;
+                z->c = ret; /* next, line 144 */
             }
-            z->c = z->l - m_test;
+            if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) return 0; /* grouping vowel, line 144 */
+            z->c = z->l - m_test5;
         }
     }
 lab0:
     return 1;
 }
 
-static int r_mark_suffix_with_optional_y_consonant(struct SN_env * z) {
-    {   int m1 = z->l - z->c; (void)m1; /* or, line 155 */
-        {   int m_test = z->l - z->c; /* test, line 154 */
-            if (!(eq_s_b(z, 1, s_12))) goto lab1;
-            z->c = z->l - m_test;
-        }
-        {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
-            if (ret < 0) goto lab1;
-            z->c = ret; /* next, line 154 */
-        }
-        {   int m_test = z->l - z->c; /* test, line 154 */
-            if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) goto lab1;
-            z->c = z->l - m_test;
+static int r_mark_suffix_with_optional_y_consonant(struct SN_env * z) { /* backwardmode */
+    {   int m1 = z->l - z->c; (void)m1; /* or, line 153 */
+        if (z->c <= z->lb || z->p[z->c - 1] != 'y') goto lab1; /* literal, line 152 */
+        z->c--;
+        {   int m_test2 = z->l - z->c; /* test, line 152 */
+            if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) goto lab1; /* grouping vowel, line 152 */
+            z->c = z->l - m_test2;
         }
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        {   int m2 = z->l - z->c; (void)m2; /* not, line 156 */
-            {   int m_test = z->l - z->c; /* test, line 156 */
-                if (!(eq_s_b(z, 1, s_13))) goto lab2;
-                z->c = z->l - m_test;
+        {   int m3 = z->l - z->c; (void)m3; /* not, line 154 */
+            {   int m_test4 = z->l - z->c; /* test, line 154 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'y') goto lab2; /* literal, line 154 */
+                z->c--;
+                z->c = z->l - m_test4;
             }
             return 0;
         lab2:
-            z->c = z->l - m2;
+            z->c = z->l - m3;
         }
-        {   int m_test = z->l - z->c; /* test, line 156 */
+        {   int m_test5 = z->l - z->c; /* test, line 154 */
             {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
                 if (ret < 0) return 0;
-                z->c = ret; /* next, line 156 */
-            }
-            {   int m_test = z->l - z->c; /* test, line 156 */
-                if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) return 0;
-                z->c = z->l - m_test;
+                z->c = ret; /* next, line 154 */
             }
-            z->c = z->l - m_test;
+            if (in_grouping_b_U(z, g_vowel, 97, 305, 0)) return 0; /* grouping vowel, line 154 */
+            z->c = z->l - m_test5;
         }
     }
 lab0:
     return 1;
 }
 
-static int r_mark_suffix_with_optional_U_vowel(struct SN_env * z) {
-    {   int m1 = z->l - z->c; (void)m1; /* or, line 161 */
-        {   int m_test = z->l - z->c; /* test, line 160 */
-            if (in_grouping_b_U(z, g_U, 105, 305, 0)) goto lab1;
-            z->c = z->l - m_test;
-        }
-        {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
-            if (ret < 0) goto lab1;
-            z->c = ret; /* next, line 160 */
-        }
-        {   int m_test = z->l - z->c; /* test, line 160 */
-            if (out_grouping_b_U(z, g_vowel, 97, 305, 0)) goto lab1;
-            z->c = z->l - m_test;
+static int r_mark_suffix_with_optional_U_vowel(struct SN_env * z) { /* backwardmode */
+    {   int m1 = z->l - z->c; (void)m1; /* or, line 159 */
+        if (in_grouping_b_U(z, g_U, 105, 305, 0)) goto lab1; /* grouping U, line 158 */
+        {   int m_test2 = z->l - z->c; /* test, line 158 */
+            if (out_grouping_b_U(z, g_vowel, 97, 305, 0)) goto lab1; /* non vowel, line 158 */
+            z->c = z->l - m_test2;
         }
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        {   int m2 = z->l - z->c; (void)m2; /* not, line 162 */
-            {   int m_test = z->l - z->c; /* test, line 162 */
-                if (in_grouping_b_U(z, g_U, 105, 305, 0)) goto lab2;
-                z->c = z->l - m_test;
+        {   int m3 = z->l - z->c; (void)m3; /* not, line 160 */
+            {   int m_test4 = z->l - z->c; /* test, line 160 */
+                if (in_grouping_b_U(z, g_U, 105, 305, 0)) goto lab2; /* grouping U, line 160 */
+                z->c = z->l - m_test4;
             }
             return 0;
         lab2:
-            z->c = z->l - m2;
+            z->c = z->l - m3;
         }
-        {   int m_test = z->l - z->c; /* test, line 162 */
+        {   int m_test5 = z->l - z->c; /* test, line 160 */
             {   int ret = skip_utf8(z->p, z->c, z->lb, 0, -1);
                 if (ret < 0) return 0;
-                z->c = ret; /* next, line 162 */
-            }
-            {   int m_test = z->l - z->c; /* test, line 162 */
-                if (out_grouping_b_U(z, g_vowel, 97, 305, 0)) return 0;
-                z->c = z->l - m_test;
+                z->c = ret; /* next, line 160 */
             }
-            z->c = z->l - m_test;
+            if (out_grouping_b_U(z, g_vowel, 97, 305, 0)) return 0; /* non vowel, line 160 */
+            z->c = z->l - m_test5;
         }
     }
 lab0:
     return 1;
 }
 
-static int r_mark_possessives(struct SN_env * z) {
-    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((67133440 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    if (!(find_among_b(z, a_0, 10))) return 0; /* among, line 167 */
-    {   int ret = r_mark_suffix_with_optional_U_vowel(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_U_vowel, line 169 */
-        if (ret < 0) return ret;
+static int r_mark_possessives(struct SN_env * z) { /* backwardmode */
+    if (z->c <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((67133440 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* among, line 165 */
+    if (!(find_among_b(z, a_0, 10))) return 0;
+    {   int ret = r_mark_suffix_with_optional_U_vowel(z); /* call mark_suffix_with_optional_U_vowel, line 167 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_sU(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 173 */
-        if (ret < 0) return ret;
+static int r_mark_sU(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 171 */
+        if (ret <= 0) return ret;
     }
-    if (in_grouping_b_U(z, g_U, 105, 305, 0)) return 0;
-    {   int ret = r_mark_suffix_with_optional_s_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_s_consonant, line 175 */
-        if (ret < 0) return ret;
+    if (in_grouping_b_U(z, g_U, 105, 305, 0)) return 0; /* grouping U, line 172 */
+    {   int ret = r_mark_suffix_with_optional_s_consonant(z); /* call mark_suffix_with_optional_s_consonant, line 173 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_lArI(struct SN_env * z) {
-    if (z->c - 3 <= z->lb || (z->p[z->c - 1] != 105 && z->p[z->c - 1] != 177)) return 0;
-    if (!(find_among_b(z, a_1, 2))) return 0; /* among, line 179 */
+static int r_mark_lArI(struct SN_env * z) { /* backwardmode */
+    if (z->c - 3 <= z->lb || (z->p[z->c - 1] != 105 && z->p[z->c - 1] != 177)) return 0; /* among, line 177 */
+    if (!(find_among_b(z, a_1, 2))) return 0;
     return 1;
 }
 
-static int r_mark_yU(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 183 */
-        if (ret < 0) return ret;
+static int r_mark_yU(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 181 */
+        if (ret <= 0) return ret;
     }
-    if (in_grouping_b_U(z, g_U, 105, 305, 0)) return 0;
-    {   int ret = r_mark_suffix_with_optional_y_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_y_consonant, line 185 */
-        if (ret < 0) return ret;
+    if (in_grouping_b_U(z, g_U, 105, 305, 0)) return 0; /* grouping U, line 182 */
+    {   int ret = r_mark_suffix_with_optional_y_consonant(z); /* call mark_suffix_with_optional_y_consonant, line 183 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_nU(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 189 */
-        if (ret < 0) return ret;
+static int r_mark_nU(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 187 */
+        if (ret <= 0) return ret;
     }
-    if (!(find_among_b(z, a_2, 4))) return 0; /* among, line 190 */
+    if (!(find_among_b(z, a_2, 4))) return 0; /* among, line 188 */
     return 1;
 }
 
-static int r_mark_nUn(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 194 */
-        if (ret < 0) return ret;
+static int r_mark_nUn(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 192 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] != 110) return 0;
-    if (!(find_among_b(z, a_3, 4))) return 0; /* among, line 195 */
-    {   int ret = r_mark_suffix_with_optional_n_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_n_consonant, line 196 */
-        if (ret < 0) return ret;
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] != 110) return 0; /* among, line 193 */
+    if (!(find_among_b(z, a_3, 4))) return 0;
+    {   int ret = r_mark_suffix_with_optional_n_consonant(z); /* call mark_suffix_with_optional_n_consonant, line 194 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_yA(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 200 */
-        if (ret < 0) return ret;
+static int r_mark_yA(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 198 */
+        if (ret <= 0) return ret;
     }
-    if (z->c <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0;
-    if (!(find_among_b(z, a_4, 2))) return 0; /* among, line 201 */
-    {   int ret = r_mark_suffix_with_optional_y_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_y_consonant, line 202 */
-        if (ret < 0) return ret;
+    if (z->c <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0; /* among, line 199 */
+    if (!(find_among_b(z, a_4, 2))) return 0;
+    {   int ret = r_mark_suffix_with_optional_y_consonant(z); /* call mark_suffix_with_optional_y_consonant, line 200 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_nA(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 206 */
-        if (ret < 0) return ret;
+static int r_mark_nA(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 204 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0;
-    if (!(find_among_b(z, a_5, 2))) return 0; /* among, line 207 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0; /* among, line 205 */
+    if (!(find_among_b(z, a_5, 2))) return 0;
     return 1;
 }
 
-static int r_mark_DA(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 211 */
-        if (ret < 0) return ret;
+static int r_mark_DA(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 209 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0;
-    if (!(find_among_b(z, a_6, 4))) return 0; /* among, line 212 */
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0; /* among, line 210 */
+    if (!(find_among_b(z, a_6, 4))) return 0;
     return 1;
 }
 
-static int r_mark_ndA(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 216 */
-        if (ret < 0) return ret;
+static int r_mark_ndA(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 214 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 2 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0;
-    if (!(find_among_b(z, a_7, 2))) return 0; /* among, line 217 */
+    if (z->c - 2 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0; /* among, line 215 */
+    if (!(find_among_b(z, a_7, 2))) return 0;
     return 1;
 }
 
-static int r_mark_DAn(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 221 */
-        if (ret < 0) return ret;
+static int r_mark_DAn(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 219 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] != 110) return 0;
-    if (!(find_among_b(z, a_8, 4))) return 0; /* among, line 222 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] != 110) return 0; /* among, line 220 */
+    if (!(find_among_b(z, a_8, 4))) return 0;
     return 1;
 }
 
-static int r_mark_ndAn(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 226 */
-        if (ret < 0) return ret;
+static int r_mark_ndAn(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 224 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 3 <= z->lb || z->p[z->c - 1] != 110) return 0;
-    if (!(find_among_b(z, a_9, 2))) return 0; /* among, line 227 */
+    if (z->c - 3 <= z->lb || z->p[z->c - 1] != 110) return 0; /* among, line 225 */
+    if (!(find_among_b(z, a_9, 2))) return 0;
     return 1;
 }
 
-static int r_mark_ylA(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 231 */
-        if (ret < 0) return ret;
+static int r_mark_ylA(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 229 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0;
-    if (!(find_among_b(z, a_10, 2))) return 0; /* among, line 232 */
-    {   int ret = r_mark_suffix_with_optional_y_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_y_consonant, line 233 */
-        if (ret < 0) return ret;
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0; /* among, line 230 */
+    if (!(find_among_b(z, a_10, 2))) return 0;
+    {   int ret = r_mark_suffix_with_optional_y_consonant(z); /* call mark_suffix_with_optional_y_consonant, line 231 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_ki(struct SN_env * z) {
-    if (!(eq_s_b(z, 2, s_14))) return 0;
+static int r_mark_ki(struct SN_env * z) { /* backwardmode */
+    if (!(eq_s_b(z, 2, s_3))) return 0; /* literal, line 235 */
     return 1;
 }
 
-static int r_mark_ncA(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 241 */
-        if (ret < 0) return ret;
+static int r_mark_ncA(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 239 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0;
-    if (!(find_among_b(z, a_11, 2))) return 0; /* among, line 242 */
-    {   int ret = r_mark_suffix_with_optional_n_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_n_consonant, line 243 */
-        if (ret < 0) return ret;
+    if (z->c - 1 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0; /* among, line 240 */
+    if (!(find_among_b(z, a_11, 2))) return 0;
+    {   int ret = r_mark_suffix_with_optional_n_consonant(z); /* call mark_suffix_with_optional_n_consonant, line 241 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_yUm(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 247 */
-        if (ret < 0) return ret;
+static int r_mark_yUm(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 245 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] != 109) return 0;
-    if (!(find_among_b(z, a_12, 4))) return 0; /* among, line 248 */
-    {   int ret = r_mark_suffix_with_optional_y_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_y_consonant, line 249 */
-        if (ret < 0) return ret;
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] != 109) return 0; /* among, line 246 */
+    if (!(find_among_b(z, a_12, 4))) return 0;
+    {   int ret = r_mark_suffix_with_optional_y_consonant(z); /* call mark_suffix_with_optional_y_consonant, line 247 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_sUn(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 253 */
-        if (ret < 0) return ret;
+static int r_mark_sUn(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 251 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] != 110) return 0;
-    if (!(find_among_b(z, a_13, 4))) return 0; /* among, line 254 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] != 110) return 0; /* among, line 252 */
+    if (!(find_among_b(z, a_13, 4))) return 0;
     return 1;
 }
 
-static int r_mark_yUz(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 258 */
-        if (ret < 0) return ret;
+static int r_mark_yUz(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 256 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] != 122) return 0;
-    if (!(find_among_b(z, a_14, 4))) return 0; /* among, line 259 */
-    {   int ret = r_mark_suffix_with_optional_y_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_y_consonant, line 260 */
-        if (ret < 0) return ret;
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] != 122) return 0; /* among, line 257 */
+    if (!(find_among_b(z, a_14, 4))) return 0;
+    {   int ret = r_mark_suffix_with_optional_y_consonant(z); /* call mark_suffix_with_optional_y_consonant, line 258 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_sUnUz(struct SN_env * z) {
-    if (z->c - 4 <= z->lb || z->p[z->c - 1] != 122) return 0;
-    if (!(find_among_b(z, a_15, 4))) return 0; /* among, line 264 */
+static int r_mark_sUnUz(struct SN_env * z) { /* backwardmode */
+    if (z->c - 4 <= z->lb || z->p[z->c - 1] != 122) return 0; /* among, line 262 */
+    if (!(find_among_b(z, a_15, 4))) return 0;
     return 1;
 }
 
-static int r_mark_lAr(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 268 */
-        if (ret < 0) return ret;
+static int r_mark_lAr(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 266 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] != 114) return 0;
-    if (!(find_among_b(z, a_16, 2))) return 0; /* among, line 269 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] != 114) return 0; /* among, line 267 */
+    if (!(find_among_b(z, a_16, 2))) return 0;
     return 1;
 }
 
-static int r_mark_nUz(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 273 */
-        if (ret < 0) return ret;
+static int r_mark_nUz(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 271 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] != 122) return 0;
-    if (!(find_among_b(z, a_17, 4))) return 0; /* among, line 274 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] != 122) return 0; /* among, line 272 */
+    if (!(find_among_b(z, a_17, 4))) return 0;
     return 1;
 }
 
-static int r_mark_DUr(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 278 */
-        if (ret < 0) return ret;
+static int r_mark_DUr(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 276 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 2 <= z->lb || z->p[z->c - 1] != 114) return 0;
-    if (!(find_among_b(z, a_18, 8))) return 0; /* among, line 279 */
+    if (z->c - 2 <= z->lb || z->p[z->c - 1] != 114) return 0; /* among, line 277 */
+    if (!(find_among_b(z, a_18, 8))) return 0;
     return 1;
 }
 
-static int r_mark_cAsInA(struct SN_env * z) {
-    if (z->c - 5 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0;
-    if (!(find_among_b(z, a_19, 2))) return 0; /* among, line 283 */
+static int r_mark_cAsInA(struct SN_env * z) { /* backwardmode */
+    if (z->c - 5 <= z->lb || (z->p[z->c - 1] != 97 && z->p[z->c - 1] != 101)) return 0; /* among, line 281 */
+    if (!(find_among_b(z, a_19, 2))) return 0;
     return 1;
 }
 
-static int r_mark_yDU(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 287 */
-        if (ret < 0) return ret;
+static int r_mark_yDU(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 285 */
+        if (ret <= 0) return ret;
     }
-    if (!(find_among_b(z, a_20, 32))) return 0; /* among, line 288 */
-    {   int ret = r_mark_suffix_with_optional_y_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_y_consonant, line 292 */
-        if (ret < 0) return ret;
+    if (!(find_among_b(z, a_20, 32))) return 0; /* among, line 286 */
+    {   int ret = r_mark_suffix_with_optional_y_consonant(z); /* call mark_suffix_with_optional_y_consonant, line 290 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_ysA(struct SN_env * z) {
-    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((26658 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0;
-    if (!(find_among_b(z, a_21, 8))) return 0; /* among, line 297 */
-    {   int ret = r_mark_suffix_with_optional_y_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_y_consonant, line 298 */
-        if (ret < 0) return ret;
+static int r_mark_ysA(struct SN_env * z) { /* backwardmode */
+    if (z->c - 1 <= z->lb || z->p[z->c - 1] >> 5 != 3 || !((26658 >> (z->p[z->c - 1] & 0x1f)) & 1)) return 0; /* among, line 295 */
+    if (!(find_among_b(z, a_21, 8))) return 0;
+    {   int ret = r_mark_suffix_with_optional_y_consonant(z); /* call mark_suffix_with_optional_y_consonant, line 296 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_ymUs_(struct SN_env * z) {
-    {   int ret = r_check_vowel_harmony(z);
-        if (ret == 0) return 0; /* call check_vowel_harmony, line 302 */
-        if (ret < 0) return ret;
+static int r_mark_ymUs_(struct SN_env * z) { /* backwardmode */
+    {   int ret = r_check_vowel_harmony(z); /* call check_vowel_harmony, line 300 */
+        if (ret <= 0) return ret;
     }
-    if (z->c - 3 <= z->lb || z->p[z->c - 1] != 159) return 0;
-    if (!(find_among_b(z, a_22, 4))) return 0; /* among, line 303 */
-    {   int ret = r_mark_suffix_with_optional_y_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_y_consonant, line 304 */
-        if (ret < 0) return ret;
+    if (z->c - 3 <= z->lb || z->p[z->c - 1] != 159) return 0; /* among, line 301 */
+    if (!(find_among_b(z, a_22, 4))) return 0;
+    {   int ret = r_mark_suffix_with_optional_y_consonant(z); /* call mark_suffix_with_optional_y_consonant, line 302 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_mark_yken(struct SN_env * z) {
-    if (!(eq_s_b(z, 3, s_15))) return 0;
-    {   int ret = r_mark_suffix_with_optional_y_consonant(z);
-        if (ret == 0) return 0; /* call mark_suffix_with_optional_y_consonant, line 308 */
-        if (ret < 0) return ret;
+static int r_mark_yken(struct SN_env * z) { /* backwardmode */
+    if (!(eq_s_b(z, 3, s_4))) return 0; /* literal, line 306 */
+    {   int ret = r_mark_suffix_with_optional_y_consonant(z); /* call mark_suffix_with_optional_y_consonant, line 306 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-static int r_stem_nominal_verb_suffixes(struct SN_env * z) {
-    z->ket = z->c; /* [, line 312 */
-    z->B[0] = 1; /* set continue_stemming_noun_suffixes, line 313 */
-    {   int m1 = z->l - z->c; (void)m1; /* or, line 315 */
-        {   int m2 = z->l - z->c; (void)m2; /* or, line 314 */
-            {   int ret = r_mark_ymUs_(z);
-                if (ret == 0) goto lab3; /* call mark_ymUs_, line 314 */
+static int r_stem_nominal_verb_suffixes(struct SN_env * z) { /* backwardmode */
+    z->ket = z->c; /* [, line 310 */
+    z->B[0] = 1; /* set continue_stemming_noun_suffixes, line 311 */
+    {   int m1 = z->l - z->c; (void)m1; /* or, line 313 */
+        {   int m2 = z->l - z->c; (void)m2; /* or, line 312 */
+            {   int ret = r_mark_ymUs_(z); /* call mark_ymUs_, line 312 */
+                if (ret == 0) goto lab3;
                 if (ret < 0) return ret;
             }
             goto lab2;
         lab3:
             z->c = z->l - m2;
-            {   int ret = r_mark_yDU(z);
-                if (ret == 0) goto lab4; /* call mark_yDU, line 314 */
+            {   int ret = r_mark_yDU(z); /* call mark_yDU, line 312 */
+                if (ret == 0) goto lab4;
                 if (ret < 0) return ret;
             }
             goto lab2;
         lab4:
             z->c = z->l - m2;
-            {   int ret = r_mark_ysA(z);
-                if (ret == 0) goto lab5; /* call mark_ysA, line 314 */
+            {   int ret = r_mark_ysA(z); /* call mark_ysA, line 312 */
+                if (ret == 0) goto lab5;
                 if (ret < 0) return ret;
             }
             goto lab2;
         lab5:
             z->c = z->l - m2;
-            {   int ret = r_mark_yken(z);
-                if (ret == 0) goto lab1; /* call mark_yken, line 314 */
+            {   int ret = r_mark_yken(z); /* call mark_yken, line 312 */
+                if (ret == 0) goto lab1;
                 if (ret < 0) return ret;
             }
         }
@@ -1014,41 +934,41 @@ static int r_stem_nominal_verb_suffixes(struct SN_env * z) {
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        {   int ret = r_mark_cAsInA(z);
-            if (ret == 0) goto lab6; /* call mark_cAsInA, line 316 */
+        {   int ret = r_mark_cAsInA(z); /* call mark_cAsInA, line 314 */
+            if (ret == 0) goto lab6;
             if (ret < 0) return ret;
         }
-        {   int m3 = z->l - z->c; (void)m3; /* or, line 316 */
-            {   int ret = r_mark_sUnUz(z);
-                if (ret == 0) goto lab8; /* call mark_sUnUz, line 316 */
+        {   int m3 = z->l - z->c; (void)m3; /* or, line 314 */
+            {   int ret = r_mark_sUnUz(z); /* call mark_sUnUz, line 314 */
+                if (ret == 0) goto lab8;
                 if (ret < 0) return ret;
             }
             goto lab7;
         lab8:
             z->c = z->l - m3;
-            {   int ret = r_mark_lAr(z);
-                if (ret == 0) goto lab9; /* call mark_lAr, line 316 */
+            {   int ret = r_mark_lAr(z); /* call mark_lAr, line 314 */
+                if (ret == 0) goto lab9;
                 if (ret < 0) return ret;
             }
             goto lab7;
         lab9:
             z->c = z->l - m3;
-            {   int ret = r_mark_yUm(z);
-                if (ret == 0) goto lab10; /* call mark_yUm, line 316 */
+            {   int ret = r_mark_yUm(z); /* call mark_yUm, line 314 */
+                if (ret == 0) goto lab10;
                 if (ret < 0) return ret;
             }
             goto lab7;
         lab10:
             z->c = z->l - m3;
-            {   int ret = r_mark_sUn(z);
-                if (ret == 0) goto lab11; /* call mark_sUn, line 316 */
+            {   int ret = r_mark_sUn(z); /* call mark_sUn, line 314 */
+                if (ret == 0) goto lab11;
                 if (ret < 0) return ret;
             }
             goto lab7;
         lab11:
             z->c = z->l - m3;
-            {   int ret = r_mark_yUz(z);
-                if (ret == 0) goto lab12; /* call mark_yUz, line 316 */
+            {   int ret = r_mark_yUz(z); /* call mark_yUz, line 314 */
+                if (ret == 0) goto lab12;
                 if (ret < 0) return ret;
             }
             goto lab7;
@@ -1056,47 +976,47 @@ static int r_stem_nominal_verb_suffixes(struct SN_env * z) {
             z->c = z->l - m3;
         }
     lab7:
-        {   int ret = r_mark_ymUs_(z);
-            if (ret == 0) goto lab6; /* call mark_ymUs_, line 316 */
+        {   int ret = r_mark_ymUs_(z); /* call mark_ymUs_, line 314 */
+            if (ret == 0) goto lab6;
             if (ret < 0) return ret;
         }
         goto lab0;
     lab6:
         z->c = z->l - m1;
-        {   int ret = r_mark_lAr(z);
-            if (ret == 0) goto lab13; /* call mark_lAr, line 319 */
+        {   int ret = r_mark_lAr(z); /* call mark_lAr, line 317 */
+            if (ret == 0) goto lab13;
             if (ret < 0) return ret;
         }
-        z->bra = z->c; /* ], line 319 */
-        {   int ret = slice_del(z); /* delete, line 319 */
+        z->bra = z->c; /* ], line 317 */
+        {   int ret = slice_del(z); /* delete, line 317 */
             if (ret < 0) return ret;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 319 */
-            z->ket = z->c; /* [, line 319 */
-            {   int m4 = z->l - z->c; (void)m4; /* or, line 319 */
-                {   int ret = r_mark_DUr(z);
-                    if (ret == 0) goto lab16; /* call mark_DUr, line 319 */
+        {   int m4 = z->l - z->c; (void)m4; /* try, line 317 */
+            z->ket = z->c; /* [, line 317 */
+            {   int m5 = z->l - z->c; (void)m5; /* or, line 317 */
+                {   int ret = r_mark_DUr(z); /* call mark_DUr, line 317 */
+                    if (ret == 0) goto lab16;
                     if (ret < 0) return ret;
                 }
                 goto lab15;
             lab16:
-                z->c = z->l - m4;
-                {   int ret = r_mark_yDU(z);
-                    if (ret == 0) goto lab17; /* call mark_yDU, line 319 */
+                z->c = z->l - m5;
+                {   int ret = r_mark_yDU(z); /* call mark_yDU, line 317 */
+                    if (ret == 0) goto lab17;
                     if (ret < 0) return ret;
                 }
                 goto lab15;
             lab17:
-                z->c = z->l - m4;
-                {   int ret = r_mark_ysA(z);
-                    if (ret == 0) goto lab18; /* call mark_ysA, line 319 */
+                z->c = z->l - m5;
+                {   int ret = r_mark_ysA(z); /* call mark_ysA, line 317 */
+                    if (ret == 0) goto lab18;
                     if (ret < 0) return ret;
                 }
                 goto lab15;
             lab18:
-                z->c = z->l - m4;
-                {   int ret = r_mark_ymUs_(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab14; } /* call mark_ymUs_, line 319 */
+                z->c = z->l - m5;
+                {   int ret = r_mark_ymUs_(z); /* call mark_ymUs_, line 317 */
+                    if (ret == 0) { z->c = z->l - m4; goto lab14; }
                     if (ret < 0) return ret;
                 }
             }
@@ -1104,24 +1024,24 @@ static int r_stem_nominal_verb_suffixes(struct SN_env * z) {
         lab14:
             ;
         }
-        z->B[0] = 0; /* unset continue_stemming_noun_suffixes, line 320 */
+        z->B[0] = 0; /* unset continue_stemming_noun_suffixes, line 318 */
         goto lab0;
     lab13:
         z->c = z->l - m1;
-        {   int ret = r_mark_nUz(z);
-            if (ret == 0) goto lab19; /* call mark_nUz, line 323 */
+        {   int ret = r_mark_nUz(z); /* call mark_nUz, line 321 */
+            if (ret == 0) goto lab19;
             if (ret < 0) return ret;
         }
-        {   int m5 = z->l - z->c; (void)m5; /* or, line 323 */
-            {   int ret = r_mark_yDU(z);
-                if (ret == 0) goto lab21; /* call mark_yDU, line 323 */
+        {   int m6 = z->l - z->c; (void)m6; /* or, line 321 */
+            {   int ret = r_mark_yDU(z); /* call mark_yDU, line 321 */
+                if (ret == 0) goto lab21;
                 if (ret < 0) return ret;
             }
             goto lab20;
         lab21:
-            z->c = z->l - m5;
-            {   int ret = r_mark_ysA(z);
-                if (ret == 0) goto lab19; /* call mark_ysA, line 323 */
+            z->c = z->l - m6;
+            {   int ret = r_mark_ysA(z); /* call mark_ysA, line 321 */
+                if (ret == 0) goto lab19;
                 if (ret < 0) return ret;
             }
         }
@@ -1129,100 +1049,99 @@ static int r_stem_nominal_verb_suffixes(struct SN_env * z) {
         goto lab0;
     lab19:
         z->c = z->l - m1;
-        {   int m6 = z->l - z->c; (void)m6; /* or, line 325 */
-            {   int ret = r_mark_sUnUz(z);
-                if (ret == 0) goto lab24; /* call mark_sUnUz, line 325 */
+        {   int m7 = z->l - z->c; (void)m7; /* or, line 323 */
+            {   int ret = r_mark_sUnUz(z); /* call mark_sUnUz, line 323 */
+                if (ret == 0) goto lab24;
                 if (ret < 0) return ret;
             }
             goto lab23;
         lab24:
-            z->c = z->l - m6;
-            {   int ret = r_mark_yUz(z);
-                if (ret == 0) goto lab25; /* call mark_yUz, line 325 */
+            z->c = z->l - m7;
+            {   int ret = r_mark_yUz(z); /* call mark_yUz, line 323 */
+                if (ret == 0) goto lab25;
                 if (ret < 0) return ret;
             }
             goto lab23;
         lab25:
-            z->c = z->l - m6;
-            {   int ret = r_mark_sUn(z);
-                if (ret == 0) goto lab26; /* call mark_sUn, line 325 */
+            z->c = z->l - m7;
+            {   int ret = r_mark_sUn(z); /* call mark_sUn, line 323 */
+                if (ret == 0) goto lab26;
                 if (ret < 0) return ret;
             }
             goto lab23;
         lab26:
-            z->c = z->l - m6;
-            {   int ret = r_mark_yUm(z);
-                if (ret == 0) goto lab22; /* call mark_yUm, line 325 */
+            z->c = z->l - m7;
+            {   int ret = r_mark_yUm(z); /* call mark_yUm, line 323 */
+                if (ret == 0) goto lab22;
                 if (ret < 0) return ret;
             }
         }
     lab23:
+        z->bra = z->c; /* ], line 323 */
+        {   int ret = slice_del(z); /* delete, line 323 */
+            if (ret < 0) return ret;
+        }
+        {   int m8 = z->l - z->c; (void)m8; /* try, line 323 */
+            z->ket = z->c; /* [, line 323 */
+            {   int ret = r_mark_ymUs_(z); /* call mark_ymUs_, line 323 */
+                if (ret == 0) { z->c = z->l - m8; goto lab27; }
+                if (ret < 0) return ret;
+            }
+        lab27:
+            ;
+        }
+        goto lab0;
+    lab22:
+        z->c = z->l - m1;
+        {   int ret = r_mark_DUr(z); /* call mark_DUr, line 325 */
+            if (ret <= 0) return ret;
+        }
         z->bra = z->c; /* ], line 325 */
         {   int ret = slice_del(z); /* delete, line 325 */
             if (ret < 0) return ret;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 325 */
+        {   int m9 = z->l - z->c; (void)m9; /* try, line 325 */
             z->ket = z->c; /* [, line 325 */
-            {   int ret = r_mark_ymUs_(z);
-                if (ret == 0) { z->c = z->l - m_keep; goto lab27; } /* call mark_ymUs_, line 325 */
-                if (ret < 0) return ret;
-            }
-        lab27:
-            ;
-        }
-        goto lab0;
-    lab22:
-        z->c = z->l - m1;
-        {   int ret = r_mark_DUr(z);
-            if (ret == 0) return 0; /* call mark_DUr, line 327 */
-            if (ret < 0) return ret;
-        }
-        z->bra = z->c; /* ], line 327 */
-        {   int ret = slice_del(z); /* delete, line 327 */
-            if (ret < 0) return ret;
-        }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 327 */
-            z->ket = z->c; /* [, line 327 */
-            {   int m7 = z->l - z->c; (void)m7; /* or, line 327 */
-                {   int ret = r_mark_sUnUz(z);
-                    if (ret == 0) goto lab30; /* call mark_sUnUz, line 327 */
+            {   int m10 = z->l - z->c; (void)m10; /* or, line 325 */
+                {   int ret = r_mark_sUnUz(z); /* call mark_sUnUz, line 325 */
+                    if (ret == 0) goto lab30;
                     if (ret < 0) return ret;
                 }
                 goto lab29;
             lab30:
-                z->c = z->l - m7;
-                {   int ret = r_mark_lAr(z);
-                    if (ret == 0) goto lab31; /* call mark_lAr, line 327 */
+                z->c = z->l - m10;
+                {   int ret = r_mark_lAr(z); /* call mark_lAr, line 325 */
+                    if (ret == 0) goto lab31;
                     if (ret < 0) return ret;
                 }
                 goto lab29;
             lab31:
-                z->c = z->l - m7;
-                {   int ret = r_mark_yUm(z);
-                    if (ret == 0) goto lab32; /* call mark_yUm, line 327 */
+                z->c = z->l - m10;
+                {   int ret = r_mark_yUm(z); /* call mark_yUm, line 325 */
+                    if (ret == 0) goto lab32;
                     if (ret < 0) return ret;
                 }
                 goto lab29;
             lab32:
-                z->c = z->l - m7;
-                {   int ret = r_mark_sUn(z);
-                    if (ret == 0) goto lab33; /* call mark_sUn, line 327 */
+                z->c = z->l - m10;
+                {   int ret = r_mark_sUn(z); /* call mark_sUn, line 325 */
+                    if (ret == 0) goto lab33;
                     if (ret < 0) return ret;
                 }
                 goto lab29;
             lab33:
-                z->c = z->l - m7;
-                {   int ret = r_mark_yUz(z);
-                    if (ret == 0) goto lab34; /* call mark_yUz, line 327 */
+                z->c = z->l - m10;
+                {   int ret = r_mark_yUz(z); /* call mark_yUz, line 325 */
+                    if (ret == 0) goto lab34;
                     if (ret < 0) return ret;
                 }
                 goto lab29;
             lab34:
-                z->c = z->l - m7;
+                z->c = z->l - m10;
             }
         lab29:
-            {   int ret = r_mark_ymUs_(z);
-                if (ret == 0) { z->c = z->l - m_keep; goto lab28; } /* call mark_ymUs_, line 327 */
+            {   int ret = r_mark_ymUs_(z); /* call mark_ymUs_, line 325 */
+                if (ret == 0) { z->c = z->l - m9; goto lab28; }
                 if (ret < 0) return ret;
             }
         lab28:
@@ -1230,42 +1149,41 @@ static int r_stem_nominal_verb_suffixes(struct SN_env * z) {
         }
     }
 lab0:
-    z->bra = z->c; /* ], line 328 */
-    {   int ret = slice_del(z); /* delete, line 328 */
+    z->bra = z->c; /* ], line 326 */
+    {   int ret = slice_del(z); /* delete, line 326 */
         if (ret < 0) return ret;
     }
     return 1;
 }
 
-static int r_stem_suffix_chain_before_ki(struct SN_env * z) {
-    z->ket = z->c; /* [, line 333 */
-    {   int ret = r_mark_ki(z);
-        if (ret == 0) return 0; /* call mark_ki, line 334 */
-        if (ret < 0) return ret;
+static int r_stem_suffix_chain_before_ki(struct SN_env * z) { /* backwardmode */
+    z->ket = z->c; /* [, line 331 */
+    {   int ret = r_mark_ki(z); /* call mark_ki, line 332 */
+        if (ret <= 0) return ret;
     }
-    {   int m1 = z->l - z->c; (void)m1; /* or, line 342 */
-        {   int ret = r_mark_DA(z);
-            if (ret == 0) goto lab1; /* call mark_DA, line 336 */
+    {   int m1 = z->l - z->c; (void)m1; /* or, line 340 */
+        {   int ret = r_mark_DA(z); /* call mark_DA, line 334 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
-        z->bra = z->c; /* ], line 336 */
-        {   int ret = slice_del(z); /* delete, line 336 */
+        z->bra = z->c; /* ], line 334 */
+        {   int ret = slice_del(z); /* delete, line 334 */
             if (ret < 0) return ret;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 336 */
-            z->ket = z->c; /* [, line 336 */
-            {   int m2 = z->l - z->c; (void)m2; /* or, line 338 */
-                {   int ret = r_mark_lAr(z);
-                    if (ret == 0) goto lab4; /* call mark_lAr, line 337 */
+        {   int m2 = z->l - z->c; (void)m2; /* try, line 334 */
+            z->ket = z->c; /* [, line 334 */
+            {   int m3 = z->l - z->c; (void)m3; /* or, line 336 */
+                {   int ret = r_mark_lAr(z); /* call mark_lAr, line 335 */
+                    if (ret == 0) goto lab4;
                     if (ret < 0) return ret;
                 }
-                z->bra = z->c; /* ], line 337 */
-                {   int ret = slice_del(z); /* delete, line 337 */
+                z->bra = z->c; /* ], line 335 */
+                {   int ret = slice_del(z); /* delete, line 335 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 337 */
-                    {   int ret = r_stem_suffix_chain_before_ki(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab5; } /* call stem_suffix_chain_before_ki, line 337 */
+                {   int m4 = z->l - z->c; (void)m4; /* try, line 335 */
+                    {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 335 */
+                        if (ret == 0) { z->c = z->l - m4; goto lab5; }
                         if (ret < 0) return ret;
                     }
                 lab5:
@@ -1273,27 +1191,27 @@ static int r_stem_suffix_chain_before_ki(struct SN_env * z) {
                 }
                 goto lab3;
             lab4:
-                z->c = z->l - m2;
-                {   int ret = r_mark_possessives(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab2; } /* call mark_possessives, line 339 */
+                z->c = z->l - m3;
+                {   int ret = r_mark_possessives(z); /* call mark_possessives, line 337 */
+                    if (ret == 0) { z->c = z->l - m2; goto lab2; }
                     if (ret < 0) return ret;
                 }
-                z->bra = z->c; /* ], line 339 */
-                {   int ret = slice_del(z); /* delete, line 339 */
+                z->bra = z->c; /* ], line 337 */
+                {   int ret = slice_del(z); /* delete, line 337 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 339 */
-                    z->ket = z->c; /* [, line 339 */
-                    {   int ret = r_mark_lAr(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab6; } /* call mark_lAr, line 339 */
+                {   int m5 = z->l - z->c; (void)m5; /* try, line 337 */
+                    z->ket = z->c; /* [, line 337 */
+                    {   int ret = r_mark_lAr(z); /* call mark_lAr, line 337 */
+                        if (ret == 0) { z->c = z->l - m5; goto lab6; }
                         if (ret < 0) return ret;
                     }
-                    z->bra = z->c; /* ], line 339 */
-                    {   int ret = slice_del(z); /* delete, line 339 */
+                    z->bra = z->c; /* ], line 337 */
+                    {   int ret = slice_del(z); /* delete, line 337 */
                         if (ret < 0) return ret;
                     }
-                    {   int ret = r_stem_suffix_chain_before_ki(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab6; } /* call stem_suffix_chain_before_ki, line 339 */
+                    {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 337 */
+                        if (ret == 0) { z->c = z->l - m5; goto lab6; }
                         if (ret < 0) return ret;
                     }
                 lab6:
@@ -1307,59 +1225,59 @@ static int r_stem_suffix_chain_before_ki(struct SN_env * z) {
         goto lab0;
     lab1:
         z->c = z->l - m1;
-        {   int ret = r_mark_nUn(z);
-            if (ret == 0) goto lab7; /* call mark_nUn, line 343 */
+        {   int ret = r_mark_nUn(z); /* call mark_nUn, line 341 */
+            if (ret == 0) goto lab7;
             if (ret < 0) return ret;
         }
-        z->bra = z->c; /* ], line 343 */
-        {   int ret = slice_del(z); /* delete, line 343 */
+        z->bra = z->c; /* ], line 341 */
+        {   int ret = slice_del(z); /* delete, line 341 */
             if (ret < 0) return ret;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 343 */
-            z->ket = z->c; /* [, line 343 */
-            {   int m3 = z->l - z->c; (void)m3; /* or, line 345 */
-                {   int ret = r_mark_lArI(z);
-                    if (ret == 0) goto lab10; /* call mark_lArI, line 344 */
+        {   int m6 = z->l - z->c; (void)m6; /* try, line 341 */
+            z->ket = z->c; /* [, line 341 */
+            {   int m7 = z->l - z->c; (void)m7; /* or, line 343 */
+                {   int ret = r_mark_lArI(z); /* call mark_lArI, line 342 */
+                    if (ret == 0) goto lab10;
                     if (ret < 0) return ret;
                 }
-                z->bra = z->c; /* ], line 344 */
-                {   int ret = slice_del(z); /* delete, line 344 */
+                z->bra = z->c; /* ], line 342 */
+                {   int ret = slice_del(z); /* delete, line 342 */
                     if (ret < 0) return ret;
                 }
                 goto lab9;
             lab10:
-                z->c = z->l - m3;
-                z->ket = z->c; /* [, line 346 */
-                {   int m4 = z->l - z->c; (void)m4; /* or, line 346 */
-                    {   int ret = r_mark_possessives(z);
-                        if (ret == 0) goto lab13; /* call mark_possessives, line 346 */
+                z->c = z->l - m7;
+                z->ket = z->c; /* [, line 344 */
+                {   int m8 = z->l - z->c; (void)m8; /* or, line 344 */
+                    {   int ret = r_mark_possessives(z); /* call mark_possessives, line 344 */
+                        if (ret == 0) goto lab13;
                         if (ret < 0) return ret;
                     }
                     goto lab12;
                 lab13:
-                    z->c = z->l - m4;
-                    {   int ret = r_mark_sU(z);
-                        if (ret == 0) goto lab11; /* call mark_sU, line 346 */
+                    z->c = z->l - m8;
+                    {   int ret = r_mark_sU(z); /* call mark_sU, line 344 */
+                        if (ret == 0) goto lab11;
                         if (ret < 0) return ret;
                     }
                 }
             lab12:
-                z->bra = z->c; /* ], line 346 */
-                {   int ret = slice_del(z); /* delete, line 346 */
+                z->bra = z->c; /* ], line 344 */
+                {   int ret = slice_del(z); /* delete, line 344 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 346 */
-                    z->ket = z->c; /* [, line 346 */
-                    {   int ret = r_mark_lAr(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab14; } /* call mark_lAr, line 346 */
+                {   int m9 = z->l - z->c; (void)m9; /* try, line 344 */
+                    z->ket = z->c; /* [, line 344 */
+                    {   int ret = r_mark_lAr(z); /* call mark_lAr, line 344 */
+                        if (ret == 0) { z->c = z->l - m9; goto lab14; }
                         if (ret < 0) return ret;
                     }
-                    z->bra = z->c; /* ], line 346 */
-                    {   int ret = slice_del(z); /* delete, line 346 */
+                    z->bra = z->c; /* ], line 344 */
+                    {   int ret = slice_del(z); /* delete, line 344 */
                         if (ret < 0) return ret;
                     }
-                    {   int ret = r_stem_suffix_chain_before_ki(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab14; } /* call stem_suffix_chain_before_ki, line 346 */
+                    {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 344 */
+                        if (ret == 0) { z->c = z->l - m9; goto lab14; }
                         if (ret < 0) return ret;
                     }
                 lab14:
@@ -1367,9 +1285,9 @@ static int r_stem_suffix_chain_before_ki(struct SN_env * z) {
                 }
                 goto lab9;
             lab11:
-                z->c = z->l - m3;
-                {   int ret = r_stem_suffix_chain_before_ki(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab8; } /* call stem_suffix_chain_before_ki, line 348 */
+                z->c = z->l - m7;
+                {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 346 */
+                    if (ret == 0) { z->c = z->l - m6; goto lab8; }
                     if (ret < 0) return ret;
                 }
             }
@@ -1380,42 +1298,41 @@ static int r_stem_suffix_chain_before_ki(struct SN_env * z) {
         goto lab0;
     lab7:
         z->c = z->l - m1;
-        {   int ret = r_mark_ndA(z);
-            if (ret == 0) return 0; /* call mark_ndA, line 351 */
-            if (ret < 0) return ret;
+        {   int ret = r_mark_ndA(z); /* call mark_ndA, line 349 */
+            if (ret <= 0) return ret;
         }
-        {   int m5 = z->l - z->c; (void)m5; /* or, line 353 */
-            {   int ret = r_mark_lArI(z);
-                if (ret == 0) goto lab16; /* call mark_lArI, line 352 */
+        {   int m10 = z->l - z->c; (void)m10; /* or, line 351 */
+            {   int ret = r_mark_lArI(z); /* call mark_lArI, line 350 */
+                if (ret == 0) goto lab16;
+                if (ret < 0) return ret;
+            }
+            z->bra = z->c; /* ], line 350 */
+            {   int ret = slice_del(z); /* delete, line 350 */
+                if (ret < 0) return ret;
+            }
+            goto lab15;
+        lab16:
+            z->c = z->l - m10;
+            {   int ret = r_mark_sU(z); /* call mark_sU, line 352 */
+                if (ret == 0) goto lab17;
                 if (ret < 0) return ret;
             }
             z->bra = z->c; /* ], line 352 */
             {   int ret = slice_del(z); /* delete, line 352 */
                 if (ret < 0) return ret;
             }
-            goto lab15;
-        lab16:
-            z->c = z->l - m5;
-            {   int ret = r_mark_sU(z);
-                if (ret == 0) goto lab17; /* call mark_sU, line 354 */
-                if (ret < 0) return ret;
-            }
-            z->bra = z->c; /* ], line 354 */
-            {   int ret = slice_del(z); /* delete, line 354 */
-                if (ret < 0) return ret;
-            }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 354 */
-                z->ket = z->c; /* [, line 354 */
-                {   int ret = r_mark_lAr(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab18; } /* call mark_lAr, line 354 */
+            {   int m11 = z->l - z->c; (void)m11; /* try, line 352 */
+                z->ket = z->c; /* [, line 352 */
+                {   int ret = r_mark_lAr(z); /* call mark_lAr, line 352 */
+                    if (ret == 0) { z->c = z->l - m11; goto lab18; }
                     if (ret < 0) return ret;
                 }
-                z->bra = z->c; /* ], line 354 */
-                {   int ret = slice_del(z); /* delete, line 354 */
+                z->bra = z->c; /* ], line 352 */
+                {   int ret = slice_del(z); /* delete, line 352 */
                     if (ret < 0) return ret;
                 }
-                {   int ret = r_stem_suffix_chain_before_ki(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab18; } /* call stem_suffix_chain_before_ki, line 354 */
+                {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 352 */
+                    if (ret == 0) { z->c = z->l - m11; goto lab18; }
                     if (ret < 0) return ret;
                 }
             lab18:
@@ -1423,10 +1340,9 @@ static int r_stem_suffix_chain_before_ki(struct SN_env * z) {
             }
             goto lab15;
         lab17:
-            z->c = z->l - m5;
-            {   int ret = r_stem_suffix_chain_before_ki(z);
-                if (ret == 0) return 0; /* call stem_suffix_chain_before_ki, line 356 */
-                if (ret < 0) return ret;
+            z->c = z->l - m10;
+            {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 354 */
+                if (ret <= 0) return ret;
             }
         }
     lab15:
@@ -1436,101 +1352,101 @@ lab0:
     return 1;
 }
 
-static int r_stem_noun_suffixes(struct SN_env * z) {
-    {   int m1 = z->l - z->c; (void)m1; /* or, line 363 */
+static int r_stem_noun_suffixes(struct SN_env * z) { /* backwardmode */
+    {   int m1 = z->l - z->c; (void)m1; /* or, line 361 */
+        z->ket = z->c; /* [, line 360 */
+        {   int ret = r_mark_lAr(z); /* call mark_lAr, line 360 */
+            if (ret == 0) goto lab1;
+            if (ret < 0) return ret;
+        }
+        z->bra = z->c; /* ], line 360 */
+        {   int ret = slice_del(z); /* delete, line 360 */
+            if (ret < 0) return ret;
+        }
+        {   int m2 = z->l - z->c; (void)m2; /* try, line 360 */
+            {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 360 */
+                if (ret == 0) { z->c = z->l - m2; goto lab2; }
+                if (ret < 0) return ret;
+            }
+        lab2:
+            ;
+        }
+        goto lab0;
+    lab1:
+        z->c = z->l - m1;
         z->ket = z->c; /* [, line 362 */
-        {   int ret = r_mark_lAr(z);
-            if (ret == 0) goto lab1; /* call mark_lAr, line 362 */
+        {   int ret = r_mark_ncA(z); /* call mark_ncA, line 362 */
+            if (ret == 0) goto lab3;
             if (ret < 0) return ret;
         }
         z->bra = z->c; /* ], line 362 */
         {   int ret = slice_del(z); /* delete, line 362 */
             if (ret < 0) return ret;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 362 */
-            {   int ret = r_stem_suffix_chain_before_ki(z);
-                if (ret == 0) { z->c = z->l - m_keep; goto lab2; } /* call stem_suffix_chain_before_ki, line 362 */
-                if (ret < 0) return ret;
-            }
-        lab2:
-            ;
-        }
-        goto lab0;
-    lab1:
-        z->c = z->l - m1;
-        z->ket = z->c; /* [, line 364 */
-        {   int ret = r_mark_ncA(z);
-            if (ret == 0) goto lab3; /* call mark_ncA, line 364 */
-            if (ret < 0) return ret;
-        }
-        z->bra = z->c; /* ], line 364 */
-        {   int ret = slice_del(z); /* delete, line 364 */
-            if (ret < 0) return ret;
-        }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 365 */
-            {   int m2 = z->l - z->c; (void)m2; /* or, line 367 */
+        {   int m3 = z->l - z->c; (void)m3; /* try, line 363 */
+            {   int m4 = z->l - z->c; (void)m4; /* or, line 365 */
+                z->ket = z->c; /* [, line 364 */
+                {   int ret = r_mark_lArI(z); /* call mark_lArI, line 364 */
+                    if (ret == 0) goto lab6;
+                    if (ret < 0) return ret;
+                }
+                z->bra = z->c; /* ], line 364 */
+                {   int ret = slice_del(z); /* delete, line 364 */
+                    if (ret < 0) return ret;
+                }
+                goto lab5;
+            lab6:
+                z->c = z->l - m4;
                 z->ket = z->c; /* [, line 366 */
-                {   int ret = r_mark_lArI(z);
-                    if (ret == 0) goto lab6; /* call mark_lArI, line 366 */
-                    if (ret < 0) return ret;
+                {   int m5 = z->l - z->c; (void)m5; /* or, line 366 */
+                    {   int ret = r_mark_possessives(z); /* call mark_possessives, line 366 */
+                        if (ret == 0) goto lab9;
+                        if (ret < 0) return ret;
+                    }
+                    goto lab8;
+                lab9:
+                    z->c = z->l - m5;
+                    {   int ret = r_mark_sU(z); /* call mark_sU, line 366 */
+                        if (ret == 0) goto lab7;
+                        if (ret < 0) return ret;
+                    }
                 }
+            lab8:
                 z->bra = z->c; /* ], line 366 */
                 {   int ret = slice_del(z); /* delete, line 366 */
                     if (ret < 0) return ret;
                 }
+                {   int m6 = z->l - z->c; (void)m6; /* try, line 366 */
+                    z->ket = z->c; /* [, line 366 */
+                    {   int ret = r_mark_lAr(z); /* call mark_lAr, line 366 */
+                        if (ret == 0) { z->c = z->l - m6; goto lab10; }
+                        if (ret < 0) return ret;
+                    }
+                    z->bra = z->c; /* ], line 366 */
+                    {   int ret = slice_del(z); /* delete, line 366 */
+                        if (ret < 0) return ret;
+                    }
+                    {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 366 */
+                        if (ret == 0) { z->c = z->l - m6; goto lab10; }
+                        if (ret < 0) return ret;
+                    }
+                lab10:
+                    ;
+                }
                 goto lab5;
-            lab6:
-                z->c = z->l - m2;
+            lab7:
+                z->c = z->l - m4;
                 z->ket = z->c; /* [, line 368 */
-                {   int m3 = z->l - z->c; (void)m3; /* or, line 368 */
-                    {   int ret = r_mark_possessives(z);
-                        if (ret == 0) goto lab9; /* call mark_possessives, line 368 */
-                        if (ret < 0) return ret;
-                    }
-                    goto lab8;
-                lab9:
-                    z->c = z->l - m3;
-                    {   int ret = r_mark_sU(z);
-                        if (ret == 0) goto lab7; /* call mark_sU, line 368 */
-                        if (ret < 0) return ret;
-                    }
+                {   int ret = r_mark_lAr(z); /* call mark_lAr, line 368 */
+                    if (ret == 0) { z->c = z->l - m3; goto lab4; }
+                    if (ret < 0) return ret;
                 }
-            lab8:
                 z->bra = z->c; /* ], line 368 */
                 {   int ret = slice_del(z); /* delete, line 368 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 368 */
-                    z->ket = z->c; /* [, line 368 */
-                    {   int ret = r_mark_lAr(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab10; } /* call mark_lAr, line 368 */
-                        if (ret < 0) return ret;
-                    }
-                    z->bra = z->c; /* ], line 368 */
-                    {   int ret = slice_del(z); /* delete, line 368 */
-                        if (ret < 0) return ret;
-                    }
-                    {   int ret = r_stem_suffix_chain_before_ki(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab10; } /* call stem_suffix_chain_before_ki, line 368 */
-                        if (ret < 0) return ret;
-                    }
-                lab10:
-                    ;
-                }
-                goto lab5;
-            lab7:
-                z->c = z->l - m2;
-                z->ket = z->c; /* [, line 370 */
-                {   int ret = r_mark_lAr(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab4; } /* call mark_lAr, line 370 */
-                    if (ret < 0) return ret;
-                }
-                z->bra = z->c; /* ], line 370 */
-                {   int ret = slice_del(z); /* delete, line 370 */
-                    if (ret < 0) return ret;
-                }
-                {   int ret = r_stem_suffix_chain_before_ki(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab4; } /* call stem_suffix_chain_before_ki, line 370 */
+                {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 368 */
+                    if (ret == 0) { z->c = z->l - m3; goto lab4; }
                     if (ret < 0) return ret;
                 }
             }
@@ -1541,53 +1457,53 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
         goto lab0;
     lab3:
         z->c = z->l - m1;
-        z->ket = z->c; /* [, line 374 */
-        {   int m4 = z->l - z->c; (void)m4; /* or, line 374 */
-            {   int ret = r_mark_ndA(z);
-                if (ret == 0) goto lab13; /* call mark_ndA, line 374 */
+        z->ket = z->c; /* [, line 372 */
+        {   int m7 = z->l - z->c; (void)m7; /* or, line 372 */
+            {   int ret = r_mark_ndA(z); /* call mark_ndA, line 372 */
+                if (ret == 0) goto lab13;
                 if (ret < 0) return ret;
             }
             goto lab12;
         lab13:
-            z->c = z->l - m4;
-            {   int ret = r_mark_nA(z);
-                if (ret == 0) goto lab11; /* call mark_nA, line 374 */
+            z->c = z->l - m7;
+            {   int ret = r_mark_nA(z); /* call mark_nA, line 372 */
+                if (ret == 0) goto lab11;
                 if (ret < 0) return ret;
             }
         }
     lab12:
-        {   int m5 = z->l - z->c; (void)m5; /* or, line 377 */
-            {   int ret = r_mark_lArI(z);
-                if (ret == 0) goto lab15; /* call mark_lArI, line 376 */
+        {   int m8 = z->l - z->c; (void)m8; /* or, line 375 */
+            {   int ret = r_mark_lArI(z); /* call mark_lArI, line 374 */
+                if (ret == 0) goto lab15;
+                if (ret < 0) return ret;
+            }
+            z->bra = z->c; /* ], line 374 */
+            {   int ret = slice_del(z); /* delete, line 374 */
+                if (ret < 0) return ret;
+            }
+            goto lab14;
+        lab15:
+            z->c = z->l - m8;
+            {   int ret = r_mark_sU(z); /* call mark_sU, line 376 */
+                if (ret == 0) goto lab16;
                 if (ret < 0) return ret;
             }
             z->bra = z->c; /* ], line 376 */
             {   int ret = slice_del(z); /* delete, line 376 */
                 if (ret < 0) return ret;
             }
-            goto lab14;
-        lab15:
-            z->c = z->l - m5;
-            {   int ret = r_mark_sU(z);
-                if (ret == 0) goto lab16; /* call mark_sU, line 378 */
-                if (ret < 0) return ret;
-            }
-            z->bra = z->c; /* ], line 378 */
-            {   int ret = slice_del(z); /* delete, line 378 */
-                if (ret < 0) return ret;
-            }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 378 */
-                z->ket = z->c; /* [, line 378 */
-                {   int ret = r_mark_lAr(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab17; } /* call mark_lAr, line 378 */
+            {   int m9 = z->l - z->c; (void)m9; /* try, line 376 */
+                z->ket = z->c; /* [, line 376 */
+                {   int ret = r_mark_lAr(z); /* call mark_lAr, line 376 */
+                    if (ret == 0) { z->c = z->l - m9; goto lab17; }
                     if (ret < 0) return ret;
                 }
-                z->bra = z->c; /* ], line 378 */
-                {   int ret = slice_del(z); /* delete, line 378 */
+                z->bra = z->c; /* ], line 376 */
+                {   int ret = slice_del(z); /* delete, line 376 */
                     if (ret < 0) return ret;
                 }
-                {   int ret = r_stem_suffix_chain_before_ki(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab17; } /* call stem_suffix_chain_before_ki, line 378 */
+                {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 376 */
+                    if (ret == 0) { z->c = z->l - m9; goto lab17; }
                     if (ret < 0) return ret;
                 }
             lab17:
@@ -1595,9 +1511,9 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
             }
             goto lab14;
         lab16:
-            z->c = z->l - m5;
-            {   int ret = r_stem_suffix_chain_before_ki(z);
-                if (ret == 0) goto lab11; /* call stem_suffix_chain_before_ki, line 380 */
+            z->c = z->l - m8;
+            {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 378 */
+                if (ret == 0) goto lab11;
                 if (ret < 0) return ret;
             }
         }
@@ -1605,42 +1521,42 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
         goto lab0;
     lab11:
         z->c = z->l - m1;
-        z->ket = z->c; /* [, line 384 */
-        {   int m6 = z->l - z->c; (void)m6; /* or, line 384 */
-            {   int ret = r_mark_ndAn(z);
-                if (ret == 0) goto lab20; /* call mark_ndAn, line 384 */
+        z->ket = z->c; /* [, line 382 */
+        {   int m10 = z->l - z->c; (void)m10; /* or, line 382 */
+            {   int ret = r_mark_ndAn(z); /* call mark_ndAn, line 382 */
+                if (ret == 0) goto lab20;
                 if (ret < 0) return ret;
             }
             goto lab19;
         lab20:
-            z->c = z->l - m6;
-            {   int ret = r_mark_nU(z);
-                if (ret == 0) goto lab18; /* call mark_nU, line 384 */
+            z->c = z->l - m10;
+            {   int ret = r_mark_nU(z); /* call mark_nU, line 382 */
+                if (ret == 0) goto lab18;
                 if (ret < 0) return ret;
             }
         }
     lab19:
-        {   int m7 = z->l - z->c; (void)m7; /* or, line 384 */
-            {   int ret = r_mark_sU(z);
-                if (ret == 0) goto lab22; /* call mark_sU, line 384 */
+        {   int m11 = z->l - z->c; (void)m11; /* or, line 382 */
+            {   int ret = r_mark_sU(z); /* call mark_sU, line 382 */
+                if (ret == 0) goto lab22;
                 if (ret < 0) return ret;
             }
-            z->bra = z->c; /* ], line 384 */
-            {   int ret = slice_del(z); /* delete, line 384 */
+            z->bra = z->c; /* ], line 382 */
+            {   int ret = slice_del(z); /* delete, line 382 */
                 if (ret < 0) return ret;
             }
-            {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 384 */
-                z->ket = z->c; /* [, line 384 */
-                {   int ret = r_mark_lAr(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab23; } /* call mark_lAr, line 384 */
+            {   int m12 = z->l - z->c; (void)m12; /* try, line 382 */
+                z->ket = z->c; /* [, line 382 */
+                {   int ret = r_mark_lAr(z); /* call mark_lAr, line 382 */
+                    if (ret == 0) { z->c = z->l - m12; goto lab23; }
                     if (ret < 0) return ret;
                 }
-                z->bra = z->c; /* ], line 384 */
-                {   int ret = slice_del(z); /* delete, line 384 */
+                z->bra = z->c; /* ], line 382 */
+                {   int ret = slice_del(z); /* delete, line 382 */
                     if (ret < 0) return ret;
                 }
-                {   int ret = r_stem_suffix_chain_before_ki(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab23; } /* call stem_suffix_chain_before_ki, line 384 */
+                {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 382 */
+                    if (ret == 0) { z->c = z->l - m12; goto lab23; }
                     if (ret < 0) return ret;
                 }
             lab23:
@@ -1648,9 +1564,9 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
             }
             goto lab21;
         lab22:
-            z->c = z->l - m7;
-            {   int ret = r_mark_lArI(z);
-                if (ret == 0) goto lab18; /* call mark_lArI, line 384 */
+            z->c = z->l - m11;
+            {   int ret = r_mark_lArI(z); /* call mark_lArI, line 382 */
+                if (ret == 0) goto lab18;
                 if (ret < 0) return ret;
             }
         }
@@ -1658,38 +1574,38 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
         goto lab0;
     lab18:
         z->c = z->l - m1;
-        z->ket = z->c; /* [, line 386 */
-        {   int ret = r_mark_DAn(z);
-            if (ret == 0) goto lab24; /* call mark_DAn, line 386 */
+        z->ket = z->c; /* [, line 384 */
+        {   int ret = r_mark_DAn(z); /* call mark_DAn, line 384 */
+            if (ret == 0) goto lab24;
             if (ret < 0) return ret;
         }
-        z->bra = z->c; /* ], line 386 */
-        {   int ret = slice_del(z); /* delete, line 386 */
+        z->bra = z->c; /* ], line 384 */
+        {   int ret = slice_del(z); /* delete, line 384 */
             if (ret < 0) return ret;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 386 */
-            z->ket = z->c; /* [, line 386 */
-            {   int m8 = z->l - z->c; (void)m8; /* or, line 389 */
-                {   int ret = r_mark_possessives(z);
-                    if (ret == 0) goto lab27; /* call mark_possessives, line 388 */
+        {   int m13 = z->l - z->c; (void)m13; /* try, line 384 */
+            z->ket = z->c; /* [, line 384 */
+            {   int m14 = z->l - z->c; (void)m14; /* or, line 387 */
+                {   int ret = r_mark_possessives(z); /* call mark_possessives, line 386 */
+                    if (ret == 0) goto lab27;
                     if (ret < 0) return ret;
                 }
-                z->bra = z->c; /* ], line 388 */
-                {   int ret = slice_del(z); /* delete, line 388 */
+                z->bra = z->c; /* ], line 386 */
+                {   int ret = slice_del(z); /* delete, line 386 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 388 */
-                    z->ket = z->c; /* [, line 388 */
-                    {   int ret = r_mark_lAr(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab28; } /* call mark_lAr, line 388 */
+                {   int m15 = z->l - z->c; (void)m15; /* try, line 386 */
+                    z->ket = z->c; /* [, line 386 */
+                    {   int ret = r_mark_lAr(z); /* call mark_lAr, line 386 */
+                        if (ret == 0) { z->c = z->l - m15; goto lab28; }
                         if (ret < 0) return ret;
                     }
-                    z->bra = z->c; /* ], line 388 */
-                    {   int ret = slice_del(z); /* delete, line 388 */
+                    z->bra = z->c; /* ], line 386 */
+                    {   int ret = slice_del(z); /* delete, line 386 */
                         if (ret < 0) return ret;
                     }
-                    {   int ret = r_stem_suffix_chain_before_ki(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab28; } /* call stem_suffix_chain_before_ki, line 388 */
+                    {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 386 */
+                        if (ret == 0) { z->c = z->l - m15; goto lab28; }
                         if (ret < 0) return ret;
                     }
                 lab28:
@@ -1697,18 +1613,18 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
                 }
                 goto lab26;
             lab27:
-                z->c = z->l - m8;
-                {   int ret = r_mark_lAr(z);
-                    if (ret == 0) goto lab29; /* call mark_lAr, line 390 */
+                z->c = z->l - m14;
+                {   int ret = r_mark_lAr(z); /* call mark_lAr, line 388 */
+                    if (ret == 0) goto lab29;
                     if (ret < 0) return ret;
                 }
-                z->bra = z->c; /* ], line 390 */
-                {   int ret = slice_del(z); /* delete, line 390 */
+                z->bra = z->c; /* ], line 388 */
+                {   int ret = slice_del(z); /* delete, line 388 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 390 */
-                    {   int ret = r_stem_suffix_chain_before_ki(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab30; } /* call stem_suffix_chain_before_ki, line 390 */
+                {   int m16 = z->l - z->c; (void)m16; /* try, line 388 */
+                    {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 388 */
+                        if (ret == 0) { z->c = z->l - m16; goto lab30; }
                         if (ret < 0) return ret;
                     }
                 lab30:
@@ -1716,9 +1632,9 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
                 }
                 goto lab26;
             lab29:
-                z->c = z->l - m8;
-                {   int ret = r_stem_suffix_chain_before_ki(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab25; } /* call stem_suffix_chain_before_ki, line 392 */
+                z->c = z->l - m14;
+                {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 390 */
+                    if (ret == 0) { z->c = z->l - m13; goto lab25; }
                     if (ret < 0) return ret;
                 }
             }
@@ -1729,74 +1645,74 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
         goto lab0;
     lab24:
         z->c = z->l - m1;
-        z->ket = z->c; /* [, line 396 */
-        {   int m9 = z->l - z->c; (void)m9; /* or, line 396 */
-            {   int ret = r_mark_nUn(z);
-                if (ret == 0) goto lab33; /* call mark_nUn, line 396 */
+        z->ket = z->c; /* [, line 394 */
+        {   int m17 = z->l - z->c; (void)m17; /* or, line 394 */
+            {   int ret = r_mark_nUn(z); /* call mark_nUn, line 394 */
+                if (ret == 0) goto lab33;
                 if (ret < 0) return ret;
             }
             goto lab32;
         lab33:
-            z->c = z->l - m9;
-            {   int ret = r_mark_ylA(z);
-                if (ret == 0) goto lab31; /* call mark_ylA, line 396 */
+            z->c = z->l - m17;
+            {   int ret = r_mark_ylA(z); /* call mark_ylA, line 394 */
+                if (ret == 0) goto lab31;
                 if (ret < 0) return ret;
             }
         }
     lab32:
-        z->bra = z->c; /* ], line 396 */
-        {   int ret = slice_del(z); /* delete, line 396 */
+        z->bra = z->c; /* ], line 394 */
+        {   int ret = slice_del(z); /* delete, line 394 */
             if (ret < 0) return ret;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 397 */
-            {   int m10 = z->l - z->c; (void)m10; /* or, line 399 */
-                z->ket = z->c; /* [, line 398 */
-                {   int ret = r_mark_lAr(z);
-                    if (ret == 0) goto lab36; /* call mark_lAr, line 398 */
+        {   int m18 = z->l - z->c; (void)m18; /* try, line 395 */
+            {   int m19 = z->l - z->c; (void)m19; /* or, line 397 */
+                z->ket = z->c; /* [, line 396 */
+                {   int ret = r_mark_lAr(z); /* call mark_lAr, line 396 */
+                    if (ret == 0) goto lab36;
                     if (ret < 0) return ret;
                 }
-                z->bra = z->c; /* ], line 398 */
-                {   int ret = slice_del(z); /* delete, line 398 */
+                z->bra = z->c; /* ], line 396 */
+                {   int ret = slice_del(z); /* delete, line 396 */
                     if (ret < 0) return ret;
                 }
-                {   int ret = r_stem_suffix_chain_before_ki(z);
-                    if (ret == 0) goto lab36; /* call stem_suffix_chain_before_ki, line 398 */
+                {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 396 */
+                    if (ret == 0) goto lab36;
                     if (ret < 0) return ret;
                 }
                 goto lab35;
             lab36:
-                z->c = z->l - m10;
-                z->ket = z->c; /* [, line 400 */
-                {   int m11 = z->l - z->c; (void)m11; /* or, line 400 */
-                    {   int ret = r_mark_possessives(z);
-                        if (ret == 0) goto lab39; /* call mark_possessives, line 400 */
+                z->c = z->l - m19;
+                z->ket = z->c; /* [, line 398 */
+                {   int m20 = z->l - z->c; (void)m20; /* or, line 398 */
+                    {   int ret = r_mark_possessives(z); /* call mark_possessives, line 398 */
+                        if (ret == 0) goto lab39;
                         if (ret < 0) return ret;
                     }
                     goto lab38;
                 lab39:
-                    z->c = z->l - m11;
-                    {   int ret = r_mark_sU(z);
-                        if (ret == 0) goto lab37; /* call mark_sU, line 400 */
+                    z->c = z->l - m20;
+                    {   int ret = r_mark_sU(z); /* call mark_sU, line 398 */
+                        if (ret == 0) goto lab37;
                         if (ret < 0) return ret;
                     }
                 }
             lab38:
-                z->bra = z->c; /* ], line 400 */
-                {   int ret = slice_del(z); /* delete, line 400 */
+                z->bra = z->c; /* ], line 398 */
+                {   int ret = slice_del(z); /* delete, line 398 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 400 */
-                    z->ket = z->c; /* [, line 400 */
-                    {   int ret = r_mark_lAr(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab40; } /* call mark_lAr, line 400 */
+                {   int m21 = z->l - z->c; (void)m21; /* try, line 398 */
+                    z->ket = z->c; /* [, line 398 */
+                    {   int ret = r_mark_lAr(z); /* call mark_lAr, line 398 */
+                        if (ret == 0) { z->c = z->l - m21; goto lab40; }
                         if (ret < 0) return ret;
                     }
-                    z->bra = z->c; /* ], line 400 */
-                    {   int ret = slice_del(z); /* delete, line 400 */
+                    z->bra = z->c; /* ], line 398 */
+                    {   int ret = slice_del(z); /* delete, line 398 */
                         if (ret < 0) return ret;
                     }
-                    {   int ret = r_stem_suffix_chain_before_ki(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab40; } /* call stem_suffix_chain_before_ki, line 400 */
+                    {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 398 */
+                        if (ret == 0) { z->c = z->l - m21; goto lab40; }
                         if (ret < 0) return ret;
                     }
                 lab40:
@@ -1804,9 +1720,9 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
                 }
                 goto lab35;
             lab37:
-                z->c = z->l - m10;
-                {   int ret = r_stem_suffix_chain_before_ki(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab34; } /* call stem_suffix_chain_before_ki, line 402 */
+                z->c = z->l - m19;
+                {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 400 */
+                    if (ret == 0) { z->c = z->l - m18; goto lab34; }
                     if (ret < 0) return ret;
                 }
             }
@@ -1817,66 +1733,66 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
         goto lab0;
     lab31:
         z->c = z->l - m1;
-        z->ket = z->c; /* [, line 406 */
-        {   int ret = r_mark_lArI(z);
-            if (ret == 0) goto lab41; /* call mark_lArI, line 406 */
+        z->ket = z->c; /* [, line 404 */
+        {   int ret = r_mark_lArI(z); /* call mark_lArI, line 404 */
+            if (ret == 0) goto lab41;
             if (ret < 0) return ret;
         }
-        z->bra = z->c; /* ], line 406 */
-        {   int ret = slice_del(z); /* delete, line 406 */
+        z->bra = z->c; /* ], line 404 */
+        {   int ret = slice_del(z); /* delete, line 404 */
             if (ret < 0) return ret;
         }
         goto lab0;
     lab41:
         z->c = z->l - m1;
-        {   int ret = r_stem_suffix_chain_before_ki(z);
-            if (ret == 0) goto lab42; /* call stem_suffix_chain_before_ki, line 408 */
+        {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 406 */
+            if (ret == 0) goto lab42;
             if (ret < 0) return ret;
         }
         goto lab0;
     lab42:
         z->c = z->l - m1;
-        z->ket = z->c; /* [, line 410 */
-        {   int m12 = z->l - z->c; (void)m12; /* or, line 410 */
-            {   int ret = r_mark_DA(z);
-                if (ret == 0) goto lab45; /* call mark_DA, line 410 */
+        z->ket = z->c; /* [, line 408 */
+        {   int m22 = z->l - z->c; (void)m22; /* or, line 408 */
+            {   int ret = r_mark_DA(z); /* call mark_DA, line 408 */
+                if (ret == 0) goto lab45;
                 if (ret < 0) return ret;
             }
             goto lab44;
         lab45:
-            z->c = z->l - m12;
-            {   int ret = r_mark_yU(z);
-                if (ret == 0) goto lab46; /* call mark_yU, line 410 */
+            z->c = z->l - m22;
+            {   int ret = r_mark_yU(z); /* call mark_yU, line 408 */
+                if (ret == 0) goto lab46;
                 if (ret < 0) return ret;
             }
             goto lab44;
         lab46:
-            z->c = z->l - m12;
-            {   int ret = r_mark_yA(z);
-                if (ret == 0) goto lab43; /* call mark_yA, line 410 */
+            z->c = z->l - m22;
+            {   int ret = r_mark_yA(z); /* call mark_yA, line 408 */
+                if (ret == 0) goto lab43;
                 if (ret < 0) return ret;
             }
         }
     lab44:
-        z->bra = z->c; /* ], line 410 */
-        {   int ret = slice_del(z); /* delete, line 410 */
+        z->bra = z->c; /* ], line 408 */
+        {   int ret = slice_del(z); /* delete, line 408 */
             if (ret < 0) return ret;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 410 */
-            z->ket = z->c; /* [, line 410 */
-            {   int m13 = z->l - z->c; (void)m13; /* or, line 410 */
-                {   int ret = r_mark_possessives(z);
-                    if (ret == 0) goto lab49; /* call mark_possessives, line 410 */
+        {   int m23 = z->l - z->c; (void)m23; /* try, line 408 */
+            z->ket = z->c; /* [, line 408 */
+            {   int m24 = z->l - z->c; (void)m24; /* or, line 408 */
+                {   int ret = r_mark_possessives(z); /* call mark_possessives, line 408 */
+                    if (ret == 0) goto lab49;
                     if (ret < 0) return ret;
                 }
-                z->bra = z->c; /* ], line 410 */
-                {   int ret = slice_del(z); /* delete, line 410 */
+                z->bra = z->c; /* ], line 408 */
+                {   int ret = slice_del(z); /* delete, line 408 */
                     if (ret < 0) return ret;
                 }
-                {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 410 */
-                    z->ket = z->c; /* [, line 410 */
-                    {   int ret = r_mark_lAr(z);
-                        if (ret == 0) { z->c = z->l - m_keep; goto lab50; } /* call mark_lAr, line 410 */
+                {   int m25 = z->l - z->c; (void)m25; /* try, line 408 */
+                    z->ket = z->c; /* [, line 408 */
+                    {   int ret = r_mark_lAr(z); /* call mark_lAr, line 408 */
+                        if (ret == 0) { z->c = z->l - m25; goto lab50; }
                         if (ret < 0) return ret;
                     }
                 lab50:
@@ -1884,20 +1800,20 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
                 }
                 goto lab48;
             lab49:
-                z->c = z->l - m13;
-                {   int ret = r_mark_lAr(z);
-                    if (ret == 0) { z->c = z->l - m_keep; goto lab47; } /* call mark_lAr, line 410 */
+                z->c = z->l - m24;
+                {   int ret = r_mark_lAr(z); /* call mark_lAr, line 408 */
+                    if (ret == 0) { z->c = z->l - m23; goto lab47; }
                     if (ret < 0) return ret;
                 }
             }
         lab48:
-            z->bra = z->c; /* ], line 410 */
-            {   int ret = slice_del(z); /* delete, line 410 */
+            z->bra = z->c; /* ], line 408 */
+            {   int ret = slice_del(z); /* delete, line 408 */
                 if (ret < 0) return ret;
             }
-            z->ket = z->c; /* [, line 410 */
-            {   int ret = r_stem_suffix_chain_before_ki(z);
-                if (ret == 0) { z->c = z->l - m_keep; goto lab47; } /* call stem_suffix_chain_before_ki, line 410 */
+            z->ket = z->c; /* [, line 408 */
+            {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 408 */
+                if (ret == 0) { z->c = z->l - m23; goto lab47; }
                 if (ret < 0) return ret;
             }
         lab47:
@@ -1906,37 +1822,36 @@ static int r_stem_noun_suffixes(struct SN_env * z) {
         goto lab0;
     lab43:
         z->c = z->l - m1;
-        z->ket = z->c; /* [, line 412 */
-        {   int m14 = z->l - z->c; (void)m14; /* or, line 412 */
-            {   int ret = r_mark_possessives(z);
-                if (ret == 0) goto lab52; /* call mark_possessives, line 412 */
+        z->ket = z->c; /* [, line 410 */
+        {   int m26 = z->l - z->c; (void)m26; /* or, line 410 */
+            {   int ret = r_mark_possessives(z); /* call mark_possessives, line 410 */
+                if (ret == 0) goto lab52;
                 if (ret < 0) return ret;
             }
             goto lab51;
         lab52:
-            z->c = z->l - m14;
-            {   int ret = r_mark_sU(z);
-                if (ret == 0) return 0; /* call mark_sU, line 412 */
-                if (ret < 0) return ret;
+            z->c = z->l - m26;
+            {   int ret = r_mark_sU(z); /* call mark_sU, line 410 */
+                if (ret <= 0) return ret;
             }
         }
     lab51:
-        z->bra = z->c; /* ], line 412 */
-        {   int ret = slice_del(z); /* delete, line 412 */
+        z->bra = z->c; /* ], line 410 */
+        {   int ret = slice_del(z); /* delete, line 410 */
             if (ret < 0) return ret;
         }
-        {   int m_keep = z->l - z->c;/* (void) m_keep;*/ /* try, line 412 */
-            z->ket = z->c; /* [, line 412 */
-            {   int ret = r_mark_lAr(z);
-                if (ret == 0) { z->c = z->l - m_keep; goto lab53; } /* call mark_lAr, line 412 */
+        {   int m27 = z->l - z->c; (void)m27; /* try, line 410 */
+            z->ket = z->c; /* [, line 410 */
+            {   int ret = r_mark_lAr(z); /* call mark_lAr, line 410 */
+                if (ret == 0) { z->c = z->l - m27; goto lab53; }
                 if (ret < 0) return ret;
             }
-            z->bra = z->c; /* ], line 412 */
-            {   int ret = slice_del(z); /* delete, line 412 */
+            z->bra = z->c; /* ], line 410 */
+            {   int ret = slice_del(z); /* delete, line 410 */
                 if (ret < 0) return ret;
             }
-            {   int ret = r_stem_suffix_chain_before_ki(z);
-                if (ret == 0) { z->c = z->l - m_keep; goto lab53; } /* call stem_suffix_chain_before_ki, line 412 */
+            {   int ret = r_stem_suffix_chain_before_ki(z); /* call stem_suffix_chain_before_ki, line 410 */
+                if (ret == 0) { z->c = z->l - m27; goto lab53; }
                 if (ret < 0) return ret;
             }
         lab53:
@@ -1947,31 +1862,30 @@ lab0:
     return 1;
 }
 
-static int r_post_process_last_consonants(struct SN_env * z) {
+static int r_post_process_last_consonants(struct SN_env * z) { /* backwardmode */
     int among_var;
-    z->ket = z->c; /* [, line 416 */
-    among_var = find_among_b(z, a_23, 4); /* substring, line 416 */
+    z->ket = z->c; /* [, line 414 */
+    among_var = find_among_b(z, a_23, 4); /* substring, line 414 */
     if (!(among_var)) return 0;
-    z->bra = z->c; /* ], line 416 */
-    switch(among_var) {
-        case 0: return 0;
+    z->bra = z->c; /* ], line 414 */
+    switch (among_var) { /* among, line 414 */
         case 1:
-            {   int ret = slice_from_s(z, 1, s_16); /* <-, line 417 */
+            {   int ret = slice_from_s(z, 1, s_5); /* <-, line 415 */
                 if (ret < 0) return ret;
             }
             break;
         case 2:
-            {   int ret = slice_from_s(z, 2, s_17); /* <-, line 418 */
+            {   int ret = slice_from_s(z, 2, s_6); /* <-, line 416 */
                 if (ret < 0) return ret;
             }
             break;
         case 3:
-            {   int ret = slice_from_s(z, 1, s_18); /* <-, line 419 */
+            {   int ret = slice_from_s(z, 1, s_7); /* <-, line 417 */
                 if (ret < 0) return ret;
             }
             break;
         case 4:
-            {   int ret = slice_from_s(z, 1, s_19); /* <-, line 420 */
+            {   int ret = slice_from_s(z, 1, s_8); /* <-, line 418 */
                 if (ret < 0) return ret;
             }
             break;
@@ -1979,94 +1893,109 @@ static int r_post_process_last_consonants(struct SN_env * z) {
     return 1;
 }
 
-static int r_append_U_to_stems_ending_with_d_or_g(struct SN_env * z) {
-    {   int m_test = z->l - z->c; /* test, line 431 */
-        {   int m1 = z->l - z->c; (void)m1; /* or, line 431 */
-            if (!(eq_s_b(z, 1, s_20))) goto lab1;
+static int r_append_U_to_stems_ending_with_d_or_g(struct SN_env * z) { /* backwardmode */
+    {   int m_test1 = z->l - z->c; /* test, line 429 */
+        {   int m2 = z->l - z->c; (void)m2; /* or, line 429 */
+            if (z->c <= z->lb || z->p[z->c - 1] != 'd') goto lab1; /* literal, line 429 */
+            z->c--;
             goto lab0;
         lab1:
-            z->c = z->l - m1;
-            if (!(eq_s_b(z, 1, s_21))) return 0;
+            z->c = z->l - m2;
+            if (z->c <= z->lb || z->p[z->c - 1] != 'g') return 0; /* literal, line 429 */
+            z->c--;
         }
     lab0:
-        z->c = z->l - m_test;
+        z->c = z->l - m_test1;
     }
-    {   int m2 = z->l - z->c; (void)m2; /* or, line 433 */
-        {   int m_test = z->l - z->c; /* test, line 432 */
-            if (out_grouping_b_U(z, g_vowel, 97, 305, 1) < 0) goto lab3; /* goto */ /* grouping vowel, line 432 */
-            {   int m3 = z->l - z->c; (void)m3; /* or, line 432 */
-                if (!(eq_s_b(z, 1, s_22))) goto lab5;
+    {   int m3 = z->l - z->c; (void)m3; /* or, line 431 */
+        {   int m_test4 = z->l - z->c; /* test, line 430 */
+            if (out_grouping_b_U(z, g_vowel, 97, 305, 1) < 0) goto lab3; /* goto */ /* grouping vowel, line 430 */
+            {   int m5 = z->l - z->c; (void)m5; /* or, line 430 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'a') goto lab5; /* literal, line 430 */
+                z->c--;
                 goto lab4;
             lab5:
-                z->c = z->l - m3;
-                if (!(eq_s_b(z, 2, s_23))) goto lab3;
+                z->c = z->l - m5;
+                if (!(eq_s_b(z, 2, s_9))) goto lab3; /* literal, line 430 */
             }
         lab4:
-            z->c = z->l - m_test;
+            z->c = z->l - m_test4;
         }
-        {   int c_keep = z->c;
-            int ret = insert_s(z, z->c, z->c, 2, s_24); /* <+, line 432 */
-            z->c = c_keep;
+        {   int ret;
+            {   int saved_c = z->c;
+                ret = insert_s(z, z->c, z->c, 2, s_10); /* <+, line 430 */
+                z->c = saved_c;
+            }
             if (ret < 0) return ret;
         }
         goto lab2;
     lab3:
-        z->c = z->l - m2;
-        {   int m_test = z->l - z->c; /* test, line 434 */
-            if (out_grouping_b_U(z, g_vowel, 97, 305, 1) < 0) goto lab6; /* goto */ /* grouping vowel, line 434 */
-            {   int m4 = z->l - z->c; (void)m4; /* or, line 434 */
-                if (!(eq_s_b(z, 1, s_25))) goto lab8;
+        z->c = z->l - m3;
+        {   int m_test6 = z->l - z->c; /* test, line 432 */
+            if (out_grouping_b_U(z, g_vowel, 97, 305, 1) < 0) goto lab6; /* goto */ /* grouping vowel, line 432 */
+            {   int m7 = z->l - z->c; (void)m7; /* or, line 432 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'e') goto lab8; /* literal, line 432 */
+                z->c--;
                 goto lab7;
             lab8:
-                z->c = z->l - m4;
-                if (!(eq_s_b(z, 1, s_26))) goto lab6;
+                z->c = z->l - m7;
+                if (z->c <= z->lb || z->p[z->c - 1] != 'i') goto lab6; /* literal, line 432 */
+                z->c--;
             }
         lab7:
-            z->c = z->l - m_test;
+            z->c = z->l - m_test6;
         }
-        {   int c_keep = z->c;
-            int ret = insert_s(z, z->c, z->c, 1, s_27); /* <+, line 434 */
-            z->c = c_keep;
+        {   int ret;
+            {   int saved_c = z->c;
+                ret = insert_s(z, z->c, z->c, 1, s_11); /* <+, line 432 */
+                z->c = saved_c;
+            }
             if (ret < 0) return ret;
         }
         goto lab2;
     lab6:
-        z->c = z->l - m2;
-        {   int m_test = z->l - z->c; /* test, line 436 */
-            if (out_grouping_b_U(z, g_vowel, 97, 305, 1) < 0) goto lab9; /* goto */ /* grouping vowel, line 436 */
-            {   int m5 = z->l - z->c; (void)m5; /* or, line 436 */
-                if (!(eq_s_b(z, 1, s_28))) goto lab11;
+        z->c = z->l - m3;
+        {   int m_test8 = z->l - z->c; /* test, line 434 */
+            if (out_grouping_b_U(z, g_vowel, 97, 305, 1) < 0) goto lab9; /* goto */ /* grouping vowel, line 434 */
+            {   int m9 = z->l - z->c; (void)m9; /* or, line 434 */
+                if (z->c <= z->lb || z->p[z->c - 1] != 'o') goto lab11; /* literal, line 434 */
+                z->c--;
                 goto lab10;
             lab11:
-                z->c = z->l - m5;
-                if (!(eq_s_b(z, 1, s_29))) goto lab9;
+                z->c = z->l - m9;
+                if (z->c <= z->lb || z->p[z->c - 1] != 'u') goto lab9; /* literal, line 434 */
+                z->c--;
             }
         lab10:
-            z->c = z->l - m_test;
+            z->c = z->l - m_test8;
         }
-        {   int c_keep = z->c;
-            int ret = insert_s(z, z->c, z->c, 1, s_30); /* <+, line 436 */
-            z->c = c_keep;
+        {   int ret;
+            {   int saved_c = z->c;
+                ret = insert_s(z, z->c, z->c, 1, s_12); /* <+, line 434 */
+                z->c = saved_c;
+            }
             if (ret < 0) return ret;
         }
         goto lab2;
     lab9:
-        z->c = z->l - m2;
-        {   int m_test = z->l - z->c; /* test, line 438 */
-            if (out_grouping_b_U(z, g_vowel, 97, 305, 1) < 0) return 0; /* goto */ /* grouping vowel, line 438 */
-            {   int m6 = z->l - z->c; (void)m6; /* or, line 438 */
-                if (!(eq_s_b(z, 2, s_31))) goto lab13;
+        z->c = z->l - m3;
+        {   int m_test10 = z->l - z->c; /* test, line 436 */
+            if (out_grouping_b_U(z, g_vowel, 97, 305, 1) < 0) return 0; /* goto */ /* grouping vowel, line 436 */
+            {   int m11 = z->l - z->c; (void)m11; /* or, line 436 */
+                if (!(eq_s_b(z, 2, s_13))) goto lab13; /* literal, line 436 */
                 goto lab12;
             lab13:
-                z->c = z->l - m6;
-                if (!(eq_s_b(z, 2, s_32))) return 0;
+                z->c = z->l - m11;
+                if (!(eq_s_b(z, 2, s_14))) return 0; /* literal, line 436 */
             }
         lab12:
-            z->c = z->l - m_test;
+            z->c = z->l - m_test10;
         }
-        {   int c_keep = z->c;
-            int ret = insert_s(z, z->c, z->c, 2, s_33); /* <+, line 438 */
-            z->c = c_keep;
+        {   int ret;
+            {   int saved_c = z->c;
+                ret = insert_s(z, z->c, z->c, 2, s_15); /* <+, line 436 */
+                z->c = saved_c;
+            }
             if (ret < 0) return ret;
         }
     }
@@ -2074,12 +2003,23 @@ lab2:
     return 1;
 }
 
-static int r_more_than_one_syllable_word(struct SN_env * z) {
-    {   int c_test = z->c; /* test, line 446 */
+static int r_is_reserved_word(struct SN_env * z) { /* backwardmode */
+    if (!(eq_s_b(z, 2, s_16))) return 0; /* literal, line 440 */
+    {   int m1 = z->l - z->c; (void)m1; /* try, line 440 */
+        if (!(eq_s_b(z, 3, s_17))) { z->c = z->l - m1; goto lab0; } /* literal, line 440 */
+    lab0:
+        ;
+    }
+    if (z->c > z->lb) return 0; /* atlimit, line 440 */
+    return 1;
+}
+
+static int r_more_than_one_syllable_word(struct SN_env * z) { /* forwardmode */
+    {   int c_test1 = z->c; /* test, line 447 */
         {   int i = 2;
-            while(1) { /* atleast, line 446 */
-                int c1 = z->c;
-                {    /* gopast */ /* grouping vowel, line 446 */
+            while(1) { /* atleast, line 447 */
+                int c2 = z->c;
+                {    /* gopast */ /* grouping vowel, line 447 */
                     int ret = out_grouping_U(z, g_vowel, 97, 305, 1);
                     if (ret < 0) goto lab0;
                     z->c += ret;
@@ -2087,77 +2027,39 @@ static int r_more_than_one_syllable_word(struct SN_env * z) {
                 i--;
                 continue;
             lab0:
-                z->c = c1;
+                z->c = c2;
                 break;
             }
             if (i > 0) return 0;
         }
-        z->c = c_test;
+        z->c = c_test1;
     }
     return 1;
 }
 
-static int r_is_reserved_word(struct SN_env * z) {
-    {   int c1 = z->c; /* or, line 451 */
-        {   int c_test = z->c; /* test, line 450 */
-            while(1) { /* gopast, line 450 */
-                if (!(eq_s(z, 2, s_34))) goto lab2;
-                break;
-            lab2:
-                {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
-                    if (ret < 0) goto lab1;
-                    z->c = ret; /* gopast, line 450 */
-                }
-            }
-            z->I[0] = 2;
-            if (!(z->I[0] == z->l)) goto lab1;
-            z->c = c_test;
-        }
-        goto lab0;
-    lab1:
-        z->c = c1;
-        {   int c_test = z->c; /* test, line 452 */
-            while(1) { /* gopast, line 452 */
-                if (!(eq_s(z, 5, s_35))) goto lab3;
-                break;
-            lab3:
-                {   int ret = skip_utf8(z->p, z->c, 0, z->l, 1);
-                    if (ret < 0) return 0;
-                    z->c = ret; /* gopast, line 452 */
-                }
-            }
-            z->I[0] = 5;
-            if (!(z->I[0] == z->l)) return 0;
-            z->c = c_test;
-        }
-    }
-lab0:
-    return 1;
-}
+static int r_postlude(struct SN_env * z) { /* forwardmode */
+    z->lb = z->c; z->c = z->l; /* backwards, line 451 */
 
-static int r_postlude(struct SN_env * z) {
-    {   int c1 = z->c; /* not, line 456 */
-        {   int ret = r_is_reserved_word(z);
-            if (ret == 0) goto lab0; /* call is_reserved_word, line 456 */
+    {   int m1 = z->l - z->c; (void)m1; /* not, line 452 */
+        {   int ret = r_is_reserved_word(z); /* call is_reserved_word, line 452 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
         return 0;
     lab0:
-        z->c = c1;
+        z->c = z->l - m1;
     }
-    z->lb = z->c; z->c = z->l; /* backwards, line 457 */
-
-    {   int m2 = z->l - z->c; (void)m2; /* do, line 458 */
-        {   int ret = r_append_U_to_stems_ending_with_d_or_g(z);
-            if (ret == 0) goto lab1; /* call append_U_to_stems_ending_with_d_or_g, line 458 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 453 */
+        {   int ret = r_append_U_to_stems_ending_with_d_or_g(z); /* call append_U_to_stems_ending_with_d_or_g, line 453 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
-    {   int m3 = z->l - z->c; (void)m3; /* do, line 459 */
-        {   int ret = r_post_process_last_consonants(z);
-            if (ret == 0) goto lab2; /* call post_process_last_consonants, line 459 */
+    {   int m3 = z->l - z->c; (void)m3; /* do, line 454 */
+        {   int ret = r_post_process_last_consonants(z); /* call post_process_last_consonants, line 454 */
+            if (ret == 0) goto lab2;
             if (ret < 0) return ret;
         }
     lab2:
@@ -2167,39 +2069,37 @@ static int r_postlude(struct SN_env * z) {
     return 1;
 }
 
-extern int turkish_UTF_8_stem(struct SN_env * z) {
-    {   int ret = r_more_than_one_syllable_word(z);
-        if (ret == 0) return 0; /* call more_than_one_syllable_word, line 465 */
-        if (ret < 0) return ret;
+extern int turkish_UTF_8_stem(struct SN_env * z) { /* forwardmode */
+    {   int ret = r_more_than_one_syllable_word(z); /* call more_than_one_syllable_word, line 460 */
+        if (ret <= 0) return ret;
     }
-    z->lb = z->c; z->c = z->l; /* backwards, line 467 */
+    z->lb = z->c; z->c = z->l; /* backwards, line 462 */
 
-    {   int m1 = z->l - z->c; (void)m1; /* do, line 468 */
-        {   int ret = r_stem_nominal_verb_suffixes(z);
-            if (ret == 0) goto lab0; /* call stem_nominal_verb_suffixes, line 468 */
+    {   int m1 = z->l - z->c; (void)m1; /* do, line 463 */
+        {   int ret = r_stem_nominal_verb_suffixes(z); /* call stem_nominal_verb_suffixes, line 463 */
+            if (ret == 0) goto lab0;
             if (ret < 0) return ret;
         }
     lab0:
         z->c = z->l - m1;
     }
-    if (!(z->B[0])) return 0; /* Boolean test continue_stemming_noun_suffixes, line 469 */
-    {   int m2 = z->l - z->c; (void)m2; /* do, line 470 */
-        {   int ret = r_stem_noun_suffixes(z);
-            if (ret == 0) goto lab1; /* call stem_noun_suffixes, line 470 */
+    if (!(z->B[0])) return 0; /* Boolean test continue_stemming_noun_suffixes, line 464 */
+    {   int m2 = z->l - z->c; (void)m2; /* do, line 465 */
+        {   int ret = r_stem_noun_suffixes(z); /* call stem_noun_suffixes, line 465 */
+            if (ret == 0) goto lab1;
             if (ret < 0) return ret;
         }
     lab1:
         z->c = z->l - m2;
     }
     z->c = z->lb;
-    {   int ret = r_postlude(z);
-        if (ret == 0) return 0; /* call postlude, line 473 */
-        if (ret < 0) return ret;
+    {   int ret = r_postlude(z); /* call postlude, line 468 */
+        if (ret <= 0) return ret;
     }
     return 1;
 }
 
-extern struct SN_env * turkish_UTF_8_create_env(void) { return SN_create_env(0, 1, 1); }
+extern struct SN_env * turkish_UTF_8_create_env(void) { return SN_create_env(0, 0, 1); }
 
 extern void turkish_UTF_8_close_env(struct SN_env * z) { SN_close_env(z, 0); }
 
diff --git a/src/backend/snowball/libstemmer/utilities.c b/src/backend/snowball/libstemmer/utilities.c
index 8c89af1cd5..920b8dbe6d 100644
--- a/src/backend/snowball/libstemmer/utilities.c
+++ b/src/backend/snowball/libstemmer/utilities.c
@@ -1,7 +1,5 @@
 #include "header.h"
 
-#define unless(C) if(!(C))
-
 #define CREATE_SIZE 1
 
 extern symbol * create_s(void) {
@@ -10,7 +8,7 @@ extern symbol * create_s(void) {
     if (mem == NULL) return NULL;
     p = (symbol *) (HEAD + (char *) mem);
     CAPACITY(p) = CREATE_SIZE;
-    SET_SIZE(p, CREATE_SIZE);
+    SET_SIZE(p, 0);
     return p;
 }
 
@@ -22,7 +20,7 @@ extern void lose_s(symbol * p) {
 /*
    new_p = 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.
+   position, or -1 on failure.
 
    -- used to implement hop and next in the utf8 case.
 */
@@ -85,14 +83,14 @@ static int get_b_utf8(const symbol * p, int c, int lb, int * slot) {
     if (b1 >= 0xC0 || c == lb) {   /* 1100 0000 */
         * slot = (b1 & 0x1F) << 6 | (b0 & 0x3F); return 2;
     }
-    * slot = (p[c] & 0xF) << 12 | (b1 & 0x3F) << 6 | (b0 & 0x3F); return 3;
+    * slot = (p[--c] & 0xF) << 12 | (b1 & 0x3F) << 6 | (b0 & 0x3F); return 3;
 }
 
 extern int in_grouping_U(struct SN_env * z, const unsigned char * s, int min, int max, int repeat) {
     do {
 	int ch;
 	int w = get_utf8(z->p, z->c, z->l, & ch);
-	unless (w) return -1;
+	if (!w) return -1;
 	if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
 	    return w;
 	z->c += w;
@@ -104,7 +102,7 @@ extern int in_grouping_b_U(struct SN_env * z, const unsigned char * s, int min,
     do {
 	int ch;
 	int w = get_b_utf8(z->p, z->c, z->lb, & ch);
-	unless (w) return -1;
+	if (!w) return -1;
 	if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
 	    return w;
 	z->c -= w;
@@ -116,8 +114,8 @@ extern int out_grouping_U(struct SN_env * z, const unsigned char * s, int min, i
     do {
 	int ch;
 	int w = get_utf8(z->p, z->c, z->l, & ch);
-	unless (w) return -1;
-	unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
+	if (!w) return -1;
+	if (!(ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0))
 	    return w;
 	z->c += w;
     } while (repeat);
@@ -128,8 +126,8 @@ extern int out_grouping_b_U(struct SN_env * z, const unsigned char * s, int min,
     do {
 	int ch;
 	int w = get_b_utf8(z->p, z->c, z->lb, & ch);
-	unless (w) return -1;
-	unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
+	if (!w) return -1;
+	if (!(ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0))
 	    return w;
 	z->c -= w;
     } while (repeat);
@@ -167,7 +165,7 @@ extern int out_grouping(struct SN_env * z, const unsigned char * s, int min, int
 	int ch;
 	if (z->c >= z->l) return -1;
 	ch = z->p[z->c];
-	unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
+	if (!(ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0))
 	    return 1;
 	z->c++;
     } while (repeat);
@@ -179,7 +177,7 @@ extern int out_grouping_b(struct SN_env * z, const unsigned char * s, int min, i
 	int ch;
 	if (z->c <= z->lb) return -1;
 	ch = z->p[z->c - 1];
-	unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0)
+	if (!(ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0))
 	    return 1;
 	z->c--;
     } while (repeat);
@@ -366,7 +364,7 @@ extern int replace_s(struct SN_env * z, int c_bra, int c_ket, int s_size, const
             if (z->c > c_bra)
                 z->c = c_bra;
     }
-    unless (s_size == 0) memmove(z->p + c_bra, s, s_size * sizeof(symbol));
+    if (s_size) memmove(z->p + c_bra, s, s_size * sizeof(symbol));
     if (adjptr != NULL)
         *adjptr = adjustment;
     return 0;
@@ -412,12 +410,7 @@ extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, const symbo
 }
 
 extern int insert_v(struct SN_env * z, int bra, int ket, const 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;
+    return insert_s(z, bra, ket, SIZE(p), p);
 }
 
 extern symbol * slice_to(struct SN_env * z, symbol * p) {
@@ -450,6 +443,16 @@ extern symbol * assign_to(struct SN_env * z, symbol * p) {
     return p;
 }
 
+extern int len_utf8(const symbol * p) {
+    int size = SIZE(p);
+    int len = 0;
+    while (size--) {
+        symbol b = *p++;
+        if (b >= 0xC0 || b < 0x80) ++len;
+    }
+    return len;
+}
+
 #if 0
 extern void debug(struct SN_env * z, int number, int line_count) {
     int i;
diff --git a/src/include/snowball/libstemmer/header.h b/src/include/snowball/libstemmer/header.h
index 4d3078f50f..6bccf0f2c7 100644
--- a/src/include/snowball/libstemmer/header.h
+++ b/src/include/snowball/libstemmer/header.h
@@ -54,5 +54,7 @@ extern int insert_v(struct SN_env * z, int bra, int ket, const symbol * p);
 extern symbol * slice_to(struct SN_env * z, symbol * p);
 extern symbol * assign_to(struct SN_env * z, symbol * p);
 
+extern int len_utf8(const symbol * p);
+
 extern void debug(struct SN_env * z, int number, int line_count);
 
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_danish.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_danish.h
index 49c5559cdf..57f16f8960 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_danish.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_danish.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_dutch.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_dutch.h
index e67d11152c..5423842969 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_dutch.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_dutch.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_english.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_english.h
index e685dcf7ef..d5a56a98f0 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_english.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_english.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_finnish.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_finnish.h
index c67b67b944..ba197d8a70 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_finnish.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_finnish.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_french.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_french.h
index 21244d6162..29321023a2 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_french.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_french.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_german.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_german.h
index 8525389227..0887ac8164 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_german.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_german.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_hungarian.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_hungarian.h
deleted file mode 100644
index c3177e5019..0000000000
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_hungarian.h
+++ /dev/null
@@ -1,16 +0,0 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern struct SN_env * hungarian_ISO_8859_1_create_env(void);
-extern void hungarian_ISO_8859_1_close_env(struct SN_env * z);
-
-extern int hungarian_ISO_8859_1_stem(struct SN_env * z);
-
-#ifdef __cplusplus
-}
-#endif
-
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_italian.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_italian.h
index dccbfd5e97..9e3fcf7f78 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_italian.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_italian.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_norwegian.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_norwegian.h
index e09e34e52f..424c8cd468 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_norwegian.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_norwegian.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_porter.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_porter.h
index 5c8fd01db1..99bc54ff0d 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_porter.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_porter.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_portuguese.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_portuguese.h
index 0279bc94da..e9abc0de5f 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_portuguese.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_portuguese.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_spanish.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_spanish.h
index 83f1498403..1e661aacfe 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_spanish.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_spanish.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_1_swedish.h b/src/include/snowball/libstemmer/stem_ISO_8859_1_swedish.h
index 4184e5ca39..5e6f6ac8af 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_1_swedish.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_1_swedish.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_2_hungarian.h b/src/include/snowball/libstemmer/stem_ISO_8859_2_hungarian.h
new file mode 100644
index 0000000000..c019a7d456
--- /dev/null
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_2_hungarian.h
@@ -0,0 +1,16 @@
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern struct SN_env * hungarian_ISO_8859_2_create_env(void);
+extern void hungarian_ISO_8859_2_close_env(struct SN_env * z);
+
+extern int hungarian_ISO_8859_2_stem(struct SN_env * z);
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/src/include/snowball/libstemmer/stem_ISO_8859_2_romanian.h b/src/include/snowball/libstemmer/stem_ISO_8859_2_romanian.h
index 931f269ceb..ef9bd3f3a4 100644
--- a/src/include/snowball/libstemmer/stem_ISO_8859_2_romanian.h
+++ b/src/include/snowball/libstemmer/stem_ISO_8859_2_romanian.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_KOI8_R_russian.h b/src/include/snowball/libstemmer/stem_KOI8_R_russian.h
index de2179d29f..cc58324c66 100644
--- a/src/include/snowball/libstemmer/stem_KOI8_R_russian.h
+++ b/src/include/snowball/libstemmer/stem_KOI8_R_russian.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_danish.h b/src/include/snowball/libstemmer/stem_UTF_8_danish.h
index ed744d454f..71f93155ed 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_danish.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_danish.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_dutch.h b/src/include/snowball/libstemmer/stem_UTF_8_dutch.h
index a99646452b..6af7d0adf3 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_dutch.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_dutch.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_english.h b/src/include/snowball/libstemmer/stem_UTF_8_english.h
index 619a8bc72a..d0ea10ef9f 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_english.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_english.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_finnish.h b/src/include/snowball/libstemmer/stem_UTF_8_finnish.h
index d2f2fd9638..7d07fbaf4a 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_finnish.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_finnish.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_french.h b/src/include/snowball/libstemmer/stem_UTF_8_french.h
index 08e341846d..b19139e538 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_french.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_french.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_german.h b/src/include/snowball/libstemmer/stem_UTF_8_german.h
index 5bd84d431f..2a95132e9f 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_german.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_german.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_hungarian.h b/src/include/snowball/libstemmer/stem_UTF_8_hungarian.h
index d81bd23469..d662a83635 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_hungarian.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_hungarian.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_italian.h b/src/include/snowball/libstemmer/stem_UTF_8_italian.h
index 3bee080d52..4177c3ebf8 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_italian.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_italian.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_norwegian.h b/src/include/snowball/libstemmer/stem_UTF_8_norwegian.h
index c75444bcd9..b155ebb718 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_norwegian.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_norwegian.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_porter.h b/src/include/snowball/libstemmer/stem_UTF_8_porter.h
index 82d469ac45..54efb6f130 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_porter.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_porter.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_portuguese.h b/src/include/snowball/libstemmer/stem_UTF_8_portuguese.h
index 9fe7f9aa81..68dc2554c3 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_portuguese.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_portuguese.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_romanian.h b/src/include/snowball/libstemmer/stem_UTF_8_romanian.h
index d01e8132e2..2cc1ad011d 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_romanian.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_romanian.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_russian.h b/src/include/snowball/libstemmer/stem_UTF_8_russian.h
index 4ef774ddcc..2bc621bff9 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_russian.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_russian.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_spanish.h b/src/include/snowball/libstemmer/stem_UTF_8_spanish.h
index 10572ecc37..075ba876ed 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_spanish.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_spanish.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_swedish.h b/src/include/snowball/libstemmer/stem_UTF_8_swedish.h
index 1444ebb49a..095623db80 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_swedish.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_swedish.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
diff --git a/src/include/snowball/libstemmer/stem_UTF_8_turkish.h b/src/include/snowball/libstemmer/stem_UTF_8_turkish.h
index 8173a17486..7d94a2f9ef 100644
--- a/src/include/snowball/libstemmer/stem_UTF_8_turkish.h
+++ b/src/include/snowball/libstemmer/stem_UTF_8_turkish.h
@@ -1,5 +1,5 @@
-
-/* This file was generated automatically by the Snowball to ANSI C compiler */
+/* This file was generated automatically by the Snowball to ISO C compiler */
+/* http://snowballstem.org/ */
 
 #ifdef __cplusplus
 extern "C" {
