[Zope-Checkins] CVS: Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/swedish - output.txt:1.1.2.1 stem.h:1.1.2.1 stem.sbl:1.1.2.1 stemmer.html:1.1.2.1 swedishstem.c:1.1.2.1 voc.txt:1.1.2.1

Andreas Jung andreas@digicool.com
Wed, 13 Feb 2002 11:26:29 -0500


Update of /cvs-repository/Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/swedish
In directory cvs.zope.org:/tmp/cvs-serv30556/PyStemmer/swedish

Added Files:
      Tag: ajung-textindexng-branch
	output.txt stem.h stem.sbl stemmer.html swedishstem.c voc.txt 
Log Message:
added PyStemmer


=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/swedish/output.txt === (30523/30623 lines abridged)
a
aael
aah
ab
abb
abborr
abborr
abborr
abborrpin
abc
abednego
abort
abraham
absint
abskon
absolut
ack
ackompanjer
ackord
acllerbring
acob
ad
adclc
adcl
addr
ade
adei
adel
adelc
adel
adel
ade
adeln
adelsdam
adelsfr”k
adelskalend
adelskalendr
adelskap
adelsman
adelsm„n
adelsvap
aderton
adertond
adertonhundratalet
adertonskilling
adjunk
adjunk
adjunktur
adj”
adl

[-=- -=- -=- 30523 lines omitted -=- -=- -=-]

”versk†d
”verst
”versteg
”verstel”jtnant
”verstel”jtnant
”verst
”verstinnan
”verstr”mm
”verstr”t
”versvall
”versvall
”versv„mm
”versv„mning
”vers„ttning
”vertag
”vertal
”vertal
”vertal
”vertr„ff
”vertvg
”vertvg
”vertyg
”vertyg
”vertyg
”vertyg
”vertyg
”vertyg
”vertyg
”vert„nk
”vervan
”verv
”vervik
”vervin
”vervin
”vervun
”vervun
”vervunnit
”verv„g
”verv„g
”verv„g
”verv„g
”verv„ld
”ver„ndakast
”ver„ndakast
”vning
”vning
”vr
”vr
”vr
”„nd


=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/swedish/stem.h ===

extern struct SN_env * swedish_create_env(void);
extern void swedish_close_env(struct SN_env * z);

extern int swedish_stem(struct SN_env * z);



=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/swedish/stem.sbl ===
routines (
           mark_regions
           main_suffix
           consonant_pair
           other_suffix
)

externals ( stem )

integers ( p1 )

groupings ( v s_ending )

stringescapes {}

/* special characters (in ISO Latin) */

stringdef a"   hex '84'
stringdef ao   hex '86'
stringdef o"   hex '94'

define v 'aeiouy{a"}{ao}{o"}'

define s_ending  'bcdfghjklmnoprtvy'

define mark_regions as (

    $p1 = limit

    goto v gopast non-v  setmark p1
    try ( $p1 < 3  $p1 = 3 )
)

backwardmode (

    define main_suffix as (
        setlimit tomark p1 for ([substring])
        among(

            'a' 'arna' 'erna' 'heterna' 'orna' 'ad' 'e' 'ade' 'ande' 'arne'
            'are' 'aste' 'en' 'anden' 'aren' 'heten' 'ern' 'ar' 'er' 'heter'
            'or' 'as' 'arnas' 'ernas' 'ornas' 'es' 'ades' 'andes' 'ens' 'arens'
            'hetens' 'erns' 'at' 'andet' 'het' 'ast'
                (delete)
            's'
                (s_ending delete)
        )
    )

    define consonant_pair as setlimit tomark p1 for (
        among('dd' 'gd' 'nn' 'dt' 'gt' 'kt' 'tt')
        and ([next] delete)
    )

    define other_suffix as setlimit tomark p1 for (
        [substring] among(
            'lig' 'ig' 'els' (delete)
            'l{o"}st'        (<-'l{o"}s')
            'fullt'          (<-'full')
        )
    )
)

