From ffaec752e971a660d165927160029ddfe34dc255 Mon Sep 17 00:00:00 2001 From: Teodor Sigaev Date: Thu, 15 Sep 2005 12:41:52 +0000 Subject: [PATCH] Update Snowball. I have to update it because of old version doesn't available on Snowball's site and new version of stemmers can't be compiled with old interface. --- contrib/tsearch2/dict_snowball.c | 131 +++ contrib/tsearch2/gendict/README.gendict | 131 +++ contrib/tsearch2/gendict/config.sh | 190 ++++ contrib/tsearch2/snowball/api.c | 69 ++ contrib/tsearch2/snowball/api.h | 27 + contrib/tsearch2/snowball/english_stem.c | 1156 ++++++++++++++++++++++ contrib/tsearch2/snowball/english_stem.h | 16 + contrib/tsearch2/snowball/header.h | 58 ++ contrib/tsearch2/snowball/russian_stem.c | 701 +++++++++++++ contrib/tsearch2/snowball/russian_stem.h | 16 + contrib/tsearch2/snowball/utilities.c | 446 +++++++++ 11 files changed, 2941 insertions(+) create mode 100644 contrib/tsearch2/dict_snowball.c create mode 100644 contrib/tsearch2/gendict/README.gendict create mode 100755 contrib/tsearch2/gendict/config.sh create mode 100644 contrib/tsearch2/snowball/api.c create mode 100644 contrib/tsearch2/snowball/api.h create mode 100644 contrib/tsearch2/snowball/english_stem.c create mode 100644 contrib/tsearch2/snowball/english_stem.h create mode 100644 contrib/tsearch2/snowball/header.h create mode 100644 contrib/tsearch2/snowball/russian_stem.c create mode 100644 contrib/tsearch2/snowball/russian_stem.h create mode 100644 contrib/tsearch2/snowball/utilities.c diff --git a/contrib/tsearch2/dict_snowball.c b/contrib/tsearch2/dict_snowball.c new file mode 100644 index 0000000000..7cae5be0de --- /dev/null +++ b/contrib/tsearch2/dict_snowball.c @@ -0,0 +1,131 @@ +/* + * example of Snowball dictionary + * http://snowball.tartarus.org/ + * Teodor Sigaev + */ +#include +#include + +#include "postgres.h" + +#include "dict.h" +#include "common.h" +#include "snowball/header.h" +#include "snowball/english_stem.h" +#include "snowball/russian_stem.h" + +typedef struct +{ + struct SN_env *z; + StopList stoplist; + int (*stem) (struct SN_env * z); +} DictSnowball; + + +PG_FUNCTION_INFO_V1(snb_en_init); +Datum snb_en_init(PG_FUNCTION_ARGS); + +PG_FUNCTION_INFO_V1(snb_ru_init); +Datum snb_ru_init(PG_FUNCTION_ARGS); + +PG_FUNCTION_INFO_V1(snb_lexize); +Datum snb_lexize(PG_FUNCTION_ARGS); + +Datum +snb_en_init(PG_FUNCTION_ARGS) +{ + DictSnowball *d = (DictSnowball *) malloc(sizeof(DictSnowball)); + + if (!d) + ereport(ERROR, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"))); + memset(d, 0, sizeof(DictSnowball)); + d->stoplist.wordop = lowerstr; + + if (!PG_ARGISNULL(0) && PG_GETARG_POINTER(0) != NULL) + { + text *in = PG_GETARG_TEXT_P(0); + + readstoplist(in, &(d->stoplist)); + sortstoplist(&(d->stoplist)); + PG_FREE_IF_COPY(in, 0); + } + + d->z = english_ISO_8859_1_create_env(); + if (!d->z) + { + freestoplist(&(d->stoplist)); + ereport(ERROR, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"))); + } + d->stem = english_ISO_8859_1_stem; + + PG_RETURN_POINTER(d); +} + +Datum +snb_ru_init(PG_FUNCTION_ARGS) +{ + DictSnowball *d = (DictSnowball *) malloc(sizeof(DictSnowball)); + + if (!d) + ereport(ERROR, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"))); + memset(d, 0, sizeof(DictSnowball)); + d->stoplist.wordop = lowerstr; + + if (!PG_ARGISNULL(0) && PG_GETARG_POINTER(0) != NULL) + { + text *in = PG_GETARG_TEXT_P(0); + + readstoplist(in, &(d->stoplist)); + sortstoplist(&(d->stoplist)); + PG_FREE_IF_COPY(in, 0); + } + + d->z = russian_KOI8_R_create_env(); + if (!d->z) + { + freestoplist(&(d->stoplist)); + ereport(ERROR, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"))); + } + d->stem = russian_KOI8_R_stem; + + PG_RETURN_POINTER(d); +} + +Datum +snb_lexize(PG_FUNCTION_ARGS) +{ + DictSnowball *d = (DictSnowball *) PG_GETARG_POINTER(0); + char *in = (char *) PG_GETARG_POINTER(1); + char *txt = pnstrdup(in, PG_GETARG_INT32(2)); + char **res = palloc(sizeof(char *) * 2); + + if (*txt == '\0' || searchstoplist(&(d->stoplist), txt)) + { + pfree(txt); + res[0] = NULL; + } + else + { + SN_set_current(d->z, strlen(txt), txt); + (d->stem) (d->z); + if (d->z->p && d->z->l) + { + txt = repalloc(txt, d->z->l + 1); + memcpy(txt, d->z->p, d->z->l); + txt[d->z->l] = '\0'; + } + res[0] = txt; + } + res[1] = NULL; + + + PG_RETURN_POINTER(res); +} diff --git a/contrib/tsearch2/gendict/README.gendict b/contrib/tsearch2/gendict/README.gendict new file mode 100644 index 0000000000..e5bd010b03 --- /dev/null +++ b/contrib/tsearch2/gendict/README.gendict @@ -0,0 +1,131 @@ +Gendict - generate dictionary templates for contrib/tsearch2 module. + +This utility aims to help people creating dictionary for contrib/tsearch v2 +module. Particularly, it has built-in support for snowball stemmers. + +Programming API to tsearch2 dictionaries is described in tsearch v2 +documentation. + + +Prerequisities: + +* PostgreSQL 7.3 and above. + +* You need tsearch2 module sources already compiled + +* Rights to install contrib modules + +Usage: + + run config.sh without parameters to see options and arguments + +Usage: +./config.sh -n DICTNAME ( [ -s [ -p PREFIX ] ] | [ -c CFILES ] [ -h HFILES ] [ -i ] ) [ -v ] [ -d DIR ] [ -C COMMENT ] + -v - be verbose + -d DIR - name of directory in PGSQL_SRC/contrib (default dict_DICTNAME) + -C COMMENT - dictionary comment +Generate Snowball stemmer: +./config.sh -n DICTNAME -s [ -p PREFIX ] [ -v ] [ -d DIR ] [ -C COMMENT ] + -s - generate Snowball wrapper + -p - prefix of Snowball's function, (default DICTNAME) +Generate template dictionary: +./config.sh -n DICTNAME [ -c CFILES ] [ -h HFILES ] [ -i ] [ -v ] [ -d DIR ] [ -C COMMENT ] + -c CFILES - source files, must be placed in contrib/tsearch2/gendict directory. + These files will be used in Makefile. + -h HFILES - header files, must be placed in contrib/tsearch2/gendict directory. + These files will be used in Makefile and subinclude.h + -i - dictionary has init method + + +Example 1: + + Create Portuguese stemmer + + 0. cd PGSQL_SRC/contrib/tsearch2/gendict + + 1. Obtain stem.{c,h} files for Portuguese + + wget http://snowball.tartarus.org/portuguese/stem.c + wget http://snowball.tartarus.org/portuguese/stem.h + + 2. Create template files for Portuguese + + ./config.sh -n pt -s -p portuguese_ISO_8859_1 -v -C'Snowball stemmer for Portuguese' + + Note, that argument for -p option should be *the same* as name of stemming + function in stem.c (without _stem) + + A bunch of files will be generated and placed in PGSQL_SRC/contrib/dict_pt + directory. + + 3. Compile and install dictionary + + cd PGSQL_SRC/contrib/dict_pt + make + make install + + 4. Test it + + Sample portuguese words with the stemmed forms are available + from http://snowball.tartarus.org/portuguese/stemmer.html + + createdb testdict + psql testdict < /usr/local/pgsql/share/contrib/tsearch2.sql + psql testdict < /usr/local/pgsql/share/contrib/dict_pt.sql + psql -d testdict -c "select lexize('pt','bobagem');" + lexize + --------- + {bobag} + (1 row) + + Here is what I have in pg_ts_dict table + + psql -d testdict -c "select * from pg_ts_dict where dict_name='pt';" + dict_name | dict_init | dict_initoption | dict_lexize | dict_comment + -----------+--------------------+-----------------+---------------------------------------+--------------------------------- + pt | dinit_pt(internal) | | snb_lexize(internal,internal,integer) | Snowball stemmer for Portuguese + + (1 row) + + + Note, that you have already installed dictionary and corresponding + entry in tsearch configuration and you may modify it using + plain SQL commands, for example, specify stop words. + +Example 2: + + a) Simple template dictionary with init method + + ./config.sh -n wow -v -i -C WOW + + b) Create simple template dict (without init method): + ./config.sh -n wow -v -C WOW + + The same as above, but dictionary will have not init method + + Dictionaries obtained in a) and b) are fully working and ready + for use: + a) lowercase input word and remove it if it is a stop word + b) recognizes any word + + c) Simple template dictionary with source files (with init method): + + ./config.sh -n wow -v -i -c a.c -h a.h -C WOW + + Source files ( a.c ) must be placed in contrib/tsearch2/gendict directory. + These files will be used in Makefile. + + Header files ( a.h ), must be placed in contrib/tsearch2/gendict directory. + These files will be used in Makefile and subinclude.h + + d) Simple template dictionary with source files (without init method): + + ./config.sh -n wow -v -c a.c -h a.h -C WOW + + The same as above, but dictionary will have not init method + + After that you have sources in PGSQL_SRC/contrib/dict_wow and + you may edit them to create actual dictionary. + + Please, check Tsearch2 home page (http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/) + for additional information about "Gendict tutorial" and dictionaries. diff --git a/contrib/tsearch2/gendict/config.sh b/contrib/tsearch2/gendict/config.sh new file mode 100755 index 0000000000..2dc71fb73e --- /dev/null +++ b/contrib/tsearch2/gendict/config.sh @@ -0,0 +1,190 @@ +#!/bin/sh + +usage () { + echo Usage: + echo $0 -n DICTNAME \( [ -s [ -p PREFIX ] ] \| [ -c CFILES ] [ -h HFILES ] [ -i ] \) [ -v ] [ -d DIR ] [ -C COMMENT ] + echo ' -v - be verbose' + echo ' -d DIR - name of directory in PGSQL_SRL/contrib (default dict_DICTNAME)' + echo ' -C COMMENT - dictionary comment' + echo Generate Snowball stemmer: + echo $0 -n DICTNAME -s [ -p PREFIX ] [ -v ] [ -d DIR ] [ -C COMMENT ] + echo ' -s - generate Snowball wrapper' + echo " -p - prefix of Snowball's function, (default DICTNAME)" + echo Generate template dictionary: + echo $0 -n DICTNAME [ -c CFILES ] [ -h HFILES ] [ -i ] [ -v ] [ -d DIR ] [ -C COMMENT ] + echo ' -c CFILES - source files, must be placed in contrib/tsearch2/gendict directory.' + echo ' These files will be used in Makefile.' + echo ' -h HFILES - header files, must be placed in contrib/tsearch2/gendict directory.' + echo ' These files will be used in Makefile and subinclude.h' + echo ' -i - dictionary has init method' + exit 1; +} + +dictname= +stemmode=no +verbose=no +cfile= +hfile= +dir= +hasinit=no +comment= +prefix= + +while getopts n:c:C:h:d:p:vis opt +do + case "$opt" in + v) verbose=yes;; + s) stemmode=yes;; + i) hasinit=yes;; + n) dictname="$OPTARG";; + c) cfile="$OPTARG";; + h) hfile="$OPTARG";; + d) dir="$OPTARG";; + C) comment="$OPTARG";; + p) prefix="$OPTARG";; + \?) usage;; + esac +done + +[ ${#dictname} -eq 0 ] && usage + +dictname=`echo $dictname | tr '[:upper:]' '[:lower:]'` + +if [ $stemmode = "yes" ] ; then + [ ${#prefix} -eq 0 ] && prefix=$dictname + hasinit=yes + cfile="stem.c" + hfile="stem.h" +fi + +[ ${#dir} -eq 0 ] && dir="dict_$dictname" + +if [ ${#comment} -eq 0 ]; then + comment=null +else + comment="'$comment'" +fi + +ofile= +for f in $cfile +do + f=` echo $f | sed 's#c$#o#'` + ofile="$ofile $f" +done + +if [ $stemmode = "yes" ] ; then + ofile="$ofile dict_snowball.o" +else + ofile="$ofile dict_tmpl.o" +fi + +if [ $verbose = "yes" ]; then + echo Dictname: "'"$dictname"'" + echo Snowball stemmer: $stemmode + echo Has init method: $hasinit + [ $stemmode = "yes" ] && echo Function prefix: $prefix + echo Source files: $cfile + echo Header files: $hfile + echo Object files: $ofile + echo Comment: $comment + echo Directory: ../../$dir +fi + + +[ $verbose = "yes" ] && echo -n 'Build directory... ' +if [ ! -d ../../$dir ]; then + if ! mkdir ../../$dir ; then + echo "Can't create directory ../../$dir" + exit 1 + fi +fi +[ $verbose = "yes" ] && echo ok + + +[ $verbose = "yes" ] && echo -n 'Build Makefile... ' +sed s#CFG_DIR#$dir# < Makefile.IN | sed s#CFG_MODNAME#$dictname# | sed "s#CFG_OFILE#$ofile#" > ../../$dir/Makefile.tmp +if [ $stemmode = "yes" ] ; then + sed "s#^PG_CPPFLAGS.*\$#PG_CPPFLAGS = -I../tsearch2/snowball -I../tsearch2#" < ../../$dir/Makefile.tmp > ../../$dir/Makefile +else + sed "s#^PG_CPPFLAGS.*\$#PG_CPPFLAGS = -I../tsearch2#" < ../../$dir/Makefile.tmp > ../../$dir/Makefile +fi +rm ../../$dir/Makefile.tmp +[ $verbose = "yes" ] && echo ok + + +[ $verbose = "yes" ] && echo -n Build dict_$dictname'.sql.in... ' +if [ $hasinit = "yes" ]; then + sed s#CFG_MODNAME#$dictname# < sql.IN | sed "s#CFG_COMMENT#$comment#" | sed s#^HASINIT## | sed 's#^NOINIT.*$##' > ../../$dir/dict_$dictname.sql.in.tmp + if [ $stemmode = "yes" ] ; then + sed s#^ISSNOWBALL## < ../../$dir/dict_$dictname.sql.in.tmp | sed s#^NOSNOWBALL.*\$## > ../../$dir/dict_$dictname.sql.in + else + sed s#^NOSNOWBALL## < ../../$dir/dict_$dictname.sql.in.tmp | sed s#^ISSNOWBALL.*\$## > ../../$dir/dict_$dictname.sql.in + fi + rm ../../$dir/dict_$dictname.sql.in.tmp +else + sed s#CFG_MODNAME#$dictname# < sql.IN | sed "s#CFG_COMMENT#$comment#" | sed s#^NOINIT## | sed 's#^HASINIT.*$##' | sed s#^NOSNOWBALL## | sed s#^ISSNOWBALL.*\$## > ../../$dir/dict_$dictname.sql.in +fi +[ $verbose = "yes" ] && echo ok + + + +if [ ${#cfile} -ne 0 ] || [ ${#hfile} -ne 0 ] ; then + [ $verbose = "yes" ] && echo -n 'Copy source and header files... ' + if [ ${#cfile} -ne 0 ] ; then + if [ $stemmode = "yes" ] ; then + for cfn in $cfile + do + sed s#../runtime/## < $cfn > ../../$dir/$cfn + done + else + if ! cp $cfile ../../$dir ; then + echo "Can't cp all or one of files: $cfile" + exit 1 + fi + fi + fi + if [ ${#hfile} -ne 0 ] ; then + if ! cp $hfile ../../$dir ; then + echo "Cant cp all or one of files: $hfile" + exit 1 + fi + fi + [ $verbose = "yes" ] && echo ok +fi + + +[ $verbose = "yes" ] && echo -n 'Build sub-include header... ' +echo -n > ../../$dir/subinclude.h +for i in $hfile +do + echo "#include \"$i\"" >> ../../$dir/subinclude.h +done +[ $verbose = "yes" ] && echo ok + + +if [ $stemmode = "yes" ] ; then + [ $verbose = "yes" ] && echo -n 'Build Snowball stemmer... ' + sed s#CFG_MODNAME#$dictname#g < dict_snowball.c.IN | sed s#CFG_PREFIX#$prefix#g > ../../$dir/dict_snowball.c +else + [ $verbose = "yes" ] && echo -n 'Build dictinonary... ' + sed s#CFG_MODNAME#$dictname#g < dict_tmpl.c.IN > ../../$dir/dict_tmpl.c.tmp + if [ $hasinit = "yes" ]; then + sed s#^HASINIT## < ../../$dir/dict_tmpl.c.tmp | sed 's#^NOINIT.*$##' > ../../$dir/dict_tmpl.c + else + sed s#^HASINIT.*\$## < ../../$dir/dict_tmpl.c.tmp | sed 's#^NOINIT##' > ../../$dir/dict_tmpl.c + fi + rm ../../$dir/dict_tmpl.c.tmp +fi +[ $verbose = "yes" ] && echo ok + + +[ $verbose = "yes" ] && echo -n "Build README.$dictname... " +if [ $stemmode = "yes" ] ; then + echo "Autogenerated Snowball's wrapper for $prefix" > ../../$dir/README.$dictname +else + echo "Autogenerated template for $dictname" > ../../$dir/README.$dictname +fi +[ $verbose = "yes" ] && echo ok + +echo All is done + diff --git a/contrib/tsearch2/snowball/api.c b/contrib/tsearch2/snowball/api.c new file mode 100644 index 0000000000..9dd5a3b8fa --- /dev/null +++ b/contrib/tsearch2/snowball/api.c @@ -0,0 +1,69 @@ + +#include /* for calloc, free */ +#include "header.h" + +extern struct SN_env * SN_create_env(int S_size, int I_size, int B_size) +{ + struct SN_env * z = (struct SN_env *) calloc(1, sizeof(struct SN_env)); + if (z == NULL) return NULL; + z->p = create_s(); + if (z->p == NULL) goto error; + if (S_size) + { + int i; + z->S = (symbol * *) calloc(S_size, sizeof(symbol *)); + if (z->S == NULL) goto error; + + for (i = 0; i < S_size; i++) + { + z->S[i] = create_s(); + if (z->S[i] == NULL) goto error; + } + z->S_size = S_size; + } + + if (I_size) + { + z->I = (int *) calloc(I_size, sizeof(int)); + if (z->I == NULL) goto error; + z->I_size = I_size; + } + + if (B_size) + { + z->B = (symbol *) calloc(B_size, sizeof(symbol)); + if (z->B == NULL) goto error; + z->B_size = B_size; + } + + return z; +error: + SN_close_env(z); + return NULL; +} + +extern void SN_close_env(struct SN_env * z) +{ + if (z == NULL) return; + if (z->S_size) + { + int i; + for (i = 0; i < z->S_size; i++) + { + lose_s(z->S[i]); + } + free(z->S); + } + if (z->I_size) free(z->I); + if (z->B_size) free(z->B); + if (z->p) lose_s(z->p); + free(z); +} + +extern int SN_set_current(struct SN_env * z, int size, const symbol * s) +{ + int err = replace_s(z, 0, z->l, size, s, NULL); + z->c = 0; + return err; +} + diff --git a/contrib/tsearch2/snowball/api.h b/contrib/tsearch2/snowball/api.h new file mode 100644 index 0000000000..adc2282e32 --- /dev/null +++ b/contrib/tsearch2/snowball/api.h @@ -0,0 +1,27 @@ + +typedef unsigned char symbol; + +/* Or replace 'char' above with 'short' for 16 bit characters. + + More precisely, replace 'char' with whatever type guarantees the + character width you need. Note however that sizeof(symbol) should divide + HEAD, defined in header.h as 2*sizeof(int), without remainder, otherwise + there is an alignment problem. In the unlikely event of a problem here, + consult Martin Porter. + +*/ + +struct SN_env { + symbol * p; + int c; int a; int l; int lb; int bra; int ket; + int S_size; int I_size; int B_size; + symbol * * S; + int * I; + symbol * B; +}; + +extern struct SN_env * SN_create_env(int S_size, int I_size, int B_size); +extern void SN_close_env(struct SN_env * z); + +extern int SN_set_current(struct SN_env * z, int size, const symbol * s); + diff --git a/contrib/tsearch2/snowball/english_stem.c b/contrib/tsearch2/snowball/english_stem.c new file mode 100644 index 0000000000..54eb25f86f --- /dev/null +++ b/contrib/tsearch2/snowball/english_stem.c @@ -0,0 +1,1156 @@ + +/* This file was generated automatically by the Snowball to ANSI C compiler */ + +#include "header.h" + +extern int english_ISO_8859_1_stem(struct SN_env * z); +static int r_exception2(struct SN_env * z); +static int r_exception1(struct SN_env * z); +static int r_Step_5(struct SN_env * z); +static int r_Step_4(struct SN_env * z); +static int r_Step_3(struct SN_env * z); +static int r_Step_2(struct SN_env * z); +static int r_Step_1c(struct SN_env * z); +static int r_Step_1b(struct SN_env * z); +static int r_Step_1a(struct SN_env * z); +static int r_R2(struct SN_env * z); +static int r_R1(struct SN_env * z); +static int r_shortv(struct SN_env * z); +static int r_mark_regions(struct SN_env * z); +static int r_postlude(struct SN_env * z); +static int r_prelude(struct SN_env * z); + +extern struct SN_env * english_ISO_8859_1_create_env(void); +extern void english_ISO_8859_1_close_env(struct SN_env * z); + +static symbol s_0_0[6] = { 'c', 'o', 'm', 'm', 'u', 'n' }; +static symbol s_0_1[5] = { 'g', 'e', 'n', 'e', 'r' }; + +static struct among a_0[2] = +{ +/* 0 */ { 6, s_0_0, -1, -1, 0}, +/* 1 */ { 5, s_0_1, -1, -1, 0} +}; + +static symbol s_1_0[1] = { '\'' }; +static symbol s_1_1[3] = { '\'', 's', '\'' }; +static symbol s_1_2[2] = { '\'', 's' }; + +static struct among a_1[3] = +{ +/* 0 */ { 1, s_1_0, -1, 1, 0}, +/* 1 */ { 3, s_1_1, 0, 1, 0}, +/* 2 */ { 2, s_1_2, -1, 1, 0} +}; + +static symbol s_2_0[3] = { 'i', 'e', 'd' }; +static symbol s_2_1[1] = { 's' }; +static symbol s_2_2[3] = { 'i', 'e', 's' }; +static symbol s_2_3[4] = { 's', 's', 'e', 's' }; +static symbol s_2_4[2] = { 's', 's' }; +static symbol s_2_5[2] = { 'u', 's' }; + +static struct among a_2[6] = +{ +/* 0 */ { 3, s_2_0, -1, 2, 0}, +/* 1 */ { 1, s_2_1, -1, 3, 0}, +/* 2 */ { 3, s_2_2, 1, 2, 0}, +/* 3 */ { 4, s_2_3, 1, 1, 0}, +/* 4 */ { 2, s_2_4, 1, -1, 0}, +/* 5 */ { 2, s_2_5, 1, -1, 0} +}; + +static symbol s_3_1[2] = { 'b', 'b' }; +static symbol s_3_2[2] = { 'd', 'd' }; +static symbol s_3_3[2] = { 'f', 'f' }; +static symbol s_3_4[2] = { 'g', 'g' }; +static symbol s_3_5[2] = { 'b', 'l' }; +static symbol s_3_6[2] = { 'm', 'm' }; +static symbol s_3_7[2] = { 'n', 'n' }; +static symbol s_3_8[2] = { 'p', 'p' }; +static symbol s_3_9[2] = { 'r', 'r' }; +static symbol s_3_10[2] = { 'a', 't' }; +static symbol s_3_11[2] = { 't', 't' }; +static symbol s_3_12[2] = { 'i', 'z' }; + +static struct among a_3[13] = +{ +/* 0 */ { 0, 0, -1, 3, 0}, +/* 1 */ { 2, s_3_1, 0, 2, 0}, +/* 2 */ { 2, s_3_2, 0, 2, 0}, +/* 3 */ { 2, s_3_3, 0, 2, 0}, +/* 4 */ { 2, s_3_4, 0, 2, 0}, +/* 5 */ { 2, s_3_5, 0, 1, 0}, +/* 6 */ { 2, s_3_6, 0, 2, 0}, +/* 7 */ { 2, s_3_7, 0, 2, 0}, +/* 8 */ { 2, s_3_8, 0, 2, 0}, +/* 9 */ { 2, s_3_9, 0, 2, 0}, +/* 10 */ { 2, s_3_10, 0, 1, 0}, +/* 11 */ { 2, s_3_11, 0, 2, 0}, +/* 12 */ { 2, s_3_12, 0, 1, 0} +}; + +static symbol s_4_0[2] = { 'e', 'd' }; +static symbol s_4_1[3] = { 'e', 'e', 'd' }; +static symbol s_4_2[3] = { 'i', 'n', 'g' }; +static symbol s_4_3[4] = { 'e', 'd', 'l', 'y' }; +static symbol s_4_4[5] = { 'e', 'e', 'd', 'l', 'y' }; +static symbol s_4_5[5] = { 'i', 'n', 'g', 'l', 'y' }; + +static struct among a_4[6] = +{ +/* 0 */ { 2, s_4_0, -1, 2, 0}, +/* 1 */ { 3, s_4_1, 0, 1, 0}, +/* 2 */ { 3, s_4_2, -1, 2, 0}, +/* 3 */ { 4, s_4_3, -1, 2, 0}, +/* 4 */ { 5, s_4_4, 3, 1, 0}, +/* 5 */ { 5, s_4_5, -1, 2, 0} +}; + +static symbol s_5_0[4] = { 'a', 'n', 'c', 'i' }; +static symbol s_5_1[4] = { 'e', 'n', 'c', 'i' }; +static symbol s_5_2[3] = { 'o', 'g', 'i' }; +static symbol s_5_3[2] = { 'l', 'i' }; +static symbol s_5_4[3] = { 'b', 'l', 'i' }; +static symbol s_5_5[4] = { 'a', 'b', 'l', 'i' }; +static symbol s_5_6[4] = { 'a', 'l', 'l', 'i' }; +static symbol s_5_7[5] = { 'f', 'u', 'l', 'l', 'i' }; +static symbol s_5_8[6] = { 'l', 'e', 's', 's', 'l', 'i' }; +static symbol s_5_9[5] = { 'o', 'u', 's', 'l', 'i' }; +static symbol s_5_10[5] = { 'e', 'n', 't', 'l', 'i' }; +static symbol s_5_11[5] = { 'a', 'l', 'i', 't', 'i' }; +static symbol s_5_12[6] = { 'b', 'i', 'l', 'i', 't', 'i' }; +static symbol s_5_13[5] = { 'i', 'v', 'i', 't', 'i' }; +static symbol s_5_14[6] = { 't', 'i', 'o', 'n', 'a', 'l' }; +static symbol s_5_15[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' }; +static symbol s_5_16[5] = { 'a', 'l', 'i', 's', 'm' }; +static symbol s_5_17[5] = { 'a', 't', 'i', 'o', 'n' }; +static symbol s_5_18[7] = { 'i', 'z', 'a', 't', 'i', 'o', 'n' }; +static symbol s_5_19[4] = { 'i', 'z', 'e', 'r' }; +static symbol s_5_20[4] = { 'a', 't', 'o', 'r' }; +static symbol s_5_21[7] = { 'i', 'v', 'e', 'n', 'e', 's', 's' }; +static symbol s_5_22[7] = { 'f', 'u', 'l', 'n', 'e', 's', 's' }; +static symbol s_5_23[7] = { 'o', 'u', 's', 'n', 'e', 's', 's' }; + +static struct among a_5[24] = +{ +/* 0 */ { 4, s_5_0, -1, 3, 0}, +/* 1 */ { 4, s_5_1, -1, 2, 0}, +/* 2 */ { 3, s_5_2, -1, 13, 0}, +/* 3 */ { 2, s_5_3, -1, 16, 0}, +/* 4 */ { 3, s_5_4, 3, 12, 0}, +/* 5 */ { 4, s_5_5, 4, 4, 0}, +/* 6 */ { 4, s_5_6, 3, 8, 0}, +/* 7 */ { 5, s_5_7, 3, 14, 0}, +/* 8 */ { 6, s_5_8, 3, 15, 0}, +/* 9 */ { 5, s_5_9, 3, 10, 0}, +/* 10 */ { 5, s_5_10, 3, 5, 0}, +/* 11 */ { 5, s_5_11, -1, 8, 0}, +/* 12 */ { 6, s_5_12, -1, 12, 0}, +/* 13 */ { 5, s_5_13, -1, 11, 0}, +/* 14 */ { 6, s_5_14, -1, 1, 0}, +/* 15 */ { 7, s_5_15, 14, 7, 0}, +/* 16 */ { 5, s_5_16, -1, 8, 0}, +/* 17 */ { 5, s_5_17, -1, 7, 0}, +/* 18 */ { 7, s_5_18, 17, 6, 0}, +/* 19 */ { 4, s_5_19, -1, 6, 0}, +/* 20 */ { 4, s_5_20, -1, 7, 0}, +/* 21 */ { 7, s_5_21, -1, 11, 0}, +/* 22 */ { 7, s_5_22, -1, 9, 0}, +/* 23 */ { 7, s_5_23, -1, 10, 0} +}; + +static symbol s_6_0[5] = { 'i', 'c', 'a', 't', 'e' }; +static symbol s_6_1[5] = { 'a', 't', 'i', 'v', 'e' }; +static symbol s_6_2[5] = { 'a', 'l', 'i', 'z', 'e' }; +static symbol s_6_3[5] = { 'i', 'c', 'i', 't', 'i' }; +static symbol s_6_4[4] = { 'i', 'c', 'a', 'l' }; +static symbol s_6_5[6] = { 't', 'i', 'o', 'n', 'a', 'l' }; +static symbol s_6_6[7] = { 'a', 't', 'i', 'o', 'n', 'a', 'l' }; +static symbol s_6_7[3] = { 'f', 'u', 'l' }; +static symbol s_6_8[4] = { 'n', 'e', 's', 's' }; + +static struct among a_6[9] = +{ +/* 0 */ { 5, s_6_0, -1, 4, 0}, +/* 1 */ { 5, s_6_1, -1, 6, 0}, +/* 2 */ { 5, s_6_2, -1, 3, 0}, +/* 3 */ { 5, s_6_3, -1, 4, 0}, +/* 4 */ { 4, s_6_4, -1, 4, 0}, +/* 5 */ { 6, s_6_5, -1, 1, 0}, +/* 6 */ { 7, s_6_6, 5, 2, 0}, +/* 7 */ { 3, s_6_7, -1, 5, 0}, +/* 8 */ { 4, s_6_8, -1, 5, 0} +}; + +static symbol s_7_0[2] = { 'i', 'c' }; +static symbol s_7_1[4] = { 'a', 'n', 'c', 'e' }; +static symbol s_7_2[4] = { 'e', 'n', 'c', 'e' }; +static symbol s_7_3[4] = { 'a', 'b', 'l', 'e' }; +static symbol s_7_4[4] = { 'i', 'b', 'l', 'e' }; +static symbol s_7_5[3] = { 'a', 't', 'e' }; +static symbol s_7_6[3] = { 'i', 'v', 'e' }; +static symbol s_7_7[3] = { 'i', 'z', 'e' }; +static symbol s_7_8[3] = { 'i', 't', 'i' }; +static symbol s_7_9[2] = { 'a', 'l' }; +static symbol s_7_10[3] = { 'i', 's', 'm' }; +static symbol s_7_11[3] = { 'i', 'o', 'n' }; +static symbol s_7_12[2] = { 'e', 'r' }; +static symbol s_7_13[3] = { 'o', 'u', 's' }; +static symbol s_7_14[3] = { 'a', 'n', 't' }; +static symbol s_7_15[3] = { 'e', 'n', 't' }; +static symbol s_7_16[4] = { 'm', 'e', 'n', 't' }; +static symbol s_7_17[5] = { 'e', 'm', 'e', 'n', 't' }; + +static struct among a_7[18] = +{ +/* 0 */ { 2, s_7_0, -1, 1, 0}, +/* 1 */ { 4, s_7_1, -1, 1, 0}, +/* 2 */ { 4, s_7_2, -1, 1, 0}, +/* 3 */ { 4, s_7_3, -1, 1, 0}, +/* 4 */ { 4, s_7_4, -1, 1, 0}, +/* 5 */ { 3, s_7_5, -1, 1, 0}, +/* 6 */ { 3, s_7_6, -1, 1, 0}, +/* 7 */ { 3, s_7_7, -1, 1, 0}, +/* 8 */ { 3, s_7_8, -1, 1, 0}, +/* 9 */ { 2, s_7_9, -1, 1, 0}, +/* 10 */ { 3, s_7_10, -1, 1, 0}, +/* 11 */ { 3, s_7_11, -1, 2, 0}, +/* 12 */ { 2, s_7_12, -1, 1, 0}, +/* 13 */ { 3, s_7_13, -1, 1, 0}, +/* 14 */ { 3, s_7_14, -1, 1, 0}, +/* 15 */ { 3, s_7_15, -1, 1, 0}, +/* 16 */ { 4, s_7_16, 15, 1, 0}, +/* 17 */ { 5, s_7_17, 16, 1, 0} +}; + +static symbol s_8_0[1] = { 'e' }; +static symbol s_8_1[1] = { 'l' }; + +static struct among a_8[2] = +{ +/* 0 */ { 1, s_8_0, -1, 1, 0}, +/* 1 */ { 1, s_8_1, -1, 2, 0} +}; + +static symbol s_9_0[7] = { 's', 'u', 'c', 'c', 'e', 'e', 'd' }; +static symbol s_9_1[7] = { 'p', 'r', 'o', 'c', 'e', 'e', 'd' }; +static symbol s_9_2[6] = { 'e', 'x', 'c', 'e', 'e', 'd' }; +static symbol s_9_3[7] = { 'c', 'a', 'n', 'n', 'i', 'n', 'g' }; +static symbol s_9_4[6] = { 'i', 'n', 'n', 'i', 'n', 'g' }; +static symbol s_9_5[7] = { 'e', 'a', 'r', 'r', 'i', 'n', 'g' }; +static symbol s_9_6[7] = { 'h', 'e', 'r', 'r', 'i', 'n', 'g' }; +static symbol s_9_7[6] = { 'o', 'u', 't', 'i', 'n', 'g' }; + +static struct among a_9[8] = +{ +/* 0 */ { 7, s_9_0, -1, -1, 0}, +/* 1 */ { 7, s_9_1, -1, -1, 0}, +/* 2 */ { 6, s_9_2, -1, -1, 0}, +/* 3 */ { 7, s_9_3, -1, -1, 0}, +/* 4 */ { 6, s_9_4, -1, -1, 0}, +/* 5 */ { 7, s_9_5, -1, -1, 0}, +/* 6 */ { 7, s_9_6, -1, -1, 0}, +/* 7 */ { 6, s_9_7, -1, -1, 0} +}; + +static symbol s_10_0[5] = { 'a', 'n', 'd', 'e', 's' }; +static symbol s_10_1[5] = { 'a', 't', 'l', 'a', 's' }; +static symbol s_10_2[4] = { 'b', 'i', 'a', 's' }; +static symbol s_10_3[6] = { 'c', 'o', 's', 'm', 'o', 's' }; +static symbol s_10_4[5] = { 'd', 'y', 'i', 'n', 'g' }; +static symbol s_10_5[5] = { 'e', 'a', 'r', 'l', 'y' }; +static symbol s_10_6[6] = { 'g', 'e', 'n', 't', 'l', 'y' }; +static symbol s_10_7[4] = { 'h', 'o', 'w', 'e' }; +static symbol s_10_8[4] = { 'i', 'd', 'l', 'y' }; +static symbol s_10_9[5] = { 'l', 'y', 'i', 'n', 'g' }; +static symbol s_10_10[4] = { 'n', 'e', 'w', 's' }; +static symbol s_10_11[4] = { 'o', 'n', 'l', 'y' }; +static symbol s_10_12[6] = { 's', 'i', 'n', 'g', 'l', 'y' }; +static symbol s_10_13[5] = { 's', 'k', 'i', 'e', 's' }; +static symbol s_10_14[4] = { 's', 'k', 'i', 's' }; +static symbol s_10_15[3] = { 's', 'k', 'y' }; +static symbol s_10_16[5] = { 't', 'y', 'i', 'n', 'g' }; +static symbol s_10_17[4] = { 'u', 'g', 'l', 'y' }; + +static struct among a_10[18] = +{ +/* 0 */ { 5, s_10_0, -1, -1, 0}, +/* 1 */ { 5, s_10_1, -1, -1, 0}, +/* 2 */ { 4, s_10_2, -1, -1, 0}, +/* 3 */ { 6, s_10_3, -1, -1, 0}, +/* 4 */ { 5, s_10_4, -1, 3, 0}, +/* 5 */ { 5, s_10_5, -1, 9, 0}, +/* 6 */ { 6, s_10_6, -1, 7, 0}, +/* 7 */ { 4, s_10_7, -1, -1, 0}, +/* 8 */ { 4, s_10_8, -1, 6, 0}, +/* 9 */ { 5, s_10_9, -1, 4, 0}, +/* 10 */ { 4, s_10_10, -1, -1, 0}, +/* 11 */ { 4, s_10_11, -1, 10, 0}, +/* 12 */ { 6, s_10_12, -1, 11, 0}, +/* 13 */ { 5, s_10_13, -1, 2, 0}, +/* 14 */ { 4, s_10_14, -1, 1, 0}, +/* 15 */ { 3, s_10_15, -1, -1, 0}, +/* 16 */ { 5, s_10_16, -1, 5, 0}, +/* 17 */ { 4, s_10_17, -1, 8, 0} +}; + +static unsigned char g_v[] = { 17, 65, 16, 1 }; + +static unsigned char g_v_WXY[] = { 1, 17, 65, 208, 1 }; + +static unsigned char g_valid_LI[] = { 55, 141, 2 }; + +static symbol s_0[] = { '\'' }; +static symbol s_1[] = { 'y' }; +static symbol s_2[] = { 'Y' }; +static symbol s_3[] = { 'y' }; +static symbol s_4[] = { 'Y' }; +static symbol s_5[] = { 's', 's' }; +static symbol s_6[] = { 'i', 'e' }; +static symbol s_7[] = { 'i' }; +static symbol s_8[] = { 'e', 'e' }; +static symbol s_9[] = { 'e' }; +static symbol s_10[] = { 'e' }; +static symbol s_11[] = { 'y' }; +static symbol s_12[] = { 'Y' }; +static symbol s_13[] = { 'i' }; +static symbol s_14[] = { 't', 'i', 'o', 'n' }; +static symbol s_15[] = { 'e', 'n', 'c', 'e' }; +static symbol s_16[] = { 'a', 'n', 'c', 'e' }; +static symbol s_17[] = { 'a', 'b', 'l', 'e' }; +static symbol s_18[] = { 'e', 'n', 't' }; +static symbol s_19[] = { 'i', 'z', 'e' }; +static symbol s_20[] = { 'a', 't', 'e' }; +static symbol s_21[] = { 'a', 'l' }; +static symbol s_22[] = { 'f', 'u', 'l' }; +static symbol s_23[] = { 'o', 'u', 's' }; +static symbol s_24[] = { 'i', 'v', 'e' }; +static symbol s_25[] = { 'b', 'l', 'e' }; +static symbol s_26[] = { 'l' }; +static symbol s_27[] = { 'o', 'g' }; +static symbol s_28[] = { 'f', 'u', 'l' }; +static symbol s_29[] = { 'l', 'e', 's', 's' }; +static symbol s_30[] = { 't', 'i', 'o', 'n' }; +static symbol s_31[] = { 'a', 't', 'e' }; +static symbol s_32[] = { 'a', 'l' }; +static symbol s_33[] = { 'i', 'c' }; +static symbol s_34[] = { 's' }; +static symbol s_35[] = { 't' }; +static symbol s_36[] = { 'l' }; +static symbol s_37[] = { 's', 'k', 'i' }; +static symbol s_38[] = { 's', 'k', 'y' }; +static symbol s_39[] = { 'd', 'i', 'e' }; +static symbol s_40[] = { 'l', 'i', 'e' }; +static symbol s_41[] = { 't', 'i', 'e' }; +static symbol s_42[] = { 'i', 'd', 'l' }; +static symbol s_43[] = { 'g', 'e', 'n', 't', 'l' }; +static symbol s_44[] = { 'u', 'g', 'l', 'i' }; +static symbol s_45[] = { 'e', 'a', 'r', 'l', 'i' }; +static symbol s_46[] = { 'o', 'n', 'l', 'i' }; +static symbol s_47[] = { 's', 'i', 'n', 'g', 'l' }; +static symbol s_48[] = { 'Y' }; +static symbol s_49[] = { 'y' }; + +static int r_prelude(struct SN_env * z) { + z->B[0] = 0; /* unset Y_found, line 26 */ + { int c = z->c; /* do, line 27 */ + z->bra = z->c; /* [, line 27 */ + if (!(eq_s(z, 1, s_0))) goto lab0; + z->ket = z->c; /* ], line 27 */ + { int ret; + ret = slice_del(z); /* delete, line 27 */ + if (ret < 0) return ret; + } + lab0: + z->c = c; + } + { int c = z->c; /* do, line 28 */ + z->bra = z->c; /* [, line 28 */ + if (!(eq_s(z, 1, s_1))) goto lab1; + z->ket = z->c; /* ], line 28 */ + if (!(in_grouping(z, g_v, 97, 121))) goto lab1; + { int ret; + ret = slice_from_s(z, 1, s_2); /* <-, line 28 */ + if (ret < 0) return ret; + } + z->B[0] = 1; /* set Y_found, line 28 */ + lab1: + z->c = c; + } + { int c = z->c; /* do, line 29 */ + while(1) { /* repeat, line 29 */ + int c = z->c; + while(1) { /* goto, line 29 */ + int c = z->c; + if (!(in_grouping(z, g_v, 97, 121))) goto lab4; + z->bra = z->c; /* [, line 29 */ + if (!(eq_s(z, 1, s_3))) goto lab4; + z->ket = z->c; /* ], line 29 */ + z->c = c; + break; + lab4: + z->c = c; + if (z->c >= z->l) goto lab3; + z->c++; /* goto, line 29 */ + } + { int ret; + ret = slice_from_s(z, 1, s_4); /* <-, line 29 */ + if (ret < 0) return ret; + } + z->B[0] = 1; /* set Y_found, line 29 */ + continue; + lab3: + z->c = c; + break; + } + z->c = c; + } + return 1; +} + +static int r_mark_regions(struct SN_env * z) { + z->I[0] = z->l; + z->I[1] = z->l; + { int c = z->c; /* do, line 35 */ + { int c = z->c; /* or, line 40 */ + if (!(find_among(z, a_0, 2))) goto lab2; /* among, line 36 */ + goto lab1; + lab2: + z->c = c; + while(1) { /* gopast, line 40 */ + if (!(in_grouping(z, g_v, 97, 121))) goto lab3; + break; + lab3: + if (z->c >= z->l) goto lab0; + z->c++; /* gopast, line 40 */ + } + while(1) { /* gopast, line 40 */ + if (!(out_grouping(z, g_v, 97, 121))) goto lab4; + break; + lab4: + if (z->c >= z->l) goto lab0; + z->c++; /* gopast, line 40 */ + } + } + lab1: + z->I[0] = z->c; /* setmark p1, line 41 */ + while(1) { /* gopast, line 42 */ + if (!(in_grouping(z, g_v, 97, 121))) goto lab5; + break; + lab5: + if (z->c >= z->l) goto lab0; + z->c++; /* gopast, line 42 */ + } + while(1) { /* gopast, line 42 */ + if (!(out_grouping(z, g_v, 97, 121))) goto lab6; + break; + lab6: + if (z->c >= z->l) goto lab0; + z->c++; /* gopast, line 42 */ + } + z->I[1] = z->c; /* setmark p2, line 42 */ + lab0: + z->c = c; + } + return 1; +} + +static int r_shortv(struct SN_env * z) { + { int m = z->l - z->c; (void) m; /* or, line 50 */ + if (!(out_grouping_b(z, g_v_WXY, 89, 121))) goto lab1; + if (!(in_grouping_b(z, g_v, 97, 121))) goto lab1; + if (!(out_grouping_b(z, g_v, 97, 121))) goto lab1; + goto lab0; + lab1: + z->c = z->l - m; + if (!(out_grouping_b(z, g_v, 97, 121))) return 0; + if (!(in_grouping_b(z, g_v, 97, 121))) return 0; + if (z->c > z->lb) return 0; /* atlimit, line 51 */ + } +lab0: + return 1; +} + +static int r_R1(struct SN_env * z) { + if (!(z->I[0] <= z->c)) return 0; + return 1; +} + +static int r_R2(struct SN_env * z) { + if (!(z->I[1] <= z->c)) return 0; + return 1; +} + +static int r_Step_1a(struct SN_env * z) { + int among_var; + { int m = z->l - z->c; (void) m; /* try, line 58 */ + z->ket = z->c; /* [, line 59 */ + among_var = find_among_b(z, a_1, 3); /* substring, line 59 */ + if (!(among_var)) { z->c = z->l - m; goto lab0; } + z->bra = z->c; /* ], line 59 */ + switch(among_var) { + case 0: { z->c = z->l - m; goto lab0; } + case 1: + { int ret; + ret = slice_del(z); /* delete, line 61 */ + if (ret < 0) return ret; + } + break; + } + lab0: + ; + } + z->ket = z->c; /* [, line 64 */ + among_var = find_among_b(z, a_2, 6); /* substring, line 64 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 64 */ + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + ret = slice_from_s(z, 2, s_5); /* <-, line 65 */ + if (ret < 0) return ret; + } + break; + case 2: + { int m = z->l - z->c; (void) m; /* or, line 67 */ + if (z->c <= z->lb) goto lab2; + z->c--; /* next, line 67 */ + if (z->c > z->lb) goto lab2; /* atlimit, line 67 */ + { int ret; + ret = slice_from_s(z, 2, s_6); /* <-, line 67 */ + if (ret < 0) return ret; + } + goto lab1; + lab2: + z->c = z->l - m; + { int ret; + ret = slice_from_s(z, 1, s_7); /* <-, line 67 */ + if (ret < 0) return ret; + } + } + lab1: + break; + case 3: + if (z->c <= z->lb) return 0; + z->c--; /* next, line 68 */ + while(1) { /* gopast, line 68 */ + if (!(in_grouping_b(z, g_v, 97, 121))) goto lab3; + break; + lab3: + if (z->c <= z->lb) return 0; + z->c--; /* gopast, line 68 */ + } + { int ret; + ret = slice_del(z); /* delete, line 68 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_Step_1b(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 74 */ + among_var = find_among_b(z, a_4, 6); /* substring, line 74 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 74 */ + switch(among_var) { + case 0: return 0; + case 1: + { int ret = r_R1(z); + if (ret == 0) return 0; /* call R1, line 76 */ + if (ret < 0) return ret; + } + { int ret; + ret = slice_from_s(z, 2, s_8); /* <-, line 76 */ + if (ret < 0) return ret; + } + break; + case 2: + { int m_test = z->l - z->c; /* test, line 79 */ + while(1) { /* gopast, line 79 */ + if (!(in_grouping_b(z, g_v, 97, 121))) goto lab0; + break; + lab0: + if (z->c <= z->lb) return 0; + z->c--; /* gopast, line 79 */ + } + z->c = z->l - m_test; + } + { int ret; + ret = slice_del(z); /* delete, line 79 */ + if (ret < 0) return ret; + } + { int m_test = z->l - z->c; /* test, line 80 */ + among_var = find_among_b(z, a_3, 13); /* substring, line 80 */ + if (!(among_var)) return 0; + z->c = z->l - m_test; + } + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + { int c = z->c; + ret = insert_s(z, z->c, z->c, 1, s_9); /* <+, line 82 */ + z->c = c; + } + if (ret < 0) return ret; + } + break; + case 2: + z->ket = z->c; /* [, line 85 */ + if (z->c <= z->lb) return 0; + z->c--; /* next, line 85 */ + z->bra = z->c; /* ], line 85 */ + { int ret; + ret = slice_del(z); /* delete, line 85 */ + if (ret < 0) return ret; + } + break; + case 3: + if (z->c != z->I[0]) return 0; /* atmark, line 86 */ + { int m_test = z->l - z->c; /* test, line 86 */ + { int ret = r_shortv(z); + if (ret == 0) return 0; /* call shortv, line 86 */ + if (ret < 0) return ret; + } + z->c = z->l - m_test; + } + { int ret; + { int c = z->c; + ret = insert_s(z, z->c, z->c, 1, s_10); /* <+, line 86 */ + z->c = c; + } + if (ret < 0) return ret; + } + break; + } + break; + } + return 1; +} + +static int r_Step_1c(struct SN_env * z) { + z->ket = z->c; /* [, line 93 */ + { int m = z->l - z->c; (void) m; /* or, line 93 */ + if (!(eq_s_b(z, 1, s_11))) goto lab1; + goto lab0; + lab1: + z->c = z->l - m; + if (!(eq_s_b(z, 1, s_12))) return 0; + } +lab0: + z->bra = z->c; /* ], line 93 */ + if (!(out_grouping_b(z, g_v, 97, 121))) return 0; + { int m = z->l - z->c; (void) m; /* not, line 94 */ + if (z->c > z->lb) goto lab2; /* atlimit, line 94 */ + return 0; + lab2: + z->c = z->l - m; + } + { int ret; + ret = slice_from_s(z, 1, s_13); /* <-, line 95 */ + if (ret < 0) return ret; + } + return 1; +} + +static int r_Step_2(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 99 */ + among_var = find_among_b(z, a_5, 24); /* substring, line 99 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 99 */ + { int ret = r_R1(z); + if (ret == 0) return 0; /* call R1, line 99 */ + if (ret < 0) return ret; + } + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + ret = slice_from_s(z, 4, s_14); /* <-, line 100 */ + if (ret < 0) return ret; + } + break; + case 2: + { int ret; + ret = slice_from_s(z, 4, s_15); /* <-, line 101 */ + if (ret < 0) return ret; + } + break; + case 3: + { int ret; + ret = slice_from_s(z, 4, s_16); /* <-, line 102 */ + if (ret < 0) return ret; + } + break; + case 4: + { int ret; + ret = slice_from_s(z, 4, s_17); /* <-, line 103 */ + if (ret < 0) return ret; + } + break; + case 5: + { int ret; + ret = slice_from_s(z, 3, s_18); /* <-, line 104 */ + if (ret < 0) return ret; + } + break; + case 6: + { int ret; + ret = slice_from_s(z, 3, s_19); /* <-, line 106 */ + if (ret < 0) return ret; + } + break; + case 7: + { int ret; + ret = slice_from_s(z, 3, s_20); /* <-, line 108 */ + if (ret < 0) return ret; + } + break; + case 8: + { int ret; + ret = slice_from_s(z, 2, s_21); /* <-, line 110 */ + if (ret < 0) return ret; + } + break; + case 9: + { int ret; + ret = slice_from_s(z, 3, s_22); /* <-, line 111 */ + if (ret < 0) return ret; + } + break; + case 10: + { int ret; + ret = slice_from_s(z, 3, s_23); /* <-, line 113 */ + if (ret < 0) return ret; + } + break; + case 11: + { int ret; + ret = slice_from_s(z, 3, s_24); /* <-, line 115 */ + if (ret < 0) return ret; + } + break; + case 12: + { int ret; + ret = slice_from_s(z, 3, s_25); /* <-, line 117 */ + if (ret < 0) return ret; + } + break; + case 13: + if (!(eq_s_b(z, 1, s_26))) return 0; + { int ret; + ret = slice_from_s(z, 2, s_27); /* <-, line 118 */ + if (ret < 0) return ret; + } + break; + case 14: + { int ret; + ret = slice_from_s(z, 3, s_28); /* <-, line 119 */ + if (ret < 0) return ret; + } + break; + case 15: + { int ret; + ret = slice_from_s(z, 4, s_29); /* <-, line 120 */ + if (ret < 0) return ret; + } + break; + case 16: + if (!(in_grouping_b(z, g_valid_LI, 99, 116))) return 0; + { int ret; + ret = slice_del(z); /* delete, line 121 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_Step_3(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 126 */ + among_var = find_among_b(z, a_6, 9); /* substring, line 126 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 126 */ + { int ret = r_R1(z); + if (ret == 0) return 0; /* call R1, line 126 */ + if (ret < 0) return ret; + } + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + ret = slice_from_s(z, 4, s_30); /* <-, line 127 */ + if (ret < 0) return ret; + } + break; + case 2: + { int ret; + ret = slice_from_s(z, 3, s_31); /* <-, line 128 */ + if (ret < 0) return ret; + } + break; + case 3: + { int ret; + ret = slice_from_s(z, 2, s_32); /* <-, line 129 */ + if (ret < 0) return ret; + } + break; + case 4: + { int ret; + ret = slice_from_s(z, 2, s_33); /* <-, line 131 */ + if (ret < 0) return ret; + } + break; + case 5: + { int ret; + ret = slice_del(z); /* delete, line 133 */ + if (ret < 0) return ret; + } + break; + case 6: + { int ret = r_R2(z); + if (ret == 0) return 0; /* call R2, line 135 */ + if (ret < 0) return ret; + } + { int ret; + ret = slice_del(z); /* delete, line 135 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_Step_4(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 140 */ + among_var = find_among_b(z, a_7, 18); /* substring, line 140 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 140 */ + { int ret = r_R2(z); + if (ret == 0) return 0; /* call R2, line 140 */ + if (ret < 0) return ret; + } + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + ret = slice_del(z); /* delete, line 143 */ + if (ret < 0) return ret; + } + break; + case 2: + { int m = z->l - z->c; (void) m; /* or, line 144 */ + if (!(eq_s_b(z, 1, s_34))) goto lab1; + goto lab0; + lab1: + z->c = z->l - m; + if (!(eq_s_b(z, 1, s_35))) return 0; + } + lab0: + { int ret; + ret = slice_del(z); /* delete, line 144 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_Step_5(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 149 */ + among_var = find_among_b(z, a_8, 2); /* substring, line 149 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 149 */ + switch(among_var) { + case 0: return 0; + case 1: + { int m = z->l - z->c; (void) m; /* or, line 150 */ + { int ret = r_R2(z); + if (ret == 0) goto lab1; /* call R2, line 150 */ + if (ret < 0) return ret; + } + goto lab0; + lab1: + z->c = z->l - m; + { int ret = r_R1(z); + if (ret == 0) return 0; /* call R1, line 150 */ + if (ret < 0) return ret; + } + { int m = z->l - z->c; (void) m; /* not, line 150 */ + { int ret = r_shortv(z); + if (ret == 0) goto lab2; /* call shortv, line 150 */ + if (ret < 0) return ret; + } + return 0; + lab2: + z->c = z->l - m; + } + } + lab0: + { int ret; + ret = slice_del(z); /* delete, line 150 */ + if (ret < 0) return ret; + } + break; + case 2: + { int ret = r_R2(z); + if (ret == 0) return 0; /* call R2, line 151 */ + if (ret < 0) return ret; + } + if (!(eq_s_b(z, 1, s_36))) return 0; + { int ret; + ret = slice_del(z); /* delete, line 151 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_exception2(struct SN_env * z) { + z->ket = z->c; /* [, line 157 */ + if (!(find_among_b(z, a_9, 8))) return 0; /* substring, line 157 */ + z->bra = z->c; /* ], line 157 */ + if (z->c > z->lb) return 0; /* atlimit, line 157 */ + return 1; +} + +static int r_exception1(struct SN_env * z) { + int among_var; + z->bra = z->c; /* [, line 169 */ + among_var = find_among(z, a_10, 18); /* substring, line 169 */ + if (!(among_var)) return 0; + z->ket = z->c; /* ], line 169 */ + if (z->c < z->l) return 0; /* atlimit, line 169 */ + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + ret = slice_from_s(z, 3, s_37); /* <-, line 173 */ + if (ret < 0) return ret; + } + break; + case 2: + { int ret; + ret = slice_from_s(z, 3, s_38); /* <-, line 174 */ + if (ret < 0) return ret; + } + break; + case 3: + { int ret; + ret = slice_from_s(z, 3, s_39); /* <-, line 175 */ + if (ret < 0) return ret; + } + break; + case 4: + { int ret; + ret = slice_from_s(z, 3, s_40); /* <-, line 176 */ + if (ret < 0) return ret; + } + break; + case 5: + { int ret; + ret = slice_from_s(z, 3, s_41); /* <-, line 177 */ + if (ret < 0) return ret; + } + break; + case 6: + { int ret; + ret = slice_from_s(z, 3, s_42); /* <-, line 181 */ + if (ret < 0) return ret; + } + break; + case 7: + { int ret; + ret = slice_from_s(z, 5, s_43); /* <-, line 182 */ + if (ret < 0) return ret; + } + break; + case 8: + { int ret; + ret = slice_from_s(z, 4, s_44); /* <-, line 183 */ + if (ret < 0) return ret; + } + break; + case 9: + { int ret; + ret = slice_from_s(z, 5, s_45); /* <-, line 184 */ + if (ret < 0) return ret; + } + break; + case 10: + { int ret; + ret = slice_from_s(z, 4, s_46); /* <-, line 185 */ + if (ret < 0) return ret; + } + break; + case 11: + { int ret; + ret = slice_from_s(z, 5, s_47); /* <-, line 186 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_postlude(struct SN_env * z) { + if (!(z->B[0])) return 0; /* Boolean test Y_found, line 202 */ + while(1) { /* repeat, line 202 */ + int c = z->c; + while(1) { /* goto, line 202 */ + int c = z->c; + z->bra = z->c; /* [, line 202 */ + if (!(eq_s(z, 1, s_48))) goto lab1; + z->ket = z->c; /* ], line 202 */ + z->c = c; + break; + lab1: + z->c = c; + if (z->c >= z->l) goto lab0; + z->c++; /* goto, line 202 */ + } + { int ret; + ret = slice_from_s(z, 1, s_49); /* <-, line 202 */ + if (ret < 0) return ret; + } + continue; + lab0: + z->c = c; + break; + } + return 1; +} + +extern int english_ISO_8859_1_stem(struct SN_env * z) { + { int c = z->c; /* or, line 206 */ + { int ret = r_exception1(z); + if (ret == 0) goto lab1; /* call exception1, line 206 */ + if (ret < 0) return ret; + } + goto lab0; + lab1: + z->c = c; + { int c = z->c; /* not, line 207 */ + { int c = z->c + 3; + if (0 > c || c > z->l) goto lab3; + z->c = c; /* hop, line 207 */ + } + goto lab2; + lab3: + z->c = c; + } + goto lab0; + lab2: + z->c = c; + { int c = z->c; /* do, line 208 */ + { int ret = r_prelude(z); + if (ret == 0) goto lab4; /* call prelude, line 208 */ + if (ret < 0) return ret; + } + lab4: + z->c = c; + } + { int c = z->c; /* do, line 209 */ + { int ret = r_mark_regions(z); + if (ret == 0) goto lab5; /* call mark_regions, line 209 */ + if (ret < 0) return ret; + } + lab5: + z->c = c; + } + z->lb = z->c; z->c = z->l; /* backwards, line 210 */ + + { int m = z->l - z->c; (void) m; /* do, line 212 */ + { int ret = r_Step_1a(z); + if (ret == 0) goto lab6; /* call Step_1a, line 212 */ + if (ret < 0) return ret; + } + lab6: + z->c = z->l - m; + } + { int m = z->l - z->c; (void) m; /* or, line 214 */ + { int ret = r_exception2(z); + if (ret == 0) goto lab8; /* call exception2, line 214 */ + if (ret < 0) return ret; + } + goto lab7; + lab8: + z->c = z->l - m; + { int m = z->l - z->c; (void) m; /* do, line 216 */ + { int ret = r_Step_1b(z); + if (ret == 0) goto lab9; /* call Step_1b, line 216 */ + if (ret < 0) return ret; + } + lab9: + z->c = z->l - m; + } + { int m = z->l - z->c; (void) m; /* do, line 217 */ + { int ret = r_Step_1c(z); + if (ret == 0) goto lab10; /* call Step_1c, line 217 */ + if (ret < 0) return ret; + } + lab10: + z->c = z->l - m; + } + { int m = z->l - z->c; (void) m; /* do, line 219 */ + { int ret = r_Step_2(z); + if (ret == 0) goto lab11; /* call Step_2, line 219 */ + if (ret < 0) return ret; + } + lab11: + z->c = z->l - m; + } + { int m = z->l - z->c; (void) m; /* do, line 220 */ + { int ret = r_Step_3(z); + if (ret == 0) goto lab12; /* call Step_3, line 220 */ + if (ret < 0) return ret; + } + lab12: + z->c = z->l - m; + } + { int m = z->l - z->c; (void) m; /* do, line 221 */ + { int ret = r_Step_4(z); + if (ret == 0) goto lab13; /* call Step_4, line 221 */ + if (ret < 0) return ret; + } + lab13: + z->c = z->l - m; + } + { int m = z->l - z->c; (void) m; /* do, line 223 */ + { int ret = r_Step_5(z); + if (ret == 0) goto lab14; /* call Step_5, line 223 */ + if (ret < 0) return ret; + } + lab14: + z->c = z->l - m; + } + } + lab7: + z->c = z->lb; + { int c = z->c; /* do, line 226 */ + { int ret = r_postlude(z); + if (ret == 0) goto lab15; /* call postlude, line 226 */ + if (ret < 0) return ret; + } + lab15: + z->c = c; + } + } +lab0: + return 1; +} + +extern struct SN_env * english_ISO_8859_1_create_env(void) { return SN_create_env(0, 2, 1); } + +extern void english_ISO_8859_1_close_env(struct SN_env * z) { SN_close_env(z); } + diff --git a/contrib/tsearch2/snowball/english_stem.h b/contrib/tsearch2/snowball/english_stem.h new file mode 100644 index 0000000000..e685dcf7ef --- /dev/null +++ b/contrib/tsearch2/snowball/english_stem.h @@ -0,0 +1,16 @@ + +/* This file was generated automatically by the Snowball to ANSI C compiler */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern struct SN_env * english_ISO_8859_1_create_env(void); +extern void english_ISO_8859_1_close_env(struct SN_env * z); + +extern int english_ISO_8859_1_stem(struct SN_env * z); + +#ifdef __cplusplus +} +#endif + diff --git a/contrib/tsearch2/snowball/header.h b/contrib/tsearch2/snowball/header.h new file mode 100644 index 0000000000..c0721d6fd3 --- /dev/null +++ b/contrib/tsearch2/snowball/header.h @@ -0,0 +1,58 @@ + +#include + +#include "api.h" + +#define MAXINT INT_MAX +#define MININT INT_MIN + +#define HEAD 2*sizeof(int) + +#define SIZE(p) ((int *)(p))[-1] +#define SET_SIZE(p, n) ((int *)(p))[-1] = n +#define CAPACITY(p) ((int *)(p))[-2] + +struct among +{ int s_size; /* number of chars in string */ + symbol * s; /* search string */ + int substring_i;/* index to longest matching substring */ + int result; /* result of the lookup */ + int (* function)(struct SN_env *); +}; + +extern symbol * create_s(void); +extern void lose_s(symbol * p); + +extern int skip_utf8(const symbol * p, int c, int lb, int l, int n); + +extern int in_grouping_U(struct SN_env * z, unsigned char * s, int min, int max); +extern int in_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max); +extern int out_grouping_U(struct SN_env * z, unsigned char * s, int min, int max); +extern int out_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max); + +extern int in_grouping(struct SN_env * z, unsigned char * s, int min, int max); +extern int in_grouping_b(struct SN_env * z, unsigned char * s, int min, int max); +extern int out_grouping(struct SN_env * z, unsigned char * s, int min, int max); +extern int out_grouping_b(struct SN_env * z, unsigned char * s, int min, int max); + +extern int eq_s(struct SN_env * z, int s_size, symbol * s); +extern int eq_s_b(struct SN_env * z, int s_size, symbol * s); +extern int eq_v(struct SN_env * z, symbol * p); +extern int eq_v_b(struct SN_env * z, symbol * p); + +extern int find_among(struct SN_env * z, struct among * v, int v_size); +extern int find_among_b(struct SN_env * z, struct among * v, int v_size); + +extern int replace_s(struct SN_env * z, int c_bra, int c_ket, int s_size, const symbol * s, int * adjustment); +extern int slice_from_s(struct SN_env * z, int s_size, symbol * s); +extern int slice_from_v(struct SN_env * z, symbol * p); +extern int slice_del(struct SN_env * z); + +extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, symbol * s); +extern int insert_v(struct SN_env * z, int bra, int ket, symbol * p); + +extern symbol * slice_to(struct SN_env * z, symbol * p); +extern symbol * assign_to(struct SN_env * z, symbol * p); + +extern void debug(struct SN_env * z, int number, int line_count); + diff --git a/contrib/tsearch2/snowball/russian_stem.c b/contrib/tsearch2/snowball/russian_stem.c new file mode 100644 index 0000000000..b9b453da86 --- /dev/null +++ b/contrib/tsearch2/snowball/russian_stem.c @@ -0,0 +1,701 @@ + +/* This file was generated automatically by the Snowball to ANSI C compiler */ + +#include "header.h" + +extern int russian_KOI8_R_stem(struct SN_env * z); +static int r_tidy_up(struct SN_env * z); +static int r_derivational(struct SN_env * z); +static int r_noun(struct SN_env * z); +static int r_verb(struct SN_env * z); +static int r_reflexive(struct SN_env * z); +static int r_adjectival(struct SN_env * z); +static int r_adjective(struct SN_env * z); +static int r_perfective_gerund(struct SN_env * z); +static int r_R2(struct SN_env * z); +static int r_mark_regions(struct SN_env * z); + +extern struct SN_env * russian_KOI8_R_create_env(void); +extern void russian_KOI8_R_close_env(struct SN_env * z); + +static symbol s_0_0[3] = { 0xD7, 0xDB, 0xC9 }; +static symbol s_0_1[4] = { 0xC9, 0xD7, 0xDB, 0xC9 }; +static symbol s_0_2[4] = { 0xD9, 0xD7, 0xDB, 0xC9 }; +static symbol s_0_3[1] = { 0xD7 }; +static symbol s_0_4[2] = { 0xC9, 0xD7 }; +static symbol s_0_5[2] = { 0xD9, 0xD7 }; +static symbol s_0_6[5] = { 0xD7, 0xDB, 0xC9, 0xD3, 0xD8 }; +static symbol s_0_7[6] = { 0xC9, 0xD7, 0xDB, 0xC9, 0xD3, 0xD8 }; +static symbol s_0_8[6] = { 0xD9, 0xD7, 0xDB, 0xC9, 0xD3, 0xD8 }; + +static struct among a_0[9] = +{ +/* 0 */ { 3, s_0_0, -1, 1, 0}, +/* 1 */ { 4, s_0_1, 0, 2, 0}, +/* 2 */ { 4, s_0_2, 0, 2, 0}, +/* 3 */ { 1, s_0_3, -1, 1, 0}, +/* 4 */ { 2, s_0_4, 3, 2, 0}, +/* 5 */ { 2, s_0_5, 3, 2, 0}, +/* 6 */ { 5, s_0_6, -1, 1, 0}, +/* 7 */ { 6, s_0_7, 6, 2, 0}, +/* 8 */ { 6, s_0_8, 6, 2, 0} +}; + +static symbol s_1_0[2] = { 0xC0, 0xC0 }; +static symbol s_1_1[2] = { 0xC5, 0xC0 }; +static symbol s_1_2[2] = { 0xCF, 0xC0 }; +static symbol s_1_3[2] = { 0xD5, 0xC0 }; +static symbol s_1_4[2] = { 0xC5, 0xC5 }; +static symbol s_1_5[2] = { 0xC9, 0xC5 }; +static symbol s_1_6[2] = { 0xCF, 0xC5 }; +static symbol s_1_7[2] = { 0xD9, 0xC5 }; +static symbol s_1_8[2] = { 0xC9, 0xC8 }; +static symbol s_1_9[2] = { 0xD9, 0xC8 }; +static symbol s_1_10[3] = { 0xC9, 0xCD, 0xC9 }; +static symbol s_1_11[3] = { 0xD9, 0xCD, 0xC9 }; +static symbol s_1_12[2] = { 0xC5, 0xCA }; +static symbol s_1_13[2] = { 0xC9, 0xCA }; +static symbol s_1_14[2] = { 0xCF, 0xCA }; +static symbol s_1_15[2] = { 0xD9, 0xCA }; +static symbol s_1_16[2] = { 0xC5, 0xCD }; +static symbol s_1_17[2] = { 0xC9, 0xCD }; +static symbol s_1_18[2] = { 0xCF, 0xCD }; +static symbol s_1_19[2] = { 0xD9, 0xCD }; +static symbol s_1_20[3] = { 0xC5, 0xC7, 0xCF }; +static symbol s_1_21[3] = { 0xCF, 0xC7, 0xCF }; +static symbol s_1_22[2] = { 0xC1, 0xD1 }; +static symbol s_1_23[2] = { 0xD1, 0xD1 }; +static symbol s_1_24[3] = { 0xC5, 0xCD, 0xD5 }; +static symbol s_1_25[3] = { 0xCF, 0xCD, 0xD5 }; + +static struct among a_1[26] = +{ +/* 0 */ { 2, s_1_0, -1, 1, 0}, +/* 1 */ { 2, s_1_1, -1, 1, 0}, +/* 2 */ { 2, s_1_2, -1, 1, 0}, +/* 3 */ { 2, s_1_3, -1, 1, 0}, +/* 4 */ { 2, s_1_4, -1, 1, 0}, +/* 5 */ { 2, s_1_5, -1, 1, 0}, +/* 6 */ { 2, s_1_6, -1, 1, 0}, +/* 7 */ { 2, s_1_7, -1, 1, 0}, +/* 8 */ { 2, s_1_8, -1, 1, 0}, +/* 9 */ { 2, s_1_9, -1, 1, 0}, +/* 10 */ { 3, s_1_10, -1, 1, 0}, +/* 11 */ { 3, s_1_11, -1, 1, 0}, +/* 12 */ { 2, s_1_12, -1, 1, 0}, +/* 13 */ { 2, s_1_13, -1, 1, 0}, +/* 14 */ { 2, s_1_14, -1, 1, 0}, +/* 15 */ { 2, s_1_15, -1, 1, 0}, +/* 16 */ { 2, s_1_16, -1, 1, 0}, +/* 17 */ { 2, s_1_17, -1, 1, 0}, +/* 18 */ { 2, s_1_18, -1, 1, 0}, +/* 19 */ { 2, s_1_19, -1, 1, 0}, +/* 20 */ { 3, s_1_20, -1, 1, 0}, +/* 21 */ { 3, s_1_21, -1, 1, 0}, +/* 22 */ { 2, s_1_22, -1, 1, 0}, +/* 23 */ { 2, s_1_23, -1, 1, 0}, +/* 24 */ { 3, s_1_24, -1, 1, 0}, +/* 25 */ { 3, s_1_25, -1, 1, 0} +}; + +static symbol s_2_0[2] = { 0xC5, 0xCD }; +static symbol s_2_1[2] = { 0xCE, 0xCE }; +static symbol s_2_2[2] = { 0xD7, 0xDB }; +static symbol s_2_3[3] = { 0xC9, 0xD7, 0xDB }; +static symbol s_2_4[3] = { 0xD9, 0xD7, 0xDB }; +static symbol s_2_5[1] = { 0xDD }; +static symbol s_2_6[2] = { 0xC0, 0xDD }; +static symbol s_2_7[3] = { 0xD5, 0xC0, 0xDD }; + +static struct among a_2[8] = +{ +/* 0 */ { 2, s_2_0, -1, 1, 0}, +/* 1 */ { 2, s_2_1, -1, 1, 0}, +/* 2 */ { 2, s_2_2, -1, 1, 0}, +/* 3 */ { 3, s_2_3, 2, 2, 0}, +/* 4 */ { 3, s_2_4, 2, 2, 0}, +/* 5 */ { 1, s_2_5, -1, 1, 0}, +/* 6 */ { 2, s_2_6, 5, 1, 0}, +/* 7 */ { 3, s_2_7, 6, 2, 0} +}; + +static symbol s_3_0[2] = { 0xD3, 0xD1 }; +static symbol s_3_1[2] = { 0xD3, 0xD8 }; + +static struct among a_3[2] = +{ +/* 0 */ { 2, s_3_0, -1, 1, 0}, +/* 1 */ { 2, s_3_1, -1, 1, 0} +}; + +static symbol s_4_0[1] = { 0xC0 }; +static symbol s_4_1[2] = { 0xD5, 0xC0 }; +static symbol s_4_2[2] = { 0xCC, 0xC1 }; +static symbol s_4_3[3] = { 0xC9, 0xCC, 0xC1 }; +static symbol s_4_4[3] = { 0xD9, 0xCC, 0xC1 }; +static symbol s_4_5[2] = { 0xCE, 0xC1 }; +static symbol s_4_6[3] = { 0xC5, 0xCE, 0xC1 }; +static symbol s_4_7[3] = { 0xC5, 0xD4, 0xC5 }; +static symbol s_4_8[3] = { 0xC9, 0xD4, 0xC5 }; +static symbol s_4_9[3] = { 0xCA, 0xD4, 0xC5 }; +static symbol s_4_10[4] = { 0xC5, 0xCA, 0xD4, 0xC5 }; +static symbol s_4_11[4] = { 0xD5, 0xCA, 0xD4, 0xC5 }; +static symbol s_4_12[2] = { 0xCC, 0xC9 }; +static symbol s_4_13[3] = { 0xC9, 0xCC, 0xC9 }; +static symbol s_4_14[3] = { 0xD9, 0xCC, 0xC9 }; +static symbol s_4_15[1] = { 0xCA }; +static symbol s_4_16[2] = { 0xC5, 0xCA }; +static symbol s_4_17[2] = { 0xD5, 0xCA }; +static symbol s_4_18[1] = { 0xCC }; +static symbol s_4_19[2] = { 0xC9, 0xCC }; +static symbol s_4_20[2] = { 0xD9, 0xCC }; +static symbol s_4_21[2] = { 0xC5, 0xCD }; +static symbol s_4_22[2] = { 0xC9, 0xCD }; +static symbol s_4_23[2] = { 0xD9, 0xCD }; +static symbol s_4_24[1] = { 0xCE }; +static symbol s_4_25[2] = { 0xC5, 0xCE }; +static symbol s_4_26[2] = { 0xCC, 0xCF }; +static symbol s_4_27[3] = { 0xC9, 0xCC, 0xCF }; +static symbol s_4_28[3] = { 0xD9, 0xCC, 0xCF }; +static symbol s_4_29[2] = { 0xCE, 0xCF }; +static symbol s_4_30[3] = { 0xC5, 0xCE, 0xCF }; +static symbol s_4_31[3] = { 0xCE, 0xCE, 0xCF }; +static symbol s_4_32[2] = { 0xC0, 0xD4 }; +static symbol s_4_33[3] = { 0xD5, 0xC0, 0xD4 }; +static symbol s_4_34[2] = { 0xC5, 0xD4 }; +static symbol s_4_35[3] = { 0xD5, 0xC5, 0xD4 }; +static symbol s_4_36[2] = { 0xC9, 0xD4 }; +static symbol s_4_37[2] = { 0xD1, 0xD4 }; +static symbol s_4_38[2] = { 0xD9, 0xD4 }; +static symbol s_4_39[2] = { 0xD4, 0xD8 }; +static symbol s_4_40[3] = { 0xC9, 0xD4, 0xD8 }; +static symbol s_4_41[3] = { 0xD9, 0xD4, 0xD8 }; +static symbol s_4_42[3] = { 0xC5, 0xDB, 0xD8 }; +static symbol s_4_43[3] = { 0xC9, 0xDB, 0xD8 }; +static symbol s_4_44[2] = { 0xCE, 0xD9 }; +static symbol s_4_45[3] = { 0xC5, 0xCE, 0xD9 }; + +static struct among a_4[46] = +{ +/* 0 */ { 1, s_4_0, -1, 2, 0}, +/* 1 */ { 2, s_4_1, 0, 2, 0}, +/* 2 */ { 2, s_4_2, -1, 1, 0}, +/* 3 */ { 3, s_4_3, 2, 2, 0}, +/* 4 */ { 3, s_4_4, 2, 2, 0}, +/* 5 */ { 2, s_4_5, -1, 1, 0}, +/* 6 */ { 3, s_4_6, 5, 2, 0}, +/* 7 */ { 3, s_4_7, -1, 1, 0}, +/* 8 */ { 3, s_4_8, -1, 2, 0}, +/* 9 */ { 3, s_4_9, -1, 1, 0}, +/* 10 */ { 4, s_4_10, 9, 2, 0}, +/* 11 */ { 4, s_4_11, 9, 2, 0}, +/* 12 */ { 2, s_4_12, -1, 1, 0}, +/* 13 */ { 3, s_4_13, 12, 2, 0}, +/* 14 */ { 3, s_4_14, 12, 2, 0}, +/* 15 */ { 1, s_4_15, -1, 1, 0}, +/* 16 */ { 2, s_4_16, 15, 2, 0}, +/* 17 */ { 2, s_4_17, 15, 2, 0}, +/* 18 */ { 1, s_4_18, -1, 1, 0}, +/* 19 */ { 2, s_4_19, 18, 2, 0}, +/* 20 */ { 2, s_4_20, 18, 2, 0}, +/* 21 */ { 2, s_4_21, -1, 1, 0}, +/* 22 */ { 2, s_4_22, -1, 2, 0}, +/* 23 */ { 2, s_4_23, -1, 2, 0}, +/* 24 */ { 1, s_4_24, -1, 1, 0}, +/* 25 */ { 2, s_4_25, 24, 2, 0}, +/* 26 */ { 2, s_4_26, -1, 1, 0}, +/* 27 */ { 3, s_4_27, 26, 2, 0}, +/* 28 */ { 3, s_4_28, 26, 2, 0}, +/* 29 */ { 2, s_4_29, -1, 1, 0}, +/* 30 */ { 3, s_4_30, 29, 2, 0}, +/* 31 */ { 3, s_4_31, 29, 1, 0}, +/* 32 */ { 2, s_4_32, -1, 1, 0}, +/* 33 */ { 3, s_4_33, 32, 2, 0}, +/* 34 */ { 2, s_4_34, -1, 1, 0}, +/* 35 */ { 3, s_4_35, 34, 2, 0}, +/* 36 */ { 2, s_4_36, -1, 2, 0}, +/* 37 */ { 2, s_4_37, -1, 2, 0}, +/* 38 */ { 2, s_4_38, -1, 2, 0}, +/* 39 */ { 2, s_4_39, -1, 1, 0}, +/* 40 */ { 3, s_4_40, 39, 2, 0}, +/* 41 */ { 3, s_4_41, 39, 2, 0}, +/* 42 */ { 3, s_4_42, -1, 1, 0}, +/* 43 */ { 3, s_4_43, -1, 2, 0}, +/* 44 */ { 2, s_4_44, -1, 1, 0}, +/* 45 */ { 3, s_4_45, 44, 2, 0} +}; + +static symbol s_5_0[1] = { 0xC0 }; +static symbol s_5_1[2] = { 0xC9, 0xC0 }; +static symbol s_5_2[2] = { 0xD8, 0xC0 }; +static symbol s_5_3[1] = { 0xC1 }; +static symbol s_5_4[1] = { 0xC5 }; +static symbol s_5_5[2] = { 0xC9, 0xC5 }; +static symbol s_5_6[2] = { 0xD8, 0xC5 }; +static symbol s_5_7[2] = { 0xC1, 0xC8 }; +static symbol s_5_8[2] = { 0xD1, 0xC8 }; +static symbol s_5_9[3] = { 0xC9, 0xD1, 0xC8 }; +static symbol s_5_10[1] = { 0xC9 }; +static symbol s_5_11[2] = { 0xC5, 0xC9 }; +static symbol s_5_12[2] = { 0xC9, 0xC9 }; +static symbol s_5_13[3] = { 0xC1, 0xCD, 0xC9 }; +static symbol s_5_14[3] = { 0xD1, 0xCD, 0xC9 }; +static symbol s_5_15[4] = { 0xC9, 0xD1, 0xCD, 0xC9 }; +static symbol s_5_16[1] = { 0xCA }; +static symbol s_5_17[2] = { 0xC5, 0xCA }; +static symbol s_5_18[3] = { 0xC9, 0xC5, 0xCA }; +static symbol s_5_19[2] = { 0xC9, 0xCA }; +static symbol s_5_20[2] = { 0xCF, 0xCA }; +static symbol s_5_21[2] = { 0xC1, 0xCD }; +static symbol s_5_22[2] = { 0xC5, 0xCD }; +static symbol s_5_23[3] = { 0xC9, 0xC5, 0xCD }; +static symbol s_5_24[2] = { 0xCF, 0xCD }; +static symbol s_5_25[2] = { 0xD1, 0xCD }; +static symbol s_5_26[3] = { 0xC9, 0xD1, 0xCD }; +static symbol s_5_27[1] = { 0xCF }; +static symbol s_5_28[1] = { 0xD1 }; +static symbol s_5_29[2] = { 0xC9, 0xD1 }; +static symbol s_5_30[2] = { 0xD8, 0xD1 }; +static symbol s_5_31[1] = { 0xD5 }; +static symbol s_5_32[2] = { 0xC5, 0xD7 }; +static symbol s_5_33[2] = { 0xCF, 0xD7 }; +static symbol s_5_34[1] = { 0xD8 }; +static symbol s_5_35[1] = { 0xD9 }; + +static struct among a_5[36] = +{ +/* 0 */ { 1, s_5_0, -1, 1, 0}, +/* 1 */ { 2, s_5_1, 0, 1, 0}, +/* 2 */ { 2, s_5_2, 0, 1, 0}, +/* 3 */ { 1, s_5_3, -1, 1, 0}, +/* 4 */ { 1, s_5_4, -1, 1, 0}, +/* 5 */ { 2, s_5_5, 4, 1, 0}, +/* 6 */ { 2, s_5_6, 4, 1, 0}, +/* 7 */ { 2, s_5_7, -1, 1, 0}, +/* 8 */ { 2, s_5_8, -1, 1, 0}, +/* 9 */ { 3, s_5_9, 8, 1, 0}, +/* 10 */ { 1, s_5_10, -1, 1, 0}, +/* 11 */ { 2, s_5_11, 10, 1, 0}, +/* 12 */ { 2, s_5_12, 10, 1, 0}, +/* 13 */ { 3, s_5_13, 10, 1, 0}, +/* 14 */ { 3, s_5_14, 10, 1, 0}, +/* 15 */ { 4, s_5_15, 14, 1, 0}, +/* 16 */ { 1, s_5_16, -1, 1, 0}, +/* 17 */ { 2, s_5_17, 16, 1, 0}, +/* 18 */ { 3, s_5_18, 17, 1, 0}, +/* 19 */ { 2, s_5_19, 16, 1, 0}, +/* 20 */ { 2, s_5_20, 16, 1, 0}, +/* 21 */ { 2, s_5_21, -1, 1, 0}, +/* 22 */ { 2, s_5_22, -1, 1, 0}, +/* 23 */ { 3, s_5_23, 22, 1, 0}, +/* 24 */ { 2, s_5_24, -1, 1, 0}, +/* 25 */ { 2, s_5_25, -1, 1, 0}, +/* 26 */ { 3, s_5_26, 25, 1, 0}, +/* 27 */ { 1, s_5_27, -1, 1, 0}, +/* 28 */ { 1, s_5_28, -1, 1, 0}, +/* 29 */ { 2, s_5_29, 28, 1, 0}, +/* 30 */ { 2, s_5_30, 28, 1, 0}, +/* 31 */ { 1, s_5_31, -1, 1, 0}, +/* 32 */ { 2, s_5_32, -1, 1, 0}, +/* 33 */ { 2, s_5_33, -1, 1, 0}, +/* 34 */ { 1, s_5_34, -1, 1, 0}, +/* 35 */ { 1, s_5_35, -1, 1, 0} +}; + +static symbol s_6_0[3] = { 0xCF, 0xD3, 0xD4 }; +static symbol s_6_1[4] = { 0xCF, 0xD3, 0xD4, 0xD8 }; + +static struct among a_6[2] = +{ +/* 0 */ { 3, s_6_0, -1, 1, 0}, +/* 1 */ { 4, s_6_1, -1, 1, 0} +}; + +static symbol s_7_0[4] = { 0xC5, 0xCA, 0xDB, 0xC5 }; +static symbol s_7_1[1] = { 0xCE }; +static symbol s_7_2[1] = { 0xD8 }; +static symbol s_7_3[3] = { 0xC5, 0xCA, 0xDB }; + +static struct among a_7[4] = +{ +/* 0 */ { 4, s_7_0, -1, 1, 0}, +/* 1 */ { 1, s_7_1, -1, 2, 0}, +/* 2 */ { 1, s_7_2, -1, 3, 0}, +/* 3 */ { 3, s_7_3, -1, 1, 0} +}; + +static unsigned char g_v[] = { 35, 130, 34, 18 }; + +static symbol s_0[] = { 0xC1 }; +static symbol s_1[] = { 0xD1 }; +static symbol s_2[] = { 0xC1 }; +static symbol s_3[] = { 0xD1 }; +static symbol s_4[] = { 0xC1 }; +static symbol s_5[] = { 0xD1 }; +static symbol s_6[] = { 0xCE }; +static symbol s_7[] = { 0xCE }; +static symbol s_8[] = { 0xCE }; +static symbol s_9[] = { 0xC9 }; + +static int r_mark_regions(struct SN_env * z) { + z->I[0] = z->l; + z->I[1] = z->l; + { int c = z->c; /* do, line 63 */ + while(1) { /* gopast, line 64 */ + if (!(in_grouping(z, g_v, 192, 220))) goto lab1; + break; + lab1: + if (z->c >= z->l) goto lab0; + z->c++; /* gopast, line 64 */ + } + z->I[0] = z->c; /* setmark pV, line 64 */ + while(1) { /* gopast, line 64 */ + if (!(out_grouping(z, g_v, 192, 220))) goto lab2; + break; + lab2: + if (z->c >= z->l) goto lab0; + z->c++; /* gopast, line 64 */ + } + while(1) { /* gopast, line 65 */ + if (!(in_grouping(z, g_v, 192, 220))) goto lab3; + break; + lab3: + if (z->c >= z->l) goto lab0; + z->c++; /* gopast, line 65 */ + } + while(1) { /* gopast, line 65 */ + if (!(out_grouping(z, g_v, 192, 220))) goto lab4; + break; + lab4: + if (z->c >= z->l) goto lab0; + z->c++; /* gopast, line 65 */ + } + z->I[1] = z->c; /* setmark p2, line 65 */ + lab0: + z->c = c; + } + return 1; +} + +static int r_R2(struct SN_env * z) { + if (!(z->I[1] <= z->c)) return 0; + return 1; +} + +static int r_perfective_gerund(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 74 */ + among_var = find_among_b(z, a_0, 9); /* substring, line 74 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 74 */ + switch(among_var) { + case 0: return 0; + case 1: + { int m = z->l - z->c; (void) m; /* or, line 78 */ + if (!(eq_s_b(z, 1, s_0))) goto lab1; + goto lab0; + lab1: + z->c = z->l - m; + if (!(eq_s_b(z, 1, s_1))) return 0; + } + lab0: + { int ret; + ret = slice_del(z); /* delete, line 78 */ + if (ret < 0) return ret; + } + break; + case 2: + { int ret; + ret = slice_del(z); /* delete, line 85 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_adjective(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 90 */ + among_var = find_among_b(z, a_1, 26); /* substring, line 90 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 90 */ + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + ret = slice_del(z); /* delete, line 99 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_adjectival(struct SN_env * z) { + int among_var; + { int ret = r_adjective(z); + if (ret == 0) return 0; /* call adjective, line 104 */ + if (ret < 0) return ret; + } + { int m = z->l - z->c; (void) m; /* try, line 111 */ + z->ket = z->c; /* [, line 112 */ + among_var = find_among_b(z, a_2, 8); /* substring, line 112 */ + if (!(among_var)) { z->c = z->l - m; goto lab0; } + z->bra = z->c; /* ], line 112 */ + switch(among_var) { + case 0: { z->c = z->l - m; goto lab0; } + case 1: + { int m = z->l - z->c; (void) m; /* or, line 117 */ + if (!(eq_s_b(z, 1, s_2))) goto lab2; + goto lab1; + lab2: + z->c = z->l - m; + if (!(eq_s_b(z, 1, s_3))) { z->c = z->l - m; goto lab0; } + } + lab1: + { int ret; + ret = slice_del(z); /* delete, line 117 */ + if (ret < 0) return ret; + } + break; + case 2: + { int ret; + ret = slice_del(z); /* delete, line 124 */ + if (ret < 0) return ret; + } + break; + } + lab0: + ; + } + return 1; +} + +static int r_reflexive(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 131 */ + among_var = find_among_b(z, a_3, 2); /* substring, line 131 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 131 */ + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + ret = slice_del(z); /* delete, line 134 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_verb(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 139 */ + among_var = find_among_b(z, a_4, 46); /* substring, line 139 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 139 */ + switch(among_var) { + case 0: return 0; + case 1: + { int m = z->l - z->c; (void) m; /* or, line 145 */ + if (!(eq_s_b(z, 1, s_4))) goto lab1; + goto lab0; + lab1: + z->c = z->l - m; + if (!(eq_s_b(z, 1, s_5))) return 0; + } + lab0: + { int ret; + ret = slice_del(z); /* delete, line 145 */ + if (ret < 0) return ret; + } + break; + case 2: + { int ret; + ret = slice_del(z); /* delete, line 153 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_noun(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 162 */ + among_var = find_among_b(z, a_5, 36); /* substring, line 162 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 162 */ + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + ret = slice_del(z); /* delete, line 169 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_derivational(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 178 */ + among_var = find_among_b(z, a_6, 2); /* substring, line 178 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 178 */ + { int ret = r_R2(z); + if (ret == 0) return 0; /* call R2, line 178 */ + if (ret < 0) return ret; + } + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + ret = slice_del(z); /* delete, line 181 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +static int r_tidy_up(struct SN_env * z) { + int among_var; + z->ket = z->c; /* [, line 186 */ + among_var = find_among_b(z, a_7, 4); /* substring, line 186 */ + if (!(among_var)) return 0; + z->bra = z->c; /* ], line 186 */ + switch(among_var) { + case 0: return 0; + case 1: + { int ret; + ret = slice_del(z); /* delete, line 190 */ + if (ret < 0) return ret; + } + z->ket = z->c; /* [, line 191 */ + if (!(eq_s_b(z, 1, s_6))) return 0; + z->bra = z->c; /* ], line 191 */ + if (!(eq_s_b(z, 1, s_7))) return 0; + { int ret; + ret = slice_del(z); /* delete, line 191 */ + if (ret < 0) return ret; + } + break; + case 2: + if (!(eq_s_b(z, 1, s_8))) return 0; + { int ret; + ret = slice_del(z); /* delete, line 194 */ + if (ret < 0) return ret; + } + break; + case 3: + { int ret; + ret = slice_del(z); /* delete, line 196 */ + if (ret < 0) return ret; + } + break; + } + return 1; +} + +extern int russian_KOI8_R_stem(struct SN_env * z) { + { int c = z->c; /* do, line 203 */ + { int ret = r_mark_regions(z); + if (ret == 0) goto lab0; /* call mark_regions, line 203 */ + if (ret < 0) return ret; + } + lab0: + z->c = c; + } + z->lb = z->c; z->c = z->l; /* backwards, line 204 */ + + { int m3; /* setlimit, line 204 */ + int m = z->l - z->c; (void) m; + if (z->c < z->I[0]) return 0; + z->c = z->I[0]; /* tomark, line 204 */ + m3 = z->lb; z->lb = z->c; + z->c = z->l - m; + { int m = z->l - z->c; (void) m; /* do, line 205 */ + { int m = z->l - z->c; (void) m; /* or, line 206 */ + { int ret = r_perfective_gerund(z); + if (ret == 0) goto lab3; /* call perfective_gerund, line 206 */ + if (ret < 0) return ret; + } + goto lab2; + lab3: + z->c = z->l - m; + { int m = z->l - z->c; (void) m; /* try, line 207 */ + { int ret = r_reflexive(z); + if (ret == 0) { z->c = z->l - m; goto lab4; } /* call reflexive, line 207 */ + if (ret < 0) return ret; + } + lab4: + ; + } + { int m = z->l - z->c; (void) m; /* or, line 208 */ + { int ret = r_adjectival(z); + if (ret == 0) goto lab6; /* call adjectival, line 208 */ + if (ret < 0) return ret; + } + goto lab5; + lab6: + z->c = z->l - m; + { int ret = r_verb(z); + if (ret == 0) goto lab7; /* call verb, line 208 */ + if (ret < 0) return ret; + } + goto lab5; + lab7: + z->c = z->l - m; + { int ret = r_noun(z); + if (ret == 0) goto lab1; /* call noun, line 208 */ + if (ret < 0) return ret; + } + } + lab5: + ; + } + lab2: + lab1: + z->c = z->l - m; + } + { int m = z->l - z->c; (void) m; /* try, line 211 */ + z->ket = z->c; /* [, line 211 */ + if (!(eq_s_b(z, 1, s_9))) { z->c = z->l - m; goto lab8; } + z->bra = z->c; /* ], line 211 */ + { int ret; + ret = slice_del(z); /* delete, line 211 */ + if (ret < 0) return ret; + } + lab8: + ; + } + { int m = z->l - z->c; (void) m; /* do, line 214 */ + { int ret = r_derivational(z); + if (ret == 0) goto lab9; /* call derivational, line 214 */ + if (ret < 0) return ret; + } + lab9: + z->c = z->l - m; + } + { int m = z->l - z->c; (void) m; /* do, line 215 */ + { int ret = r_tidy_up(z); + if (ret == 0) goto lab10; /* call tidy_up, line 215 */ + if (ret < 0) return ret; + } + lab10: + z->c = z->l - m; + } + z->lb = m3; + } + z->c = z->lb; + return 1; +} + +extern struct SN_env * russian_KOI8_R_create_env(void) { return SN_create_env(0, 2, 0); } + +extern void russian_KOI8_R_close_env(struct SN_env * z) { SN_close_env(z); } + diff --git a/contrib/tsearch2/snowball/russian_stem.h b/contrib/tsearch2/snowball/russian_stem.h new file mode 100644 index 0000000000..de2179d29f --- /dev/null +++ b/contrib/tsearch2/snowball/russian_stem.h @@ -0,0 +1,16 @@ + +/* This file was generated automatically by the Snowball to ANSI C compiler */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern struct SN_env * russian_KOI8_R_create_env(void); +extern void russian_KOI8_R_close_env(struct SN_env * z); + +extern int russian_KOI8_R_stem(struct SN_env * z); + +#ifdef __cplusplus +} +#endif + diff --git a/contrib/tsearch2/snowball/utilities.c b/contrib/tsearch2/snowball/utilities.c new file mode 100644 index 0000000000..a6bfa5c76a --- /dev/null +++ b/contrib/tsearch2/snowball/utilities.c @@ -0,0 +1,446 @@ + +#include +#include +#include + +#include "header.h" + +#define unless(C) if(!(C)) + +#define CREATE_SIZE 1 + +extern symbol * create_s(void) { + symbol * p; + void * mem = malloc(HEAD + (CREATE_SIZE + 1) * sizeof(symbol)); + if (mem == NULL) return NULL; + p = (symbol *) (HEAD + (char *) mem); + CAPACITY(p) = CREATE_SIZE; + SET_SIZE(p, CREATE_SIZE); + return p; +} + +extern void lose_s(symbol * p) { + if (p == NULL) return; + free((char *) p - HEAD); +} + +/* + new_p = X_skip_utf8(p, c, lb, l, n); skips n characters forwards from p + c + if n +ve, or n characters backwards from p +c - 1 if n -ve. new_p is the new + position, or 0 on failure. + + -- used to implement hop and next in the utf8 case. +*/ + +extern int skip_utf8(const symbol * p, int c, int lb, int l, int n) { + int b; + if (n >= 0) { + for (; n > 0; n--) { + if (c >= l) return -1; + b = p[c++]; + if (b >= 0xC0) { /* 1100 0000 */ + while (c < l) { + b = p[c]; + if (b >= 0xC0 || b < 0x80) break; + /* break unless b is 10------ */ + c++; + } + } + } + } else { + for (; n < 0; n++) { + if (c <= lb) return -1; + b = p[--c]; + if (b >= 0x80) { /* 1000 0000 */ + while (c > lb) { + b = p[c]; + if (b >= 0xC0) break; /* 1100 0000 */ + c--; + } + } + } + } + return c; +} + +/* Code for character groupings: utf8 cases */ + +static int get_utf8(const symbol * p, int c, int l, int * slot) { + int b0, b1; + if (c >= l) return 0; + b0 = p[c++]; + if (b0 < 0xC0 || c == l) { /* 1100 0000 */ + * slot = b0; return 1; + } + b1 = p[c++]; + if (b0 < 0xE0 || c == l) { /* 1110 0000 */ + * slot = (b0 & 0x1F) << 6 | (b1 & 0x3F); return 2; + } + * slot = (b0 & 0xF) << 12 | (b1 & 0x3F) << 6 | (*p & 0x3F); return 3; +} + +static int get_b_utf8(const symbol * p, int c, int lb, int * slot) { + int b0, b1; + if (c <= lb) return 0; + b0 = p[--c]; + if (b0 < 0x80 || c == lb) { /* 1000 0000 */ + * slot = b0; return 1; + } + b1 = p[--c]; + if (b1 >= 0xC0 || c == lb) { /* 1100 0000 */ + * slot = (b1 & 0x1F) << 6 | (b0 & 0x3F); return 2; + } + * slot = (*p & 0xF) << 12 | (b1 & 0x3F) << 6 | (b0 & 0x3F); return 3; +} + +extern int in_grouping_U(struct SN_env * z, unsigned char * s, int min, int max) { + int ch; + int w = get_utf8(z->p, z->c, z->l, & ch); + unless (w) return 0; + if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; + z->c += w; return 1; +} + +extern int in_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max) { + int ch; + int w = get_b_utf8(z->p, z->c, z->lb, & ch); + unless (w) return 0; + if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; + z->c -= w; return 1; +} + +extern int out_grouping_U(struct SN_env * z, unsigned char * s, int min, int max) { + int ch; + int w = get_utf8(z->p, z->c, z->l, & ch); + unless (w) return 0; + unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; + z->c += w; return 1; +} + +extern int out_grouping_b_U(struct SN_env * z, unsigned char * s, int min, int max) { + int ch; + int w = get_b_utf8(z->p, z->c, z->lb, & ch); + unless (w) return 0; + unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; + z->c -= w; return 1; +} + +/* Code for character groupings: non-utf8 cases */ + +extern int in_grouping(struct SN_env * z, unsigned char * s, int min, int max) { + int ch; + if (z->c >= z->l) return 0; + ch = z->p[z->c]; + if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; + z->c++; return 1; +} + +extern int in_grouping_b(struct SN_env * z, unsigned char * s, int min, int max) { + int ch; + if (z->c <= z->lb) return 0; + ch = z->p[z->c - 1]; + if (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; + z->c--; return 1; +} + +extern int out_grouping(struct SN_env * z, unsigned char * s, int min, int max) { + int ch; + if (z->c >= z->l) return 0; + ch = z->p[z->c]; + unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; + z->c++; return 1; +} + +extern int out_grouping_b(struct SN_env * z, unsigned char * s, int min, int max) { + int ch; + if (z->c <= z->lb) return 0; + ch = z->p[z->c - 1]; + unless (ch > max || (ch -= min) < 0 || (s[ch >> 3] & (0X1 << (ch & 0X7))) == 0) return 0; + z->c--; return 1; +} + +extern int eq_s(struct SN_env * z, int s_size, symbol * s) { + if (z->l - z->c < s_size || memcmp(z->p + z->c, s, s_size * sizeof(symbol)) != 0) return 0; + z->c += s_size; return 1; +} + +extern int eq_s_b(struct SN_env * z, int s_size, symbol * s) { + if (z->c - z->lb < s_size || memcmp(z->p + z->c - s_size, s, s_size * sizeof(symbol)) != 0) return 0; + z->c -= s_size; return 1; +} + +extern int eq_v(struct SN_env * z, symbol * p) { + return eq_s(z, SIZE(p), p); +} + +extern int eq_v_b(struct SN_env * z, symbol * p) { + return eq_s_b(z, SIZE(p), p); +} + +extern int find_among(struct SN_env * z, struct among * v, int v_size) { + + int i = 0; + int j = v_size; + + int c = z->c; int l = z->l; + symbol * q = z->p + c; + + struct among * w; + + int common_i = 0; + int common_j = 0; + + int first_key_inspected = 0; + + while(1) { + int k = i + ((j - i) >> 1); + int diff = 0; + int common = common_i < common_j ? common_i : common_j; /* smaller */ + w = v + k; + { + int i; for (i = common; i < w->s_size; i++) { + if (c + common == l) { diff = -1; break; } + diff = q[common] - w->s[i]; + if (diff != 0) break; + common++; + } + } + if (diff < 0) { j = k; common_j = common; } + else { i = k; common_i = common; } + if (j - i <= 1) { + if (i > 0) break; /* v->s has been inspected */ + if (j == i) break; /* only one item in v */ + + /* - but now we need to go round once more to get + v->s inspected. This looks messy, but is actually + the optimal approach. */ + + if (first_key_inspected) break; + first_key_inspected = 1; + } + } + while(1) { + w = v + i; + if (common_i >= w->s_size) { + z->c = c + w->s_size; + if (w->function == 0) return w->result; + { + int res = w->function(z); + z->c = c + w->s_size; + if (res) return w->result; + } + } + i = w->substring_i; + if (i < 0) return 0; + } +} + +/* find_among_b is for backwards processing. Same comments apply */ + +extern int find_among_b(struct SN_env * z, struct among * v, int v_size) { + + int i = 0; + int j = v_size; + + int c = z->c; int lb = z->lb; + symbol * q = z->p + c - 1; + + struct among * w; + + int common_i = 0; + int common_j = 0; + + int first_key_inspected = 0; + + while(1) { + int k = i + ((j - i) >> 1); + int diff = 0; + int common = common_i < common_j ? common_i : common_j; + w = v + k; + { + int i; for (i = w->s_size - 1 - common; i >= 0; i--) { + if (c - common == lb) { diff = -1; break; } + diff = q[- common] - w->s[i]; + if (diff != 0) break; + common++; + } + } + if (diff < 0) { j = k; common_j = common; } + else { i = k; common_i = common; } + if (j - i <= 1) { + if (i > 0) break; + if (j == i) break; + if (first_key_inspected) break; + first_key_inspected = 1; + } + } + while(1) { + w = v + i; + if (common_i >= w->s_size) { + z->c = c - w->s_size; + if (w->function == 0) return w->result; + { + int res = w->function(z); + z->c = c - w->s_size; + if (res) return w->result; + } + } + i = w->substring_i; + if (i < 0) return 0; + } +} + + +/* Increase the size of the buffer pointed to by p to at least n symbols. + * If insufficient memory, returns NULL and frees the old buffer. + */ +static symbol * increase_size(symbol * p, int n) { + symbol * q; + int new_size = n + 20; + void * mem = realloc((char *) p - HEAD, + HEAD + (new_size + 1) * sizeof(symbol)); + if (mem == NULL) { + lose_s(p); + return NULL; + } + q = (symbol *) (HEAD + (char *)mem); + CAPACITY(q) = new_size; + return q; +} + +/* to replace symbols between c_bra and c_ket in z->p by the + s_size symbols at s. + Returns 0 on success, -1 on error. + Also, frees z->p (and sets it to NULL) on error. +*/ +extern int replace_s(struct SN_env * z, int c_bra, int c_ket, int s_size, const symbol * s, int * adjptr) +{ + int adjustment; + int len; + if (z->p == NULL) { + z->p = create_s(); + if (z->p == NULL) return -1; + } + adjustment = s_size - (c_ket - c_bra); + len = SIZE(z->p); + if (adjustment != 0) { + if (adjustment + len > CAPACITY(z->p)) { + z->p = increase_size(z->p, adjustment + len); + if (z->p == NULL) return -1; + } + memmove(z->p + c_ket + adjustment, + z->p + c_ket, + (len - c_ket) * sizeof(symbol)); + SET_SIZE(z->p, adjustment + len); + z->l += adjustment; + if (z->c >= c_ket) + z->c += adjustment; + else + if (z->c > c_bra) + z->c = c_bra; + } + unless (s_size == 0) memmove(z->p + c_bra, s, s_size * sizeof(symbol)); + if (adjptr != NULL) + *adjptr = adjustment; + return 0; +} + +static int slice_check(struct SN_env * z) { + + if (z->bra < 0 || + z->bra > z->ket || + z->ket > z->l || + z->p == NULL || + z->l > SIZE(z->p)) /* this line could be removed */ + { +#if 0 + fprintf(stderr, "faulty slice operation:\n"); + debug(z, -1, 0); +#endif + return -1; + } + return 0; +} + +extern int slice_from_s(struct SN_env * z, int s_size, symbol * s) { + if (slice_check(z)) return -1; + return replace_s(z, z->bra, z->ket, s_size, s, NULL); +} + +extern int slice_from_v(struct SN_env * z, symbol * p) { + return slice_from_s(z, SIZE(p), p); +} + +extern int slice_del(struct SN_env * z) { + return slice_from_s(z, 0, 0); +} + +extern int insert_s(struct SN_env * z, int bra, int ket, int s_size, symbol * s) { + int adjustment; + if (replace_s(z, bra, ket, s_size, s, &adjustment)) + return -1; + if (bra <= z->bra) z->bra += adjustment; + if (bra <= z->ket) z->ket += adjustment; + return 0; +} + +extern int insert_v(struct SN_env * z, int bra, int ket, symbol * p) { + int adjustment; + if (replace_s(z, bra, ket, SIZE(p), p, &adjustment)) + return -1; + if (bra <= z->bra) z->bra += adjustment; + if (bra <= z->ket) z->ket += adjustment; + return 0; +} + +extern symbol * slice_to(struct SN_env * z, symbol * p) { + if (slice_check(z)) { + lose_s(p); + return NULL; + } + { + int len = z->ket - z->bra; + if (CAPACITY(p) < len) { + p = increase_size(p, len); + if (p == NULL) + return NULL; + } + memmove(p, z->p + z->bra, len * sizeof(symbol)); + SET_SIZE(p, len); + } + return p; +} + +extern symbol * assign_to(struct SN_env * z, symbol * p) { + int len = z->l; + if (CAPACITY(p) < len) { + p = increase_size(p, len); + if (p == NULL) + return NULL; + } + memmove(p, z->p, len * sizeof(symbol)); + SET_SIZE(p, len); + return p; +} + +#if 0 +extern void debug(struct SN_env * z, int number, int line_count) { + int i; + int limit = SIZE(z->p); + /*if (number >= 0) printf("%3d (line %4d): '", number, line_count);*/ + if (number >= 0) printf("%3d (line %4d): [%d]'", number, line_count,limit); + for (i = 0; i <= limit; i++) { + if (z->lb == i) printf("{"); + if (z->bra == i) printf("["); + if (z->c == i) printf("|"); + if (z->ket == i) printf("]"); + if (z->l == i) printf("}"); + if (i < limit) + { int ch = z->p[i]; + if (ch == 0) ch = '#'; + printf("%c", ch); + } + } + printf("'\n"); +} +#endif -- 2.39.5