Files
neuron/dist/morphology.c
T
will.anderson 48ecd83421 fix: restore elb build — import paths, morphology deps, C master declarations header
- Fix wrong ELP import paths in soul.el, elp-input.el, studio.el
  (../foundation/elp/src → ../foundation/el/elp/src)
- Add missing import "morphology.el" to all 29 language morphology modules
- Recompile all affected dist/*.c with correct cross-module declarations
- Add dist/elp-c-decls.h: C-level master forward declarations for ELP package
  (enables elb --force-include to resolve undeclared cross-module calls)
2026-05-08 19:43:57 -05:00

1277 lines
43 KiB
C
Generated

#include <stdint.h>
#include <stdlib.h>
#include "el_runtime.h"
el_val_t lang_profile(el_val_t code, el_val_t word_order, el_val_t morph_type, el_val_t has_case, el_val_t has_gender, el_val_t script_dir, el_val_t agreement, el_val_t null_subject);
el_val_t lang_get(el_val_t profile, el_val_t key);
el_val_t lang_profile_en(void);
el_val_t lang_profile_ja(void);
el_val_t lang_profile_ar(void);
el_val_t lang_profile_zh(void);
el_val_t lang_profile_de(void);
el_val_t lang_profile_es(void);
el_val_t lang_profile_fi(void);
el_val_t lang_profile_sw(void);
el_val_t lang_profile_hi(void);
el_val_t lang_profile_ru(void);
el_val_t lang_profile_fr(void);
el_val_t lang_profile_la(void);
el_val_t lang_profile_he(void);
el_val_t lang_profile_sa(void);
el_val_t lang_profile_got(void);
el_val_t lang_profile_non(void);
el_val_t lang_profile_enm(void);
el_val_t lang_profile_pi(void);
el_val_t lang_profile_grc(void);
el_val_t lang_profile_ang(void);
el_val_t lang_profile_fro(void);
el_val_t lang_profile_goh(void);
el_val_t lang_profile_sga(void);
el_val_t lang_profile_txb(void);
el_val_t lang_profile_peo(void);
el_val_t lang_profile_akk(void);
el_val_t lang_profile_uga(void);
el_val_t lang_profile_egy(void);
el_val_t lang_profile_sux(void);
el_val_t lang_profile_gez(void);
el_val_t lang_profile_cop(void);
el_val_t lang_from_code(el_val_t code);
el_val_t lang_default(void);
el_val_t lang_is_isolating(el_val_t profile);
el_val_t lang_is_agglutinative(el_val_t profile);
el_val_t lang_is_fusional(el_val_t profile);
el_val_t lang_is_polysynthetic(el_val_t profile);
el_val_t lang_is_rtl(el_val_t profile);
el_val_t lang_has_null_subject(el_val_t profile);
el_val_t lang_has_case(el_val_t profile);
el_val_t lang_has_gender(el_val_t profile);
el_val_t lang_word_order(el_val_t profile);
el_val_t lang_code(el_val_t profile);
el_val_t es_str_ends(el_val_t s, el_val_t suf);
el_val_t es_str_drop_last(el_val_t s, el_val_t n);
el_val_t es_str_last_char(el_val_t s);
el_val_t es_str_last2(el_val_t s);
el_val_t es_str_last3(el_val_t s);
el_val_t es_verb_class(el_val_t base);
el_val_t es_stem(el_val_t base);
el_val_t es_slot(el_val_t person, el_val_t number);
el_val_t es_irregular_present(el_val_t verb, el_val_t person, el_val_t number);
el_val_t es_irregular_preterite(el_val_t verb, el_val_t person, el_val_t number);
el_val_t es_irregular_imperfect(el_val_t verb, el_val_t person, el_val_t number);
el_val_t es_regular_present(el_val_t stem, el_val_t vclass, el_val_t slot);
el_val_t es_regular_preterite(el_val_t stem, el_val_t vclass, el_val_t slot);
el_val_t es_regular_future(el_val_t base, el_val_t slot);
el_val_t es_irregular_future_stem(el_val_t verb);
el_val_t es_regular_imperfect(el_val_t stem, el_val_t vclass, el_val_t slot);
el_val_t es_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t es_gender(el_val_t noun);
el_val_t es_invariant_plural(el_val_t noun);
el_val_t es_pluralize(el_val_t noun);
el_val_t es_starts_with_stressed_a(el_val_t noun);
el_val_t es_agree_article(el_val_t noun, el_val_t definite, el_val_t number);
el_val_t fr_str_ends(el_val_t s, el_val_t suf);
el_val_t fr_str_drop_last(el_val_t s, el_val_t n);
el_val_t fr_str_last_char(el_val_t s);
el_val_t fr_str_last2(el_val_t s);
el_val_t fr_is_vowel_start(el_val_t s);
el_val_t fr_is_known_irregular(el_val_t verb);
el_val_t fr_verb_group(el_val_t base);
el_val_t fr_stem(el_val_t base);
el_val_t fr_slot(el_val_t person, el_val_t number);
el_val_t fr_irregular_present(el_val_t verb, el_val_t person, el_val_t number);
el_val_t fr_regular_present(el_val_t stem, el_val_t vgroup, el_val_t slot);
el_val_t fr_future_stem(el_val_t base, el_val_t vgroup);
el_val_t fr_regular_future(el_val_t fstem, el_val_t slot);
el_val_t fr_irregular_future_stem(el_val_t verb);
el_val_t fr_imperfect_stem(el_val_t base, el_val_t vgroup);
el_val_t fr_regular_imperfect(el_val_t istem, el_val_t slot);
el_val_t fr_uses_etre(el_val_t verb);
el_val_t fr_past_participle(el_val_t verb);
el_val_t fr_avoir_present(el_val_t slot);
el_val_t fr_etre_present(el_val_t slot);
el_val_t fr_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t fr_gender(el_val_t noun);
el_val_t fr_invariant_plural(el_val_t noun);
el_val_t fr_pluralize(el_val_t noun);
el_val_t fr_agree_article(el_val_t noun, el_val_t definite, el_val_t number);
el_val_t fr_subject_starts_vowel(el_val_t subject);
el_val_t fr_verb_ends_vowel(el_val_t verb_form);
el_val_t fr_question_inversion(el_val_t subject, el_val_t verb_form);
el_val_t de_article_def(el_val_t gender, el_val_t gram_case, el_val_t number);
el_val_t de_article_indef(el_val_t gender, el_val_t gram_case, el_val_t number);
el_val_t de_article(el_val_t gender, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t de_adj_ending(el_val_t gender, el_val_t gram_case, el_val_t number, el_val_t article_type);
el_val_t de_noun_plural(el_val_t noun, el_val_t gender);
el_val_t de_case_ending(el_val_t noun, el_val_t gender, el_val_t gram_case, el_val_t number);
el_val_t de_conjugate_weak(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number);
el_val_t de_irregular_present(el_val_t verb, el_val_t person, el_val_t number);
el_val_t de_strong_past_stem(el_val_t verb);
el_val_t de_norm_number(el_val_t number);
el_val_t de_norm_person(el_val_t person);
el_val_t de_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t ru_gender(el_val_t noun);
el_val_t ru_stem_type(el_val_t noun, el_val_t gender);
el_val_t ru_noun_case(el_val_t noun, el_val_t gender, el_val_t gram_case, el_val_t number);
el_val_t ru_decline_regular(el_val_t noun, el_val_t gender, el_val_t stype, el_val_t gram_case, el_val_t number);
el_val_t ru_decline_masc(el_val_t noun, el_val_t stype, el_val_t gram_case, el_val_t number);
el_val_t ru_decline_fem(el_val_t noun, el_val_t stype, el_val_t gram_case, el_val_t number);
el_val_t ru_decline_neut(el_val_t noun, el_val_t stype, el_val_t gram_case, el_val_t number);
el_val_t ru_past_agree(el_val_t verb_stem, el_val_t gender, el_val_t number);
el_val_t ru_conjugate_1st(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number);
el_val_t ru_conjugate_2nd(el_val_t stem, el_val_t tense, el_val_t person, el_val_t number);
el_val_t ru_irregular(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t ru_past_stem(el_val_t verb);
el_val_t ru_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t gender);
el_val_t fi_harmony(el_val_t word);
el_val_t fi_suffix(el_val_t base, el_val_t harmony);
el_val_t fi_noun_case(el_val_t stem, el_val_t gram_case, el_val_t number, el_val_t harmony);
el_val_t fi_str_last_char(el_val_t s);
el_val_t fi_apply_case(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t fi_verb_stem(el_val_t dict_form);
el_val_t fi_irregular_verb(el_val_t dict_form);
el_val_t fi_present_ending(el_val_t stem, el_val_t person, el_val_t number, el_val_t harmony);
el_val_t fi_past_stem(el_val_t stem);
el_val_t fi_past_ending(el_val_t stem, el_val_t person, el_val_t number, el_val_t harmony);
el_val_t fi_neg_aux(el_val_t person, el_val_t number);
el_val_t fi_negative(el_val_t verb, el_val_t person, el_val_t number);
el_val_t fi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t fi_question_suffix(el_val_t harmony);
el_val_t fi_make_question(el_val_t verb_form, el_val_t harmony);
el_val_t fi_full_paradigm(el_val_t noun);
el_val_t ar_str_ends(el_val_t s, el_val_t suf);
el_val_t ar_str_len(el_val_t s);
el_val_t ar_str_drop_last(el_val_t s, el_val_t n);
el_val_t ar_str_last_char(el_val_t s);
el_val_t ar_slot(el_val_t person, el_val_t gender, el_val_t number);
el_val_t ar_perfect_suffix(el_val_t slot);
el_val_t ar_imperfect_prefix(el_val_t slot);
el_val_t ar_imperfect_suffix(el_val_t slot);
el_val_t ar_conjugate_form1(el_val_t past_base, el_val_t present_stem, el_val_t tense, el_val_t slot);
el_val_t ar_irregular_kaana(el_val_t slot, el_val_t tense);
el_val_t ar_irregular_qaala(el_val_t slot, el_val_t tense);
el_val_t ar_irregular_jaa(el_val_t slot, el_val_t tense);
el_val_t ar_irregular_raaa(el_val_t slot, el_val_t tense);
el_val_t ar_irregular_araada(el_val_t slot, el_val_t tense);
el_val_t ar_irregular_istata(el_val_t slot, el_val_t tense);
el_val_t ar_irregular(el_val_t verb, el_val_t tense, el_val_t slot);
el_val_t ar_present_stem(el_val_t verb);
el_val_t ar_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number);
el_val_t ar_is_sun_letter(el_val_t c);
el_val_t ar_definite_article(el_val_t noun);
el_val_t ar_case_ending(el_val_t kase, el_val_t definite);
el_val_t ar_gender(el_val_t noun);
el_val_t ar_masc_pl_ending(el_val_t kase);
el_val_t ar_sound_plural(el_val_t noun, el_val_t gender);
el_val_t ar_noun_form(el_val_t noun, el_val_t gender, el_val_t kase, el_val_t number, el_val_t definite);
el_val_t ar_verb_form(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t hi_str_ends(el_val_t s, el_val_t suf);
el_val_t hi_str_drop_last(el_val_t s, el_val_t n);
el_val_t hi_str_last_char(el_val_t s);
el_val_t hi_gender(el_val_t noun);
el_val_t hi_masc_aa_stem(el_val_t noun);
el_val_t hi_noun_direct_m(el_val_t noun, el_val_t number);
el_val_t hi_noun_oblique_m(el_val_t noun, el_val_t number);
el_val_t hi_noun_direct_f(el_val_t noun, el_val_t number);
el_val_t hi_noun_oblique_f(el_val_t noun, el_val_t number);
el_val_t hi_noun_direct(el_val_t noun, el_val_t gender, el_val_t number);
el_val_t hi_noun_oblique(el_val_t noun, el_val_t gender, el_val_t number);
el_val_t hi_postposition(el_val_t gram_case);
el_val_t hi_agree_genitive(el_val_t possessed_gender, el_val_t possessed_number);
el_val_t hi_verb_stem(el_val_t infinitive);
el_val_t hi_verb_stem_clean(el_val_t infinitive);
el_val_t hi_present_aspect(el_val_t gender, el_val_t number);
el_val_t hi_aux_present(el_val_t person, el_val_t number);
el_val_t hi_past_suffix(el_val_t gender, el_val_t number);
el_val_t hi_past_irregular(el_val_t stem, el_val_t gender, el_val_t number);
el_val_t hi_future_suffix(el_val_t person, el_val_t number, el_val_t gender);
el_val_t hi_tense_suffix(el_val_t tense, el_val_t gender, el_val_t number);
el_val_t hi_hona_present(el_val_t person, el_val_t number);
el_val_t hi_hona_past(el_val_t gender, el_val_t number);
el_val_t hi_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t gender, el_val_t number);
el_val_t hi_noun_with_post(el_val_t noun, el_val_t gender, el_val_t number, el_val_t gram_case);
el_val_t hi_genitive_phrase(el_val_t possessor, el_val_t possessor_gender, el_val_t possessor_number, el_val_t possessed, el_val_t possessed_gender, el_val_t possessed_number);
el_val_t sw_str_ends(el_val_t s, el_val_t suf);
el_val_t sw_str_drop_last(el_val_t s, el_val_t n);
el_val_t sw_str_first_char(el_val_t s);
el_val_t sw_str_first2(el_val_t s);
el_val_t sw_str_first3(el_val_t s);
el_val_t sw_str_last_char(el_val_t s);
el_val_t sw_is_class1_noun(el_val_t noun);
el_val_t sw_noun_class(el_val_t noun);
el_val_t sw_subj_prefix(el_val_t person, el_val_t number, el_val_t noun_class);
el_val_t sw_obj_prefix(el_val_t person, el_val_t number, el_val_t noun_class);
el_val_t sw_tense_marker(el_val_t tense);
el_val_t sw_verb_final(el_val_t tense, el_val_t negative);
el_val_t sw_neg_subj_prefix(el_val_t person, el_val_t number, el_val_t noun_class);
el_val_t sw_verb_stem(el_val_t infinitive);
el_val_t sw_conjugate(el_val_t verb_stem, el_val_t person, el_val_t number, el_val_t noun_class, el_val_t tense);
el_val_t sw_negative(el_val_t verb_stem, el_val_t person, el_val_t number, el_val_t noun_class, el_val_t tense);
el_val_t sw_noun_plural(el_val_t noun);
el_val_t sw_adj_prefix(el_val_t noun_class, el_val_t number);
el_val_t sw_agree_adj(el_val_t adj_stem, el_val_t noun_class, el_val_t number);
el_val_t sw_demonstrative(el_val_t noun_class, el_val_t number, el_val_t proximity);
el_val_t sw_copula_present(el_val_t person, el_val_t number, el_val_t use_case);
el_val_t sw_copula_neg_present(el_val_t person, el_val_t number);
el_val_t la_str_ends(el_val_t s, el_val_t suf);
el_val_t la_str_drop_last(el_val_t s, el_val_t n);
el_val_t la_str_last_char(el_val_t s);
el_val_t la_str_last2(el_val_t s);
el_val_t la_str_last3(el_val_t s);
el_val_t la_slot(el_val_t person, el_val_t number);
el_val_t la_verb_class(el_val_t verb);
el_val_t la_stem(el_val_t verb, el_val_t vclass);
el_val_t la_perfect_stem(el_val_t verb, el_val_t vclass);
el_val_t la_perfect_ending(el_val_t slot);
el_val_t la_present_ending(el_val_t vclass, el_val_t slot);
el_val_t la_present_form(el_val_t stem, el_val_t vclass, el_val_t slot);
el_val_t la_future_ending_12(el_val_t slot);
el_val_t la_future_ending_34(el_val_t slot);
el_val_t la_future_form(el_val_t stem, el_val_t vclass, el_val_t slot);
el_val_t la_esse_present(el_val_t slot);
el_val_t la_esse_past(el_val_t slot);
el_val_t la_esse_future(el_val_t slot);
el_val_t la_ire_present(el_val_t slot);
el_val_t la_ire_past(el_val_t slot);
el_val_t la_ire_future(el_val_t slot);
el_val_t la_velle_present(el_val_t slot);
el_val_t la_velle_past(el_val_t slot);
el_val_t la_velle_future(el_val_t slot);
el_val_t la_posse_present(el_val_t slot);
el_val_t la_posse_past(el_val_t slot);
el_val_t la_posse_future(el_val_t slot);
el_val_t la_irregular_perfect_stem(el_val_t verb);
el_val_t la_map_canonical(el_val_t verb);
el_val_t la_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number);
el_val_t la_declension(el_val_t noun);
el_val_t la_decline_1(el_val_t stem, el_val_t gram_case, el_val_t number);
el_val_t la_decline_2m(el_val_t stem, el_val_t gram_case, el_val_t number);
el_val_t la_decline_2n(el_val_t stem, el_val_t gram_case, el_val_t number);
el_val_t la_decline_3(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t la_decline_4(el_val_t stem, el_val_t gram_case, el_val_t number);
el_val_t la_decline_5(el_val_t stem, el_val_t gram_case, el_val_t number);
el_val_t la_decline_2er(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t la_decline(el_val_t noun, el_val_t gram_case, el_val_t number);
el_val_t la_noun_phrase(el_val_t noun, el_val_t gram_case, el_val_t number, el_val_t definite);
el_val_t ja_verb_group(el_val_t dict_form);
el_val_t ja_ichidan_stem(el_val_t dict_form);
el_val_t ja_godan_stem_change(el_val_t dict_form, el_val_t row);
el_val_t ja_conjugate(el_val_t dict_form, el_val_t form);
el_val_t ja_particle(el_val_t gram_case);
el_val_t ja_noun_phrase(el_val_t noun, el_val_t gram_case);
el_val_t ja_question_particle(void);
el_val_t ja_make_question(el_val_t sentence);
el_val_t str_ends(el_val_t s, el_val_t suf);
el_val_t str_last_char(el_val_t s);
el_val_t str_last2(el_val_t s);
el_val_t str_last3(el_val_t s);
el_val_t str_drop_last(el_val_t s, el_val_t n);
el_val_t is_vowel(el_val_t c);
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix);
el_val_t en_irregular_plural(el_val_t word);
el_val_t en_irregular_singular(el_val_t word);
el_val_t en_irregular_verb(el_val_t base);
el_val_t en_verb_3sg(el_val_t base);
el_val_t en_should_double_final(el_val_t base);
el_val_t en_verb_past(el_val_t base);
el_val_t en_verb_gerund(el_val_t base);
el_val_t en_pluralize_regular(el_val_t singular);
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t agree_determiner(el_val_t det, el_val_t noun);
el_val_t morph_pluralize(el_val_t noun, el_val_t profile);
el_val_t morph_map_canonical(el_val_t verb, el_val_t code);
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile);
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile);
el_val_t pluralize(el_val_t singular);
el_val_t singularize(el_val_t plural);
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number);
el_val_t irregular_plural(el_val_t word);
el_val_t irregular_singular(el_val_t word);
el_val_t str_ends(el_val_t s, el_val_t suf) {
return str_ends_with(s, suf);
return 0;
}
el_val_t str_last_char(el_val_t s) {
el_val_t n = str_len(s);
if (n == 0) {
return EL_STR("");
}
return str_slice(s, (n - 1), n);
return 0;
}
el_val_t str_last2(el_val_t s) {
el_val_t n = str_len(s);
if (n < 2) {
return s;
}
return str_slice(s, (n - 2), n);
return 0;
}
el_val_t str_last3(el_val_t s) {
el_val_t n = str_len(s);
if (n < 3) {
return s;
}
return str_slice(s, (n - 3), n);
return 0;
}
el_val_t str_drop_last(el_val_t s, el_val_t n) {
el_val_t len = str_len(s);
if (n >= len) {
return EL_STR("");
}
return str_slice(s, 0, (len - n));
return 0;
}
el_val_t is_vowel(el_val_t c) {
if (str_eq(c, EL_STR("a"))) {
return 1;
}
if (str_eq(c, EL_STR("e"))) {
return 1;
}
if (str_eq(c, EL_STR("i"))) {
return 1;
}
if (str_eq(c, EL_STR("o"))) {
return 1;
}
if (str_eq(c, EL_STR("u"))) {
return 1;
}
return 0;
return 0;
}
el_val_t morph_apply_suffix(el_val_t base, el_val_t suffix) {
if (str_eq(suffix, EL_STR(""))) {
return base;
}
el_val_t suf_start = str_slice(suffix, 0, 1);
el_val_t suf_starts_vowel = is_vowel(suf_start);
if (suf_starts_vowel) {
if (str_ends(base, EL_STR("e"))) {
if (!str_ends(base, EL_STR("ee"))) {
return el_str_concat(str_drop_last(base, 1), suffix);
}
}
}
if (suf_starts_vowel) {
el_val_t n = str_len(base);
if (n >= 3) {
el_val_t c3 = str_slice(base, (n - 3), (n - 2));
el_val_t c2 = str_slice(base, (n - 2), (n - 1));
el_val_t c1 = str_slice(base, (n - 1), n);
if (!is_vowel(c3)) {
if (is_vowel(c2)) {
if (!is_vowel(c1)) {
if (!str_eq(c1, EL_STR("w"))) {
if (!str_eq(c1, EL_STR("x"))) {
if (!str_eq(c1, EL_STR("y"))) {
return el_str_concat(el_str_concat(base, c1), suffix);
}
}
}
}
}
}
}
}
return el_str_concat(base, suffix);
return 0;
}
el_val_t en_irregular_plural(el_val_t word) {
if (str_eq(word, EL_STR("child"))) {
return EL_STR("children");
}
if (str_eq(word, EL_STR("man"))) {
return EL_STR("men");
}
if (str_eq(word, EL_STR("woman"))) {
return EL_STR("women");
}
if (str_eq(word, EL_STR("tooth"))) {
return EL_STR("teeth");
}
if (str_eq(word, EL_STR("foot"))) {
return EL_STR("feet");
}
if (str_eq(word, EL_STR("goose"))) {
return EL_STR("geese");
}
if (str_eq(word, EL_STR("mouse"))) {
return EL_STR("mice");
}
if (str_eq(word, EL_STR("louse"))) {
return EL_STR("lice");
}
if (str_eq(word, EL_STR("ox"))) {
return EL_STR("oxen");
}
if (str_eq(word, EL_STR("person"))) {
return EL_STR("people");
}
if (str_eq(word, EL_STR("leaf"))) {
return EL_STR("leaves");
}
if (str_eq(word, EL_STR("loaf"))) {
return EL_STR("loaves");
}
if (str_eq(word, EL_STR("wolf"))) {
return EL_STR("wolves");
}
if (str_eq(word, EL_STR("life"))) {
return EL_STR("lives");
}
if (str_eq(word, EL_STR("knife"))) {
return EL_STR("knives");
}
if (str_eq(word, EL_STR("wife"))) {
return EL_STR("wives");
}
if (str_eq(word, EL_STR("half"))) {
return EL_STR("halves");
}
if (str_eq(word, EL_STR("self"))) {
return EL_STR("selves");
}
if (str_eq(word, EL_STR("elf"))) {
return EL_STR("elves");
}
if (str_eq(word, EL_STR("shelf"))) {
return EL_STR("shelves");
}
if (str_eq(word, EL_STR("fish"))) {
return EL_STR("fish");
}
if (str_eq(word, EL_STR("sheep"))) {
return EL_STR("sheep");
}
if (str_eq(word, EL_STR("deer"))) {
return EL_STR("deer");
}
if (str_eq(word, EL_STR("moose"))) {
return EL_STR("moose");
}
if (str_eq(word, EL_STR("series"))) {
return EL_STR("series");
}
if (str_eq(word, EL_STR("species"))) {
return EL_STR("species");
}
return EL_STR("");
return 0;
}
el_val_t en_irregular_singular(el_val_t word) {
if (str_eq(word, EL_STR("children"))) {
return EL_STR("child");
}
if (str_eq(word, EL_STR("men"))) {
return EL_STR("man");
}
if (str_eq(word, EL_STR("women"))) {
return EL_STR("woman");
}
if (str_eq(word, EL_STR("teeth"))) {
return EL_STR("tooth");
}
if (str_eq(word, EL_STR("feet"))) {
return EL_STR("foot");
}
if (str_eq(word, EL_STR("geese"))) {
return EL_STR("goose");
}
if (str_eq(word, EL_STR("mice"))) {
return EL_STR("mouse");
}
if (str_eq(word, EL_STR("lice"))) {
return EL_STR("louse");
}
if (str_eq(word, EL_STR("oxen"))) {
return EL_STR("ox");
}
if (str_eq(word, EL_STR("people"))) {
return EL_STR("person");
}
if (str_eq(word, EL_STR("leaves"))) {
return EL_STR("leaf");
}
if (str_eq(word, EL_STR("wolves"))) {
return EL_STR("wolf");
}
if (str_eq(word, EL_STR("lives"))) {
return EL_STR("life");
}
if (str_eq(word, EL_STR("knives"))) {
return EL_STR("knife");
}
if (str_eq(word, EL_STR("wives"))) {
return EL_STR("wife");
}
if (str_eq(word, EL_STR("halves"))) {
return EL_STR("half");
}
if (str_eq(word, EL_STR("selves"))) {
return EL_STR("self");
}
if (str_eq(word, EL_STR("elves"))) {
return EL_STR("elf");
}
if (str_eq(word, EL_STR("shelves"))) {
return EL_STR("shelf");
}
if (str_eq(word, EL_STR("fish"))) {
return EL_STR("fish");
}
if (str_eq(word, EL_STR("sheep"))) {
return EL_STR("sheep");
}
if (str_eq(word, EL_STR("deer"))) {
return EL_STR("deer");
}
if (str_eq(word, EL_STR("moose"))) {
return EL_STR("moose");
}
if (str_eq(word, EL_STR("series"))) {
return EL_STR("series");
}
if (str_eq(word, EL_STR("species"))) {
return EL_STR("species");
}
return EL_STR("");
return 0;
}
el_val_t en_irregular_verb(el_val_t base) {
el_val_t empty = el_list_empty();
if (str_eq(base, EL_STR("be"))) {
el_val_t r = el_list_new(5, EL_STR("be"), EL_STR("is"), EL_STR("was"), EL_STR("been"), EL_STR("being"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("have"))) {
el_val_t r = el_list_new(5, EL_STR("have"), EL_STR("has"), EL_STR("had"), EL_STR("had"), EL_STR("having"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("do"))) {
el_val_t r = el_list_new(5, EL_STR("do"), EL_STR("does"), EL_STR("did"), EL_STR("done"), EL_STR("doing"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("go"))) {
el_val_t r = el_list_new(5, EL_STR("go"), EL_STR("goes"), EL_STR("went"), EL_STR("gone"), EL_STR("going"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("say"))) {
el_val_t r = el_list_new(5, EL_STR("say"), EL_STR("says"), EL_STR("said"), EL_STR("said"), EL_STR("saying"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("make"))) {
el_val_t r = el_list_new(5, EL_STR("make"), EL_STR("makes"), EL_STR("made"), EL_STR("made"), EL_STR("making"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("know"))) {
el_val_t r = el_list_new(5, EL_STR("know"), EL_STR("knows"), EL_STR("knew"), EL_STR("known"), EL_STR("knowing"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("take"))) {
el_val_t r = el_list_new(5, EL_STR("take"), EL_STR("takes"), EL_STR("took"), EL_STR("taken"), EL_STR("taking"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("see"))) {
el_val_t r = el_list_new(5, EL_STR("see"), EL_STR("sees"), EL_STR("saw"), EL_STR("seen"), EL_STR("seeing"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("come"))) {
el_val_t r = el_list_new(5, EL_STR("come"), EL_STR("comes"), EL_STR("came"), EL_STR("come"), EL_STR("coming"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("think"))) {
el_val_t r = el_list_new(5, EL_STR("think"), EL_STR("thinks"), EL_STR("thought"), EL_STR("thought"), EL_STR("thinking"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("get"))) {
el_val_t r = el_list_new(5, EL_STR("get"), EL_STR("gets"), EL_STR("got"), EL_STR("gotten"), EL_STR("getting"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("give"))) {
el_val_t r = el_list_new(5, EL_STR("give"), EL_STR("gives"), EL_STR("gave"), EL_STR("given"), EL_STR("giving"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("find"))) {
el_val_t r = el_list_new(5, EL_STR("find"), EL_STR("finds"), EL_STR("found"), EL_STR("found"), EL_STR("finding"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("tell"))) {
el_val_t r = el_list_new(5, EL_STR("tell"), EL_STR("tells"), EL_STR("told"), EL_STR("told"), EL_STR("telling"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("become"))) {
el_val_t r = el_list_new(5, EL_STR("become"), EL_STR("becomes"), EL_STR("became"), EL_STR("become"), EL_STR("becoming"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("leave"))) {
el_val_t r = el_list_new(5, EL_STR("leave"), EL_STR("leaves"), EL_STR("left"), EL_STR("left"), EL_STR("leaving"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("feel"))) {
el_val_t r = el_list_new(5, EL_STR("feel"), EL_STR("feels"), EL_STR("felt"), EL_STR("felt"), EL_STR("feeling"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("put"))) {
el_val_t r = el_list_new(5, EL_STR("put"), EL_STR("puts"), EL_STR("put"), EL_STR("put"), EL_STR("putting"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("bring"))) {
el_val_t r = el_list_new(5, EL_STR("bring"), EL_STR("brings"), EL_STR("brought"), EL_STR("brought"), EL_STR("bringing"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("begin"))) {
el_val_t r = el_list_new(5, EL_STR("begin"), EL_STR("begins"), EL_STR("began"), EL_STR("begun"), EL_STR("beginning"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("keep"))) {
el_val_t r = el_list_new(5, EL_STR("keep"), EL_STR("keeps"), EL_STR("kept"), EL_STR("kept"), EL_STR("keeping"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("hold"))) {
el_val_t r = el_list_new(5, EL_STR("hold"), EL_STR("holds"), EL_STR("held"), EL_STR("held"), EL_STR("holding"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("write"))) {
el_val_t r = el_list_new(5, EL_STR("write"), EL_STR("writes"), EL_STR("wrote"), EL_STR("written"), EL_STR("writing"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("stand"))) {
el_val_t r = el_list_new(5, EL_STR("stand"), EL_STR("stands"), EL_STR("stood"), EL_STR("stood"), EL_STR("standing"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("hear"))) {
el_val_t r = el_list_new(5, EL_STR("hear"), EL_STR("hears"), EL_STR("heard"), EL_STR("heard"), EL_STR("hearing"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("let"))) {
el_val_t r = el_list_new(5, EL_STR("let"), EL_STR("lets"), EL_STR("let"), EL_STR("let"), EL_STR("letting"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("run"))) {
el_val_t r = el_list_new(5, EL_STR("run"), EL_STR("runs"), EL_STR("ran"), EL_STR("run"), EL_STR("running"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("meet"))) {
el_val_t r = el_list_new(5, EL_STR("meet"), EL_STR("meets"), EL_STR("met"), EL_STR("met"), EL_STR("meeting"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("sit"))) {
el_val_t r = el_list_new(5, EL_STR("sit"), EL_STR("sits"), EL_STR("sat"), EL_STR("sat"), EL_STR("sitting"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("send"))) {
el_val_t r = el_list_new(5, EL_STR("send"), EL_STR("sends"), EL_STR("sent"), EL_STR("sent"), EL_STR("sending"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("speak"))) {
el_val_t r = el_list_new(5, EL_STR("speak"), EL_STR("speaks"), EL_STR("spoke"), EL_STR("spoken"), EL_STR("speaking"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("buy"))) {
el_val_t r = el_list_new(5, EL_STR("buy"), EL_STR("buys"), EL_STR("bought"), EL_STR("bought"), EL_STR("buying"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("pay"))) {
el_val_t r = el_list_new(5, EL_STR("pay"), EL_STR("pays"), EL_STR("paid"), EL_STR("paid"), EL_STR("paying"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("read"))) {
el_val_t r = el_list_new(5, EL_STR("read"), EL_STR("reads"), EL_STR("read"), EL_STR("read"), EL_STR("reading"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("win"))) {
el_val_t r = el_list_new(5, EL_STR("win"), EL_STR("wins"), EL_STR("won"), EL_STR("won"), EL_STR("winning"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("eat"))) {
el_val_t r = el_list_new(5, EL_STR("eat"), EL_STR("eats"), EL_STR("ate"), EL_STR("eaten"), EL_STR("eating"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("fall"))) {
el_val_t r = el_list_new(5, EL_STR("fall"), EL_STR("falls"), EL_STR("fell"), EL_STR("fallen"), EL_STR("falling"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("sleep"))) {
el_val_t r = el_list_new(5, EL_STR("sleep"), EL_STR("sleeps"), EL_STR("slept"), EL_STR("slept"), EL_STR("sleeping"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("drive"))) {
el_val_t r = el_list_new(5, EL_STR("drive"), EL_STR("drives"), EL_STR("drove"), EL_STR("driven"), EL_STR("driving"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("build"))) {
el_val_t r = el_list_new(5, EL_STR("build"), EL_STR("builds"), EL_STR("built"), EL_STR("built"), EL_STR("building"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("cut"))) {
el_val_t r = el_list_new(5, EL_STR("cut"), EL_STR("cuts"), EL_STR("cut"), EL_STR("cut"), EL_STR("cutting"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("set"))) {
el_val_t r = el_list_new(5, EL_STR("set"), EL_STR("sets"), EL_STR("set"), EL_STR("set"), EL_STR("setting"));
EL_NULL;
return r;
}
if (str_eq(base, EL_STR("hit"))) {
el_val_t r = el_list_new(5, EL_STR("hit"), EL_STR("hits"), EL_STR("hit"), EL_STR("hit"), EL_STR("hitting"));
EL_NULL;
return r;
}
return empty;
return 0;
}
el_val_t en_verb_3sg(el_val_t base) {
if (str_ends(base, EL_STR("s"))) {
return el_str_concat(base, EL_STR("es"));
}
if (str_ends(base, EL_STR("x"))) {
return el_str_concat(base, EL_STR("es"));
}
if (str_ends(base, EL_STR("z"))) {
return el_str_concat(base, EL_STR("es"));
}
if (str_ends(base, EL_STR("ch"))) {
return el_str_concat(base, EL_STR("es"));
}
if (str_ends(base, EL_STR("sh"))) {
return el_str_concat(base, EL_STR("es"));
}
el_val_t last = str_last_char(base);
if (str_eq(last, EL_STR("y"))) {
el_val_t prev = str_drop_last(base, 1);
el_val_t prev_last = str_last_char(prev);
if (!is_vowel(prev_last)) {
return el_str_concat(prev, EL_STR("ies"));
}
}
return el_str_concat(base, EL_STR("s"));
return 0;
}
el_val_t en_should_double_final(el_val_t base) {
el_val_t n = str_len(base);
if (n < 3) {
return 0;
}
el_val_t c3 = str_slice(base, (n - 3), (n - 2));
el_val_t c2 = str_slice(base, (n - 2), (n - 1));
el_val_t c1 = str_slice(base, (n - 1), n);
if (!is_vowel(c3)) {
if (is_vowel(c2)) {
if (!is_vowel(c1)) {
if (!str_eq(c1, EL_STR("w"))) {
if (!str_eq(c1, EL_STR("x"))) {
if (!str_eq(c1, EL_STR("y"))) {
return 1;
}
}
}
}
}
}
return 0;
return 0;
}
el_val_t en_verb_past(el_val_t base) {
if (str_ends(base, EL_STR("e"))) {
return el_str_concat(base, EL_STR("d"));
}
el_val_t last = str_last_char(base);
if (str_eq(last, EL_STR("y"))) {
el_val_t prev = str_drop_last(base, 1);
el_val_t prev_last = str_last_char(prev);
if (!is_vowel(prev_last)) {
return el_str_concat(prev, EL_STR("ied"));
}
}
if (en_should_double_final(base)) {
return el_str_concat(el_str_concat(base, last), EL_STR("ed"));
}
return el_str_concat(base, EL_STR("ed"));
return 0;
}
el_val_t en_verb_gerund(el_val_t base) {
if (str_ends(base, EL_STR("ie"))) {
return el_str_concat(str_drop_last(base, 2), EL_STR("ying"));
}
if (str_ends(base, EL_STR("e"))) {
if (!str_ends(base, EL_STR("ee"))) {
return el_str_concat(str_drop_last(base, 1), EL_STR("ing"));
}
}
el_val_t last = str_last_char(base);
if (en_should_double_final(base)) {
return el_str_concat(el_str_concat(base, last), EL_STR("ing"));
}
return el_str_concat(base, EL_STR("ing"));
return 0;
}
el_val_t en_pluralize_regular(el_val_t singular) {
if (str_ends(singular, EL_STR("s"))) {
return el_str_concat(singular, EL_STR("es"));
}
if (str_ends(singular, EL_STR("x"))) {
return el_str_concat(singular, EL_STR("es"));
}
if (str_ends(singular, EL_STR("z"))) {
return el_str_concat(singular, EL_STR("es"));
}
if (str_ends(singular, EL_STR("ch"))) {
return el_str_concat(singular, EL_STR("es"));
}
if (str_ends(singular, EL_STR("sh"))) {
return el_str_concat(singular, EL_STR("es"));
}
el_val_t last = str_last_char(singular);
if (str_eq(last, EL_STR("y"))) {
el_val_t prev = str_drop_last(singular, 1);
el_val_t prev_last = str_last_char(prev);
if (!is_vowel(prev_last)) {
return el_str_concat(prev, EL_STR("ies"));
}
}
if (str_ends(singular, EL_STR("fe"))) {
return el_str_concat(str_drop_last(singular, 2), EL_STR("ves"));
}
return el_str_concat(singular, EL_STR("s"));
return 0;
}
el_val_t en_verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number) {
el_val_t irreg = en_irregular_verb(base);
el_val_t is_irreg = 0;
if (native_list_len(irreg) > 0) {
is_irreg = 1;
}
if (str_eq(base, EL_STR("be"))) {
if (str_eq(tense, EL_STR("present"))) {
if (str_eq(number, EL_STR("plural"))) {
return EL_STR("are");
}
if (str_eq(person, EL_STR("first"))) {
return EL_STR("am");
}
if (str_eq(person, EL_STR("second"))) {
return EL_STR("are");
}
return EL_STR("is");
}
if (str_eq(tense, EL_STR("past"))) {
if (str_eq(number, EL_STR("plural"))) {
return EL_STR("were");
}
if (str_eq(person, EL_STR("second"))) {
return EL_STR("were");
}
return EL_STR("was");
}
if (str_eq(tense, EL_STR("future"))) {
return EL_STR("will be");
}
if (str_eq(tense, EL_STR("perfect"))) {
return EL_STR("been");
}
if (str_eq(tense, EL_STR("progressive"))) {
return EL_STR("being");
}
return EL_STR("be");
}
if (str_eq(tense, EL_STR("present"))) {
if (str_eq(person, EL_STR("third"))) {
if (str_eq(number, EL_STR("singular"))) {
if (is_irreg) {
return native_list_get(irreg, 1);
}
return en_verb_3sg(base);
}
}
return base;
}
if (str_eq(tense, EL_STR("past"))) {
if (is_irreg) {
return native_list_get(irreg, 2);
}
return en_verb_past(base);
}
if (str_eq(tense, EL_STR("future"))) {
return el_str_concat(EL_STR("will "), base);
}
if (str_eq(tense, EL_STR("perfect"))) {
if (is_irreg) {
return native_list_get(irreg, 3);
}
return en_verb_past(base);
}
if (str_eq(tense, EL_STR("progressive"))) {
if (is_irreg) {
return native_list_get(irreg, 4);
}
return en_verb_gerund(base);
}
return base;
return 0;
}
el_val_t agree_determiner(el_val_t det, el_val_t noun) {
if (str_eq(det, EL_STR("a"))) {
el_val_t first = str_slice(noun, 0, 1);
el_val_t fl = str_to_lower(first);
if (is_vowel(fl)) {
return EL_STR("an");
}
return EL_STR("a");
}
return det;
return 0;
}
el_val_t morph_pluralize(el_val_t noun, el_val_t profile) {
el_val_t mtype = lang_get(profile, EL_STR("morph_type"));
el_val_t code = lang_get(profile, EL_STR("code"));
if (str_eq(code, EL_STR("es"))) {
return es_pluralize(noun);
}
if (str_eq(code, EL_STR("fr"))) {
return fr_pluralize(noun);
}
if (str_eq(code, EL_STR("de"))) {
return de_noun_plural(noun, EL_STR("unknown"));
}
if (str_eq(code, EL_STR("ru"))) {
return ru_noun_case(noun, EL_STR("m"), EL_STR("nom"), EL_STR("pl"));
}
if (str_eq(code, EL_STR("ja"))) {
return noun;
}
if (str_eq(code, EL_STR("fi"))) {
return fi_apply_case(noun, EL_STR("nom"), EL_STR("pl"));
}
if (str_eq(code, EL_STR("ar"))) {
return ar_sound_plural(noun, EL_STR("m"));
}
if (str_eq(code, EL_STR("hi"))) {
return hi_noun_direct(noun, hi_gender(noun), EL_STR("pl"));
}
if (str_eq(code, EL_STR("sw"))) {
return sw_noun_plural(noun);
}
if (str_eq(mtype, EL_STR("isolating"))) {
return noun;
}
if (str_eq(mtype, EL_STR("agglutinative"))) {
return noun;
}
if (str_eq(mtype, EL_STR("fusional"))) {
if (str_eq(code, EL_STR("en"))) {
el_val_t irreg = en_irregular_plural(noun);
if (!str_eq(irreg, EL_STR(""))) {
return irreg;
}
return en_pluralize_regular(noun);
}
return noun;
}
return noun;
return 0;
}
el_val_t morph_map_canonical(el_val_t verb, el_val_t code) {
if (str_eq(verb, EL_STR("be"))) {
if (str_eq(code, EL_STR("es"))) {
return EL_STR("ser");
}
if (str_eq(code, EL_STR("fr"))) {
return EL_STR("etre");
}
if (str_eq(code, EL_STR("de"))) {
return EL_STR("sein");
}
if (str_eq(code, EL_STR("fi"))) {
return EL_STR("olla");
}
if (str_eq(code, EL_STR("ru"))) {
return EL_STR("byt");
}
if (str_eq(code, EL_STR("sw"))) {
return EL_STR("kuwa");
}
}
return verb;
return 0;
}
el_val_t morph_conjugate(el_val_t verb, el_val_t tense, el_val_t person, el_val_t number, el_val_t profile) {
el_val_t mtype = lang_get(profile, EL_STR("morph_type"));
el_val_t code = lang_get(profile, EL_STR("code"));
verb = morph_map_canonical(verb, code);
if (str_eq(code, EL_STR("es"))) {
return es_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("fr"))) {
return fr_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("de"))) {
return de_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("ru"))) {
return ru_conjugate(verb, tense, person, number, EL_STR("unknown"));
}
if (str_eq(code, EL_STR("ja"))) {
return ja_conjugate(verb, EL_STR("present"));
}
if (str_eq(code, EL_STR("fi"))) {
return fi_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("ar"))) {
return ar_conjugate(verb, tense, person, EL_STR("m"), number);
}
if (str_eq(code, EL_STR("hi"))) {
return hi_conjugate(verb, tense, person, EL_STR("m"), number);
}
if (str_eq(code, EL_STR("sw"))) {
return sw_conjugate(verb, person, number, EL_STR("1"), tense);
}
if (str_eq(code, EL_STR("la"))) {
return la_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("he"))) {
return he_conjugate(verb, tense, person, EL_STR("m"), number);
}
if (str_eq(code, EL_STR("grc"))) {
return grc_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("ang"))) {
return ang_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("sa"))) {
return sa_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("got"))) {
return got_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("non"))) {
return non_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("enm"))) {
return enm_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("pi"))) {
return pi_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("fro"))) {
return fro_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("goh"))) {
return goh_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("sga"))) {
return sga_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("txb"))) {
return txb_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("peo"))) {
return peo_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("akk"))) {
return akk_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("uga"))) {
return uga_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("egy"))) {
return egy_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("sux"))) {
return sux_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("gez"))) {
return gez_conjugate(verb, tense, person, number);
}
if (str_eq(code, EL_STR("cop"))) {
return cop_conjugate(verb, tense, person, number);
}
if (str_eq(mtype, EL_STR("isolating"))) {
return verb;
}
if (str_eq(mtype, EL_STR("agglutinative"))) {
return verb;
}
if (str_eq(mtype, EL_STR("fusional"))) {
if (str_eq(code, EL_STR("en"))) {
return en_verb_form(verb, tense, person, number);
}
return verb;
}
return verb;
return 0;
}
el_val_t morph_inflect(el_val_t word, el_val_t features, el_val_t profile) {
el_val_t n = str_len(features);
if (n == 0) {
return word;
}
el_val_t i = 0;
el_val_t running = 1;
while (running) {
if (i >= n) {
running = 0;
} else {
el_val_t c = str_slice(features, i, (i + 1));
if (str_eq(c, EL_STR(";"))) {
running = 0;
} else {
i = (i + 1);
}
}
}
el_val_t first_feat = str_slice(features, 0, i);
if (str_eq(first_feat, EL_STR("plural"))) {
return morph_pluralize(word, profile);
}
if (i < n) {
el_val_t rest = str_slice(features, (i + 1), n);
el_val_t j = 0;
el_val_t rn = str_len(rest);
el_val_t running2 = 1;
while (running2) {
if (j >= rn) {
running2 = 0;
} else {
el_val_t c = str_slice(rest, j, (j + 1));
if (str_eq(c, EL_STR(";"))) {
running2 = 0;
} else {
j = (j + 1);
}
}
}
el_val_t person = str_slice(rest, 0, j);
el_val_t number = EL_STR("");
if (j < rn) {
number = str_slice(rest, (j + 1), rn);
}
return morph_conjugate(word, first_feat, person, number, profile);
}
return morph_conjugate(word, first_feat, EL_STR("third"), EL_STR("singular"), profile);
return 0;
}
el_val_t pluralize(el_val_t singular) {
return morph_pluralize(singular, lang_default());
return 0;
}
el_val_t singularize(el_val_t plural) {
el_val_t irreg = en_irregular_singular(plural);
if (!str_eq(irreg, EL_STR(""))) {
return irreg;
}
if (str_ends(plural, EL_STR("ies"))) {
return el_str_concat(str_drop_last(plural, 3), EL_STR("y"));
}
if (str_ends(plural, EL_STR("ves"))) {
el_val_t stem = str_drop_last(plural, 3);
el_val_t last_stem = str_last_char(stem);
if (str_eq(last_stem, EL_STR("i"))) {
return el_str_concat(stem, EL_STR("fe"));
}
return el_str_concat(stem, EL_STR("f"));
}
if (str_ends(plural, EL_STR("ches"))) {
return str_drop_last(plural, 2);
}
if (str_ends(plural, EL_STR("shes"))) {
return str_drop_last(plural, 2);
}
if (str_ends(plural, EL_STR("xes"))) {
return str_drop_last(plural, 2);
}
if (str_ends(plural, EL_STR("zes"))) {
return str_drop_last(plural, 2);
}
if (str_ends(plural, EL_STR("ses"))) {
return str_drop_last(plural, 2);
}
if (str_ends(plural, EL_STR("s"))) {
return str_drop_last(plural, 1);
}
return plural;
return 0;
}
el_val_t verb_form(el_val_t base, el_val_t tense, el_val_t person, el_val_t number) {
return morph_conjugate(base, tense, person, number, lang_default());
return 0;
}
el_val_t irregular_plural(el_val_t word) {
return en_irregular_plural(word);
return 0;
}
el_val_t irregular_singular(el_val_t word) {
return en_irregular_singular(word);
return 0;
}