define stem as (

    do mark_regions
    backwards (
        do main_suffix
        do consonant_pair
        do other_suffix
        )
)


=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/swedish/stemmer.html ===

<HTML>
<HEAD>
<TITLE>Swedish stemming algorith</TITLE></HEAD>
<BODY BGCOLOR=WHITE>
<TABLE WIDTH=75% ALIGN=CENTER COLS=1>
<H1 ALIGN=CENTER>Swedish stemming algorithm</H1>

<TR><TD>
<BR>&nbsp;<H2>Links to resources</H2>

<DL><DD><TABLE CELLPADDING=0>
<TR><TD><A HREF="stem.sbl">    The stemmer in Snowball</A>
<TR><TD><A HREF="stem.c">      The ANSI C stemmer</A>
<TR><TD><A HREF="stem.h">      - and its header</A>
<TR><TD><A HREF="voc.txt">     Sample Swedish vocabulary (ISO Latin codings)</A>
<TR><TD><A HREF="output.txt">  Its stemmed equivalent</A>
<TR><TD><A HREF="diffs.txt">   Vocabulary + stemmed equivalent in pure ASCII</A>
<TR><TD><A HREF="tarball.tgz"> Tar-gzipped file of all of the above</A>
</TABLE></DL>

<DL><DD><TABLE CELLPADDING=0>
<TR><TD><A HREF="../texts/scandinavian.html">
                  Scandinavian language stemmers</A>
</TABLE></DL>

</TR>

<TR><TD BGCOLOR="lightpink">

<BR><BR>

Here is a sample of Swedish vocabulary, with the stemmed forms that will
be generated with this algorithm.

<BR><BR>



<DL><DD><TABLE CELLPADDING=0>
<TR><TD>  <B>word</B> </TD>
 <TD></TD><TD> </TD>
 <TD></TD><TD> <B>stem</B> </TD>
 <TD></TD><TD>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
 <TD></TD><TD> <B>word</B> </TD>
 <TD></TD><TD> </TD>
 <TD></TD><TD> <B>stem</B> </TD>
</TR>

<TR><TD>
jakt<BR>
jaktb&ouml;ssa<BR>
jakten<BR>
jakthund<BR>
jaktkarl<BR>
jaktkarlar<BR>
jaktkarlarne<BR>
jaktkarlens<BR>
jaktl&ouml;jtnant<BR>
jaktl&ouml;jtnanten<BR>
jaktl&ouml;jtnantens<BR>
jalusi<BR>
jalusien<BR>
jalusier<BR>
jalusierna<BR>
jamaika<BR>
jamat<BR>
jamrande<BR>
jamt<BR>
jande<BR>
januari<BR>
japanska<BR>
jaquette<BR>
jaquettekappa<BR>
jargong<BR>
jasmin<BR>
jasminen<BR>
jasminer<BR>
jasminh&auml;ck<BR>
jaspis<BR>
jas&aring;<BR>
jav&auml;l<BR>
jazzvindens<BR>
jcrn<BR>
jcsus<BR>
je<BR>
jemf&ouml;ra<BR>
jemf&ouml;ras<BR>
jemf&ouml;relse<BR>
jemf&ouml;relser<BR>
</TD>
<TD></TD><TD> &nbsp;<TT><B> => </B></TT>&nbsp; </TD>
<TD></TD><TD>
jakt<BR>
jaktb&ouml;ss<BR>
jakt<BR>
jakthund<BR>
jaktkarl<BR>
jaktkarl<BR>
jaktkarl<BR>
jaktkarl<BR>
jaktl&ouml;jtnant<BR>
jaktl&ouml;jtnant<BR>
jaktl&ouml;jtnant<BR>
jalusi<BR>
jalusi<BR>
jalusi<BR>
jalusi<BR>
jamaik<BR>
jam<BR>
jamr<BR>
jamt<BR>
jand<BR>
januari<BR>
japansk<BR>
jaquet<BR>
jaquettekapp<BR>
jargong<BR>
jasmin<BR>
jasmin<BR>
jasmin<BR>
jasminh&auml;ck<BR>
jaspis<BR>
jas&aring;<BR>
jav&auml;l<BR>
jazzvind<BR>
jcrn<BR>
jcsus<BR>
je<BR>
jemf&ouml;r<BR>
jemf&ouml;r<BR>
jemf&ouml;r<BR>
jemf&ouml;r<BR>
</TD>
<TD></TD><TD> </TD>
<TD></TD><TD>
klo<BR>
kloaken<BR>
klock<BR>
klocka<BR>
klockan<BR>
klockans<BR>
klockare<BR>
klockaren<BR>
klockarens<BR>
klockarfar<BR>
klockarn<BR>
klockarsonen<BR>
klockas<BR>
klockkedjan<BR>
klocklikt<BR>
klockor<BR>
klockorna<BR>
klockornas<BR>
klockors<BR>
klockringning<BR>
kloekornas<BR>
klok<BR>
kloka<BR>
klokare<BR>
klokast<BR>
klokaste<BR>
kloke<BR>
klokhet<BR>
klokheten<BR>
klokt<BR>
kloliknande<BR>
klor<BR>
klorna<BR>
kloroform<BR>
kloster<BR>
klosterg&aring;rden<BR>
klosterlik<BR>
klot<BR>
klotb<BR>
klotrund<BR>
</TD>
<TD></TD><TD> &nbsp;<TT><B> => </B></TT>&nbsp; </TD>
<TD></TD><TD>
klo<BR>
kloak<BR>
klock<BR>
klock<BR>
klockan<BR>
klockan<BR>
klock<BR>
klock<BR>
klock<BR>
klockarf<BR>
klockarn<BR>
klockarson<BR>
klock<BR>
klockkedjan<BR>
klocklik<BR>
klock<BR>
klock<BR>
klock<BR>
klockor<BR>
klockringning<BR>
kloek<BR>
klok<BR>
klok<BR>
klok<BR>
klok<BR>
klok<BR>
klok<BR>
klok<BR>
klok<BR>
klokt<BR>
klolikn<BR>
klor<BR>
klorn<BR>
kloroform<BR>
klost<BR>
klosterg&aring;rd<BR>
klosterlik<BR>
klot<BR>
klotb<BR>
klotrund<BR>
</TD>
</TR>
</TABLE></DL>


</TR>

<TR><TD>

<BR><BR>
<BR>&nbsp;<H2>The stemming algorith</H2>


The Swedish alphabet includes the following additional letters,
<DL><DD>
    <B><I>&auml;  &nbsp;  &aring;  &nbsp;  &ouml;</I></B>
</DL>


The following letters are vowels:
<DL><DD>
    <B><I>a  &nbsp;  e  &nbsp;  i  &nbsp;  o  &nbsp;  u  &nbsp;  y  &nbsp;  &auml;  &nbsp;  &aring;  &nbsp;  &ouml;</I></B>
</DL>
<I>R</I>2 is not used: <I>R</I>1 is defined in the same way as in the
<A HREF="../german/stemmer.html">German stemmer</A>.
(See the <A HREF="../texts/r1r2.html"> note</A> on <I>R</I>1 and <I>R</I>2.)
<BR><BR>

Define a valid <B><I>s</I></B>-ending as one of
<DL><DD>
<B><I>b</I></B>  &nbsp;  <B><I>c</I></B>  &nbsp;  <B><I>d</I></B>  &nbsp;  <B><I>f</I></B>  &nbsp;  <B><I>g</I></B>  &nbsp;  <B><I>h</I></B>  &nbsp;  <B><I>j</I></B>  &nbsp;  <B><I>k</I></B>  &nbsp;
<B><I>l</I></B>  &nbsp;  <B><I>m</I></B>  &nbsp;  <B><I>n</I></B>  &nbsp;  <B><I>o</I></B>  &nbsp;  <B><I>p</I></B>  &nbsp;  <B><I>r</I></B>  &nbsp;  <B><I>t</I></B>  &nbsp;  <B><I>v</I></B>  &nbsp;
<B><I>y</I></B>
</DL>
Do each of steps 1, 2 and 3.
<BR><BR>
Step 1:
<DL><DD>
    Search for the longest among the following suffixes in <I>R</I>1, and
    perform the action indicated.
<BR><BR><DL>
        <DT>(<I>a</I>)
            <B><I>a  &nbsp;  arna  &nbsp;  erna  &nbsp;  heterna  &nbsp;  orna  &nbsp;  ad  &nbsp;  e  &nbsp;  ade  &nbsp;
            ande  &nbsp;  arne  &nbsp;  are  &nbsp;  aste  &nbsp;  en  &nbsp;  anden  &nbsp;  aren  &nbsp;  heten  &nbsp;
            ern  &nbsp;  ar  &nbsp;  er  &nbsp;  heter  &nbsp;  or  &nbsp;  as  &nbsp;  arnas  &nbsp;  ernas  &nbsp;
            ornas  &nbsp;  es  &nbsp;  ades  &nbsp;  andes  &nbsp;  ens  &nbsp;  arens  &nbsp;  hetens  &nbsp;  erns
             &nbsp;  at  &nbsp;  andet  &nbsp;  het  &nbsp;  ast</I></B>
                <DD>delete
<BR><BR>
        <DT>(<I>b</I>)
            <B><I>s</I></B>
                <DD>delete if preceded by a valid <B><I>s</I></B>-ending
</DL>
<BR>
    (Of course the letter of the valid <B><I>s</I></B>-ending is
    not necessarily in <I>R</I>1)
</DL>
Step 2:
<DL><DD>
    Search for one of the following suffixes in <I>R</I>1, and if found
    delete the last letter.
<BR><BR><DL><DD>
        <B><I>dd  &nbsp;  gd  &nbsp;  nn  &nbsp;  dt  &nbsp;  gt  &nbsp;  kt  &nbsp;  tt</I></B>
</DL>
<BR>
    (For example, <I>friskt</I> <TT>-&gt;</TT> <I>frisk</I>, <I>fr&ouml;knarnn</I> <TT>-&gt;</TT> <I>fr&ouml;knarn</I>)
</DL>

Step 3:
<DL><DD>
    Search for the longest among the following suffixes in <I>R</I>1, and
    perform the action indicated.
<BR><BR>
<DL>
    <DT><B><I>lig  &nbsp;  ig  &nbsp;  els</I></B>
        <DD>delete
<BR><BR>
    <DT><B><I>l&ouml;st</I></B>
        <DD>replace with <B><I>l&ouml;s</I></B>
<BR><BR>
    <DT><B><I>fullt</I></B>
        <DD>replace with <B><I>full</I></B>
</DL>
</DL>

</TR>

<TR><TD BGCOLOR="lightblue">

<BR>&nbsp;<H2>The same algorithm in Snowball</H2>

<FONT SIZE=-1><PRE>
<DL><DD>
routines (
           mark_regions
           main_suffix
           consonant_pair
           other_suffix
)

externals ( stem )

integers ( p1 )

groupings ( v s_ending )

stringescapes {}

/* special characters (in ISO Latin) */

stringdef a"   hex '84'
stringdef ao   hex '86'
stringdef o"   hex '94'

define v 'aeiouy{a"}{ao}{o"}'

define s_ending  'bcdfghjklmnoprtvy'

define mark_regions as (

    $p1 = limit

    goto v gopast non-v  setmark p1
    try ( $p1 < 3  $p1 = 3 )
)

backwardmode (

    define main_suffix as (
        setlimit tomark p1 for ([substring])
        among(

            'a' 'arna' 'erna' 'heterna' 'orna' 'ad' 'e' 'ade' 'ande' 'arne'
            'are' 'aste' 'en' 'anden' 'aren' 'heten' 'ern' 'ar' 'er' 'heter'
            'or' 'as' 'arnas' 'ernas' 'ornas' 'es' 'ades' 'andes' 'ens' 'arens'
            'hetens' 'erns' 'at' 'andet' 'het' 'ast'
                (delete)
            's'
                (s_ending delete)
        )
    )

    define consonant_pair as setlimit tomark p1 for (
        among('dd' 'gd' 'nn' 'dt' 'gt' 'kt' 'tt')
        and ([next] delete)
    )

    define other_suffix as setlimit tomark p1 for (
        [substring] among(
            'lig' 'ig' 'els' (delete)
            'l{o"}st'        (<-'l{o"}s')
            'fullt'          (<-'full')
        )
    )
)

define stem as (

    do mark_regions
    backwards (
        do main_suffix
        do consonant_pair
        do other_suffix
        )
)
</DL>
</PRE></FONT>
</TABLE>
</BODY>
</HTML>


=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/swedish/swedishstem.c ===

#include "header.h"

extern int swedish_stem(struct SN_env * z);
static int r_other_suffix(struct SN_env * z);
static int r_consonant_pair(struct SN_env * z);
static int r_main_suffix(struct SN_env * z);
static int r_mark_regions(struct SN_env * z);

static struct among a_0[37] =
{
/*  0 */ { 1, (byte *)"a", -1, 1, 0},
/*  1 */ { 4, (byte *)"arna", 0, 1, 0},
/*  2 */ { 4, (byte *)"erna", 0, 1, 0},
/*  3 */ { 7, (byte *)"heterna", 2, 1, 0},
/*  4 */ { 4, (byte *)"orna", 0, 1, 0},
/*  5 */ { 2, (byte *)"ad", -1, 1, 0},
/*  6 */ { 1, (byte *)"e", -1, 1, 0},
/*  7 */ { 3, (byte *)"ade", 6, 1, 0},
/*  8 */ { 4, (byte *)"ande", 6, 1, 0},
/*  9 */ { 4, (byte *)"arne", 6, 1, 0},
/* 10 */ { 3, (byte *)"are", 6, 1, 0},
/* 11 */ { 4, (byte *)"aste", 6, 1, 0},
/* 12 */ { 2, (byte *)"en", -1, 1, 0},
/* 13 */ { 5, (byte *)"anden", 12, 1, 0},
/* 14 */ { 4, (byte *)"aren", 12, 1, 0},
/* 15 */ { 5, (byte *)"heten", 12, 1, 0},
/* 16 */ { 3, (byte *)"ern", -1, 1, 0},
/* 17 */ { 2, (byte *)"ar", -1, 1, 0},
/* 18 */ { 2, (byte *)"er", -1, 1, 0},
/* 19 */ { 5, (byte *)"heter", 18, 1, 0},
/* 20 */ { 2, (byte *)"or", -1, 1, 0},
/* 21 */ { 1, (byte *)"s", -1, 2, 0},
/* 22 */ { 2, (byte *)"as", 21, 1, 0},
/* 23 */ { 5, (byte *)"arnas", 22, 1, 0},
/* 24 */ { 5, (byte *)"ernas", 22, 1, 0},
/* 25 */ { 5, (byte *)"ornas", 22, 1, 0},
/* 26 */ { 2, (byte *)"es", 21, 1, 0},
/* 27 */ { 4, (byte *)"ades", 26, 1, 0},
/* 28 */ { 5, (byte *)"andes", 26, 1, 0},
/* 29 */ { 3, (byte *)"ens", 21, 1, 0},
/* 30 */ { 5, (byte *)"arens", 29, 1, 0},
/* 31 */ { 6, (byte *)"hetens", 29, 1, 0},
/* 32 */ { 4, (byte *)"erns", 21, 1, 0},
/* 33 */ { 2, (byte *)"at", -1, 1, 0},
/* 34 */ { 5, (byte *)"andet", -1, 1, 0},
/* 35 */ { 3, (byte *)"het", -1, 1, 0},
/* 36 */ { 3, (byte *)"ast", -1, 1, 0}
};

static struct among a_1[7] =
{
/*  0 */ { 2, (byte *)"dd", -1, -1, 0},
/*  1 */ { 2, (byte *)"gd", -1, -1, 0},
/*  2 */ { 2, (byte *)"nn", -1, -1, 0},
/*  3 */ { 2, (byte *)"dt", -1, -1, 0},
/*  4 */ { 2, (byte *)"gt", -1, -1, 0},
/*  5 */ { 2, (byte *)"kt", -1, -1, 0},
/*  6 */ { 2, (byte *)"tt", -1, -1, 0}
};

static struct among a_2[5] =
{
/*  0 */ { 2, (byte *)"ig", -1, 1, 0},
/*  1 */ { 3, (byte *)"lig", 0, 1, 0},
/*  2 */ { 3, (byte *)"els", -1, 1, 0},
/*  3 */ { 5, (byte *)"fullt", -1, 3, 0},
/*  4 */ { 4, (byte *)"l\x94" "st", -1, 2, 0}
};


static byte g_v[] = { 17, 65, 16, 1, 40, 0, 8 };

static byte g_s_ending[] = { 119, 127, 149 };

static int r_mark_regions(struct SN_env * z) {
    z->I[0] = z->l;
    while(1) { /* goto, line 30 */
        int c = z->c;
        if (!(in_grouping(z, g_v, 97, 148))) goto lab0;
        z->c = c;
        break;
    lab0:
        z->c = c;
        if (z->c >= z->l) return 0;
        z->c++;
    }
    while(1) { /* gopast, line 30 */
        if (!(out_grouping(z, g_v, 97, 148))) goto lab1;
        break;
    lab1:
        if (z->c >= z->l) return 0;
        z->c++;
    }
    z->I[0] = z->c; /* setmark p1, line 30 */
     /* try, line 31 */
    if (!(z->I[0] < 3)) goto lab2;
    z->I[0] = 3;
lab2:
    return 1;
}

static int r_main_suffix(struct SN_env * z) {
    int among_var;
    {   int m = z->l - z->c; /* setlimit, line 37 */
        int m3;
        if (z->c < z->I[0]) return 0;
        z->c = z->I[0]; /* tomark, line 37 */
        m3 = z->lb; z->lb = z->c;
        z->c = z->l - m;
        z->ket = z->c; /* [, line 37 */
        among_var = find_among_b(z, a_0, 37); /* substring, line 37 */
        if (!(among_var)) { z->lb = m3; return 0; }
        z->bra = z->c; /* ], line 37 */
        z->lb = m3;
    }
    switch(among_var) {
        case 0: return 0;
        case 1:
            slice_del(z); /* delete, line 44 */
            break;
        case 2:
            if (!(in_grouping_b(z, g_s_ending, 98, 121))) return 0;
            slice_del(z); /* delete, line 46 */
            break;
    }
    return 1;
}

static int r_consonant_pair(struct SN_env * z) {
    {   int m = z->l - z->c; /* setlimit, line 50 */
        int m3;
        if (z->c < z->I[0]) return 0;
        z->c = z->I[0]; /* tomark, line 50 */
        m3 = z->lb; z->lb = z->c;
        z->c = z->l - m;
        {   int m = z->l - z->c; /* and, line 52 */
            if (!(find_among_b(z, a_1, 7))) { z->lb = m3; return 0; } /* among, line 51 */
            z->c = z->l - m;
            z->ket = z->c; /* [, line 52 */
            if (z->c <= z->lb) { z->lb = m3; return 0; }
            z->c--; /* next, line 52 */
            z->bra = z->c; /* ], line 52 */
            slice_del(z); /* delete, line 52 */
        }
        z->lb = m3;
    }
    return 1;
}

static int r_other_suffix(struct SN_env * z) {
    int among_var;
    {   int m = z->l - z->c; /* setlimit, line 55 */
        int m3;
        if (z->c < z->I[0]) return 0;
        z->c = z->I[0]; /* tomark, line 55 */
        m3 = z->lb; z->lb = z->c;
        z->c = z->l - m;
        z->ket = z->c; /* [, line 56 */
        among_var = find_among_b(z, a_2, 5); /* substring, line 56 */
        if (!(among_var)) { z->lb = m3; return 0; }
        z->bra = z->c; /* ], line 56 */
        switch(among_var) {
            case 0: { z->lb = m3; return 0; }
            case 1:
                slice_del(z); /* delete, line 57 */
                break;
            case 2:
                slice_from_s(z, 3, "l\x94" "s"); /* <-, line 58 */
                break;
            case 3:
                slice_from_s(z, 4, "full"); /* <-, line 59 */
                break;
        }
        z->lb = m3;
    }
    return 1;
}

extern int swedish_stem(struct SN_env * z) {
    {   int c = z->c; /* do, line 66 */
        if (!r_mark_regions(z)) goto lab0; /* call mark_regions, line 66 */
    lab0:
        z->c = c;
    }
    z->lb = z->c; z->c = z->l; /* backwards, line 67 */

    {   int m = z->l - z->c; /* do, line 68 */
        if (!r_main_suffix(z)) goto lab1; /* call main_suffix, line 68 */
    lab1:
        z->c = z->l - m;
    }
    {   int m = z->l - z->c; /* do, line 69 */
        if (!r_consonant_pair(z)) goto lab2; /* call consonant_pair, line 69 */
    lab2:
        z->c = z->l - m;
    }
    {   int m = z->l - z->c; /* do, line 70 */
        if (!r_other_suffix(z)) goto lab3; /* call other_suffix, line 70 */
    lab3:
        z->c = z->l - m;
    }
    z->c = z->lb;    return 1;
}

extern struct SN_env * swedish_create_env(void) { return SN_create_env(0, 1, 0); }

extern void swedish_close_env(struct SN_env * z) { SN_close_env(z); }



=== Added File Zope/lib/python/Products/PluginIndexes/TextIndexNG/src/PyStemmer/swedish/voc.txt === (30523/30623 lines abridged)
a
aaele
aah
ab
abba
abborrar
abborrarna
abborre
abborrpinne
abc
abednego
abort
abrahams
absint
abskons
absolut
ack
ackompanjerade
ackord
acllerbring
acob
ad
adclc
adcle
addra
ade
adeie
adel
adelc
adele
adeles
adelig
adelns
adelsdam
adelsfr”ken
adelskalendern
adelskalendrar
adelskapen
adelsman
adelsm„n
adelsvapen
aderton
adertonde
adertonhundratalet
adertonskilling
adjunkt
adjunkten
adjunktur
adj”
adlades

[-=- -=- -=- 30523 lines omitted -=- -=- -=-]

”versk†dande
”versta
”versteg
”verstel”jtnant
”verstel”jtnanten
”verstiger
”verstinnan
”verstr”mmande
”verstr”tt
”versvalla
”versvallande
”versv„mmades
”versv„mning
”vers„ttning
”vertaga
”vertala
”vertalade
”vertalande
”vertr„ffar
”vertvgade
”vertvgelse
”vertyg
”vertyga
”vertygad
”vertygade
”vertygat
”vertygelse
”vertygelsen
”vert„nkt
”vervann
”vervar
”vervikt
”vervinna
”vervinnande
”vervunna
”vervunnen
”vervunnit
”verv„ga
”verv„gande
”verv„gde
”verv„gt
”verv„ldigad
”ver„ndakastad
”ver„ndakastade
”vning
”vningen
”vre
”vriga
”vrigt
”„ndligt