You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kverbos/kverbos/verbspanish.cpp

944 lines
26 KiB

/***************************************************************************
verbspanish.cpp - description
-------------------
begin : Sun Dec 23 2001
copyright : (C) 2001 by Arnold Kraschinski
email : arnold.k67@gmx.de
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "verbspanish.h"
// include files for TQt
// application specific includes
endingsArray verbSpanish::verbEndings = { { {"o", "as", "a", "amos", "<EFBFBD>is", "an"}, /* presente */
{"o", "es", "e", "emos", "<EFBFBD>is", "en"},
{"o", "es", "e", "imos", "<EFBFBD>s", "en"}},
{ {"aba", "abas", "aba", "<EFBFBD>bamos", "abais", "aban"}, /*imperfecto */
{"<EFBFBD>a", "<EFBFBD>as", "<EFBFBD>a", "<EFBFBD>amos", "<EFBFBD>ais", "<EFBFBD>an"},
{"<EFBFBD>a", "<EFBFBD>as", "<EFBFBD>a", "<EFBFBD>amos", "<EFBFBD>ais", "<EFBFBD>an"}},
{ {"<EFBFBD>", "aste", "<EFBFBD>", "amos", "asteis", "aron"}, /* indefinido */
{"<EFBFBD>", "iste", "i<EFBFBD>", "imos", "isteis", "ieron"},
{"<EFBFBD>", "iste", "i<EFBFBD>", "imos", "isteis", "ieron"}},
{ {"<EFBFBD>", "<EFBFBD>s", "<EFBFBD>", "emos", "<EFBFBD>is", "<EFBFBD>n"}, /* futuro */
{"<EFBFBD>", "<EFBFBD>s", "<EFBFBD>", "emos", "<EFBFBD>is", "<EFBFBD>n"},
{"<EFBFBD>", "<EFBFBD>s", "<EFBFBD>", "emos", "<EFBFBD>is", "<EFBFBD>n"}},
{ {"<EFBFBD>a", "<EFBFBD>as", "<EFBFBD>a", "<EFBFBD>amos", "<EFBFBD>ais", "<EFBFBD>an"}, /* condicional */
{"<EFBFBD>a", "<EFBFBD>as", "<EFBFBD>a", "<EFBFBD>amos", "<EFBFBD>ais", "<EFBFBD>an"},
{"<EFBFBD>a", "<EFBFBD>as", "<EFBFBD>a", "<EFBFBD>amos", "<EFBFBD>ais", "<EFBFBD>an"}},
{ {"e", "es", "e", "emos", "<EFBFBD>is", "en"}, /* subjuntivo presente */
{"a", "as", "a", "amos", "<EFBFBD>is", "an"},
{"a", "as", "a", "amos", "<EFBFBD>is", "an"}},
{ {"-", "-", "-", "-", "-", "-"}, /* subjuntivo pasado */
{"-", "-", "-", "-", "-", "-"},
{"-", "-", "-", "-", "-", "-"}},
{ {"%", "%", "%", "%", "%", "%"}, /* subjuntivo futuro */
{"%", "%", "%", "%", "%", "%"},
{"%", "%", "%", "%", "%", "%"}},
{ {"+", "+", "+", "+", "+", "+"}, /* imperativo */
{"+", "+", "+", "+", "+", "+"},
{"+", "+", "+", "+", "+", "+"}}
};
TQString verbSpanish::refPron[PERSONEN] = {"me", "te", "se", "nos", "os", "se"};
TQString verbSpanish::estar[MAX_TIEMPOS][PERSONEN] =
{ {"estoy", "est<EFBFBD>s", "est<EFBFBD>", "estamos", "est<EFBFBD>is", "est<EFBFBD>n"},
{"estaba", "estabas", "estaba", "est<EFBFBD>bamos", "estabais", "estaban"},
{"estuve", "estuviste", "estuvo", "estuvimos", "estuvisteis", "estuvieron"},
{"estar<EFBFBD>", "estar<EFBFBD>s", "estar<EFBFBD>", "estaremos", "estar<EFBFBD>is", "estar<EFBFBD>n"},
{"estar<EFBFBD>a", "estar<EFBFBD>a", "estar<EFBFBD>a", "estar<EFBFBD>amos", "estar<EFBFBD>as", "estar<EFBFBD>an"},
{"est<EFBFBD>", "est<EFBFBD>s", "est<EFBFBD>", "estemos", "est<EFBFBD>is", "est<EFBFBD>n"},
{"estuviera o estuviese", "estuvieras o stuvieses", "estuviera o estuviese",
"estuvi<EFBFBD>ramos o estuvi<76>semos", "estuvierais o estuvieseis", "estuvieran o estuviesen"},
{"estuviere", "estuvieres", "estuviere", "estuvi<EFBFBD>remos", "estuviereis", "estuvieren"},
{"", "est<EFBFBD>", "est<EFBFBD>", "estemos", "estad", "est<EFBFBD>n"}
};
TQString verbSpanish::haber[MAX_TIEMPOS][PERSONEN] =
{ {"he", "has", "ha", "hemos", "hab<EFBFBD>is", "han"},
{"hab<EFBFBD>a", "hab<EFBFBD>as", "hab<EFBFBD>a", "hab<EFBFBD>amos", "hab<EFBFBD>ais", "hab<EFBFBD>an"},
{"hube", "hubiste", "hubo", "hubimos", "hubisteis", "hubieron"},
{"habr<EFBFBD>", "habr<EFBFBD>s", "habr<EFBFBD>", "habremos", "habr<EFBFBD>is", "habr<EFBFBD>n"},
{"habr<EFBFBD>a", "habr<EFBFBD>as", "habr<EFBFBD>a", "habr<EFBFBD>amos", "habr<EFBFBD>ais", "habr<EFBFBD>an"},
{"haya", "hayas", "haya", "hayamos", "hay<EFBFBD>is", "hayan"},
{"hubiera o hubiese", "hubieras o hubieses", "hubiera o hubiese",
"hubi<EFBFBD>ramos o hubi<62>semos", "hubierais o hubieseis", "hubieran o hubiesen"},
{"hubiere", "hubieres", "hubiere", "hubi<EFBFBD>remos", "hubiereis", "hubieren"},
{"", "he", "haya", "hayamos", "habed", "hayan"}
};
TQString verbSpanish::timeNames[MAX_TIEMPOS*MAX_SUBTYPES] =
{"presente", "imperfecto", "indefinido", "futuro", "condicional",
"subjuntivo presente", "subjuntivo pasado", "subjuntivo futuro", "imperativo",
"presente progresivo", "imperfecto progresivo", "indefinido progresivo", "futuro progresivo", "condicional progresivo",
"subjuntivo presente progresivo", "subjuntivo pasado progresivo", "subjuntivo futuro progresivo", "error:form doesn't exist",
"presente perfecto", "imperfecto perfecto", "error:form doesn't exist", "futuro perfecto", "condicional perfecto",
"subjuntivo presente perfecto", "subjuntivo pasado perfecto", "subjuntivo futuro perfecto", "error:form doesn't exist",
};
TQString verbSpanish::groupNames[MAX_GRUPPEN] =
{"regular", "irregular", "e > ie", "o > ue", "u > ue", "e > i",
"c > qu", "g > gu", "z > c", "gu > g<>", "c > z", "g > j",
"gu > g", "qu > c", "accent like 'enviar'",
"accent like 'continuar'", "missing i"};
int verbSpanish::maxTiempos = MAX_TIEMPOS;
int verbSpanish::maxSubtypes = MAX_SUBTYPES;
int verbSpanish::persons = PERSONEN;
int verbSpanish::maxForms = MAX_TIEMPOS * MAX_SUBTYPES;
verbSpanish::verbSpanish()
{
foreign = "";
spanish = "";
gerund = "";
partizip = "";
group = REGULAR;
conjugated = false;
error = false;
int z;
int p;
for (z = presente; z <= imperativo; z++)
{
for (p = yo; p <= ellos; p++)
{
forms[z][p] = "";
};
};
}
verbSpanish::verbSpanish(const verbSpanish& v)
{
foreign = v.foreign;
spanish = v.spanish;
group = v.group;
if (IRREGULAR != group)
{
gerund = "";
partizip = "";
conjugated = false;
error = v.error;
int z;
int p;
for (z = presente; z <= imperativo; z++)
for (p = yo; p <= ellos; p++)
forms[z][p] = "";
}
else
{
gerund = v.gerund;
partizip = v.partizip;
error = v.error;
conjugated = v.conjugated;
int z;
int p;
for (z = presente; z <= imperativo; z++)
for (p = yo; p <= ellos; p++)
forms[z][p] = v.forms[z][p];
};
}
verbSpanish::~verbSpanish()
{
// momentan hat die Klasse gar keine dynamisch erstellten
// Elemente, insofern ist auch der Destruktor recht arbeitslos
}
verbSpanish& verbSpanish::operator= (const verbSpanish& v)
{
if (this == &v)
return *this; // Selbstzuweisung abfangen
foreign = v.foreign;
spanish = v.spanish;
group = v.group;
error = v.error;
if (group != IRREGULAR)
{
gerund = "";
partizip = "";
conjugated = false;
int z;
int p;
for (z = presente; z <= imperativo; z++)
for (p = yo; p <= ellos; p++)
forms[z][p] = "";
}
else
{
gerund = v.gerund;
partizip = v.partizip;
conjugated = v.conjugated;
int z;
int p;
for (z = presente; z <= imperativo; z++)
for (p = yo; p <= ellos; p++)
forms[z][p] = v.forms[z][p];
};
return *this;
}
// Der Vergleichsoperator pr<70>ft, ob zwei verb-Objekte das gleiche Verb meinen. Dazu
// werden die spanische und die fremdsprachliche Form gepr<70>ft.
bool verbSpanish::operator== (const verbSpanish& v) const
{
return ((spanish == v.spanish) && vergleich(foreign, v.foreign));
}
// pr<70>ft ob der TQString mit der spanischen Form <20>bereinstimmt.
bool verbSpanish::operator== (const TQString& s) const
{
return (spanish == s);
}
// pr<70>ft die alphabetische Reihenfolge zweier Verben, dabei werden die spanischen Verben als
// Vergleichskriterium verwendet.
bool verbSpanish::operator< (const verbSpanish& v) const
{
return (spanish < v.spanish) || ((spanish == v.spanish) && (foreign < v.foreign));
}
// Vergleicht die beiden Verbobjekte komplett, mit allen Formen und Feldern.
bool verbSpanish::allEqual(verbSpanish v)
{
bool result = ((spanish == v.spanish) && (foreign == v.foreign) && (group == v.group));
if (result && (IRREGULAR == group))
{
if (!conjugated)
conjugateAll();
if (v.conjugated)
v.conjugateAll();
result = ((delAutoForm(gerund) == delAutoForm(v.gerund)) && (delAutoForm(partizip) == delAutoForm(v.partizip)));
if (result)
{
int z;
int p;
for (z = presente; z <= imperativo; z++)
for (p = yo; p <= ellos; p++)
if (delAutoForm(forms[z][p]) != delAutoForm(v.forms[z][p]))
result = false;
};
};
return result;
}
// pr<70>ft, ob alle Stringfelder des Objektes leere Strings sind.
bool verbSpanish::isEmpty() const
{
bool result = (spanish.isEmpty() && foreign.isEmpty());
if (result && (IRREGULAR == group))
{
result = (gerund.isEmpty() && partizip.isEmpty());
if (result)
{
int z;
int p;
for (z = presente; z <= imperativo; z++)
for (p = yo; p <= ellos; p++)
if (!forms[z][p].isEmpty())
result = false;
};
};
return result;
}
// Gibt den Verbstamm zur<75>ck. Dazu werden die letzten beiden Zeichen abgetrennt,
// handelt es sich um ein reflexives Verb, dann sind es vier Zeichen.
// Hier werden auch die Stammver<65>nderungen der Gruppenverben durchgef<65>hrt.
TQString verbSpanish::getStem() const
{
int ab = 2;
if (isReflexiv())
ab += 2;
TQString s = spanish;
s.truncate(s.length()-ab);
return s;
}
// gibt das Verb in der nicht spanischen Sprache zur<75>ck
TQString verbSpanish::getForeign() const
{
return foreign;
}
// Setzt die nicht-spanische Bedeutung des Verbes. Dabei werden alle f<>hrenden und
// folgenden whitespaces gel<65>scht und alle im string enthaltenen whitespaces zu einem
// Leerzeichen umgewandelt.
// Die Funktion hat den Nebeneffekt, dass auch der String aus dem aufrufenden Program-
// code umgewandelt wird.
// Es wird nicht gepr<70>ft, ob der string keine Leerzeichen mehr enth<74>lt, denn das
// d<>rfte eigentlich nicht vorkommen.
void verbSpanish::setForeign(const TQString &s)
{
foreign = s.simplifyWhiteSpace();
}
// gibt das Verb auf spanisch zur<75>ck
TQString verbSpanish::getSpanish() const
{
return spanish;
}
// Setzt die spanische Bedeutung des Verbes.
// Siehe auch die Bemerkungen zur Arbeitsweise der Funktionbei der setForeign Funktion.
void verbSpanish::setSpanish(const TQString &s)
{
spanish = s.simplifyWhiteSpace();
}
// gibt die Gerundform des Verbes zur<75>ck. Dabei gilt: Alle Gruppenverben haben einen
// regelm<6C><6D>igen Gerund. Nur die irregul<75>ren Verben haben eventuell auch eine andere Gerundform
TQString verbSpanish::getGerund()
{
if (!conjugated)
conjugateAll();
return delAutoForm(gerund);
}
// setzt die Gerundform des Verbes
// Siehe auch die Bemerkungen zur Arbeitsweise der Funktionbei der setForeign Funktion.
void verbSpanish::setGerund(const TQString &s)
{
gerund = s.simplifyWhiteSpace();
}
// gibt die Partizipform der Verbes zur<75>ck.Dabei gilt: Alle Gruppenverben haben ein
// regelm<6C><6D>iges Partizip. Nur die irregul<75>ren Verben haben eventuell auch eine andere Partizipform
TQString verbSpanish::getPartizip()
{
if (!conjugated)
conjugateAll();
return delAutoForm(partizip);
}
// setzt die Partizipform der Verbes
// Siehe auch die Bemerkungen zur Arbeitsweise der Funktionbei der setForeign Funktion.
void verbSpanish::setPartizip(const TQString &s)
{
partizip = s.simplifyWhiteSpace();
}
// gibt die Endung des Verbes zur<75>ck.
endings verbSpanish::getEnding(bool& good)
{
if (spanish.isEmpty())
return empty;
endings en = empty;
TQString endung = "";
if (isReflexiv())
{
endung = spanish.mid(spanish.length()-4, 2);
}
else
{
endung = spanish.right(2);
};
if (endung == "ar")
{
en = ar;
}
else
if ((endung == "ir")||(endung == "<EFBFBD>r"))
{
en = ir;
}
else
if (endung == "er")
{
en = er;
}
else
{
good = false;
// qWarning("The class verb couldn't find the ending of the verb " + spanish + ".");
};
return en;
}
// gibt zur<75>ck, ob das Verb reflexiv ist. Dazu werden die letzten beiden Zeichen
// untersucht. Sind diese beiden 'se', dann ist es ein reflexives Verb.
bool verbSpanish::isReflexiv() const
{
return (spanish.right(2) == "se");
}
// gibt das Reflexivpronomen zur<75>ck, das zu der angegebenen Person geh<65>rt.
TQString verbSpanish::getRefPron(int i)
{
return refPron[i];
}
// pr<70>ft, ob es ein unregelm<6C><6D>iges Verb ist
bool verbSpanish::isGroupVerb()
{
return (IRREGULAR != group);
}
// setzen, ob ein Verb regelm<6C><6D>ig oder unregelm<6C><6D>ig ist
void verbSpanish::setGroup(const int g)
{
group = g;
}
// Gibt die angeforderte Verbform des Verbes zur<75>ck, die durch die Zeit t,
// die Person p und den Untertyp typ angegeben wird. Mit dieser Funktion k<>nnen auch
// die zusammengesetzten Zeitforms erfragt werden.
// parts[0] = ref. Pron. part[1] = Hilfsverb parts[2] = verb
bool verbSpanish::getForm(int t, int p, int typ, TQString parts[])
{
bool good = !error;
if (good)
{
if (!conjugated)
good = conjugateAll();
// sich um das Reflexivpronomen k<>mmern
if (isReflexiv())
{
parts[0] = getRefPron(p);
}
else
parts[0] = "";
// die anderen Teile der Form sammeln
switch (typ)
{
// die normale Zeitenbildung: kein Hilfsverb, Zeitform
case 0:
parts[1] = "";
parts[2] = forms[t][p];
break;
// die Verlaufsform der Zeitenbildung
case 1:
parts[1] = estar[t][p];
parts[2] = gerund;
break;
// die Perfektform der Zeitenbildung
case 2:
parts[1] = haber[t][p];
parts[2] = partizip;
break;
default:
good = false;
};
// Das '#' bei den automatisch erstellten Formen l<>schen.
parts[2] = delAutoForm(parts[2]);
};
return good;
}
// Eine <20>berladene Funktion, die einen String zur<75>ckgibt.
TQString verbSpanish::getForm(int t, int p)
{
TQString st[3];
if (getForm(t, p, normal, st))
return st[2];
return "";
}
// setzt die angegebene Verbform mit int als Parameter
// Siehe auch die Bemerkungen zur Arbeitsweise der Funktion bei der setForeign Funktion.
void verbSpanish::setForm(int t, int p, TQString s)
{
forms[t][p] = s.simplifyWhiteSpace();
}
// bildet die Formen, d.h. h<>ngt die Endungen an den unver<65>nderlichen
// Teil an.
// Die Form muss bisher ein leerer String sein.
bool verbSpanish::conjugateTime(const int t, const TQString &s)
{
bool good = true;
for (int i = yo; i <=ellos; i++)
{
if (forms[t][i].isEmpty())
{
forms[t][i] = s + verbEndings[t][getEnding(good)][i]+'#';
if (group > IRREGULAR)
good = groupVerb(forms[t][i], t, i);
};
};
return good;
}
// bildet die Formen des Pr<50>sens
// dazu wird an den Verbstamm die entsprechende Endung angeh<65>ngt
bool verbSpanish::conjugatePresente()
{
TQString s = getStem();
return conjugateTime(presente, s);
}
// bildet die Formen des Imperfecto
// dazu wird an den Verbstamm die entsprechende Endung angeh<65>ngt
bool verbSpanish::conjugateImperfecto()
{
TQString s = getStem();
return conjugateTime(imperfecto, s);
}
// bildet die Formen des Indefinido
// dazu wird an den Verbstamm die entsprechende Endung angeh<65>ngt
bool verbSpanish::conjugateIndefinido()
{
TQString s = getStem();
return conjugateTime(indefinido, s);
}
// bildet die Formen des Futuro
// dazu wird die entsprechende Endung an den Infinitiv angeh<65>ngt. Bei den reflexiven
// Verben muss das 'se' abgetrennt werden.
bool verbSpanish::conjugateFuturo()
{
TQString s = getSpanish();
if (isReflexiv())
s = s.left(s.length()-2);
return conjugateTime(futuro, s);
}
// bildet die Formen des Conditional
// diese Formen werden ebenfalls vom Infinitiv des Verbes abgeleitet
bool verbSpanish::conjugateCondicional()
{
TQString s = getSpanish();
if (isReflexiv())
s = s.left(s.length()-2);
return conjugateTime(condicional, s);
}
// IM ctor der Optionen-Klasse und beim Lesen der Optionen werden die nicht
// fertigen Zeiten abegew<65>hlt. NIcht vergessen!
bool verbSpanish::conjugateSubPresente()
{
// qWarning("Not yet implemented.");
return true;
}
bool verbSpanish::conjugateSubPasado()
{
// qWarning("Not yet implemented.");
return true;
}
bool verbSpanish::conjugateImperativo()
{
// qWarning("Not yet implemented.");
return true;
}
// konjugiert alle Zeitenformen
bool verbSpanish::conjugateAll()
{
bool good = true;
good = good && conjugatePresente();
good = good && conjugateImperfecto();
good = good && conjugateIndefinido();
good = good && conjugateFuturo();
good = good && conjugateCondicional();
good = good && conjugateSubPresente();
good = good && conjugateSubPasado();
good = good && conjugateImperativo();
if (partizip.isEmpty())
{
partizip = getStem();
switch (getEnding(good))
{
case ar:
partizip += "ado#";
break;
case er:
case ir:
partizip += "ido#";
break;
default:
good = false;
};
};
if (gerund.isEmpty())
{
gerund = getStem();
switch (getEnding(good))
{
case ar:
gerund += "ando#";
break;
case er:
case ir:
// Bei den Verben der Gruppe 16 f<>llt das i weg.
if (getGroup() == 16)
gerund += "endo#";
else
{
// Bei Verben der Gruppe 5 <20>ndert sich der Stamm f<>r den Gerund
if (getGroup() == 5)
{
int pos = gerund.findRev("e");
if (pos>=0)
{
gerund.replace(pos, 1, "i");
};
}
gerund += "iendo#";
};
break;
default:
good = false;
};
};
conjugated = true;
error = !good;
return good;
}
// Stringvergleich, bei dem es nur auf <20>hnlich Bestandteile ankommt.
// Bestandteile sind durch Komma getrennt.
bool verbSpanish::vergleich(const TQString& s1, const TQString& s2) const
{
bool gleich=false;
unsigned int l=0;
int r=s1.find(",", l);
while ((l<s1.length()) && (false==gleich))
{
if (-1 == r)
r = s1.length();
if (s2.find(s1.mid(l, r-l).simplifyWhiteSpace(), 0) != -1)
{
gleich = true;
}
else
{
l = r+1;
r=s1.find(",", l);
};
};
return gleich;
}
// returns true if the form is automatic generated and has a '#' on the right end.
bool verbSpanish::isAutoForm(TQString& s) const
{
if ("#" == s.right(1))
return true;
return false;
}
// l<>scht das '#' einer automatisch generierten Form
TQString verbSpanish::delAutoForm(TQString s) const
{
if (isAutoForm(s))
s = s.left(s.length()-1);
return s;
}
// does the changes for group verbs
// The verbs are divided in several groups:
// 0 -> regular
// 1 -> irregular
// 2 -> <e -> ie>
// 3 -> <o -> ue>
// 4 -> <u -> ue>
// 5 -> <e -> i>
// 6 -> <c -> qu>
// 7 -> <g -> gu>
// 8 -> <z -> c>
// 9 -> <gu -> g<>>
// 10 -> <c -> z>
// 11 -> <g -> j>
// 12 -> <gu -> g>
// 13 -> <qu -> c>
// 14 -> <accent like 'enviar'>
// 15 -> <accent like 'continuar'>
// 16 -> <missing i>
//
bool verbSpanish::groupVerb(TQString &s, int time/*=-1*/, int person/*=-1*/)
{
bool good = true;
int pos;
switch (group)
{
case 2: // <e -> ie>
// betrifft den Presente und den Subjuntivo Presente und einige Imperativformen
// dabei jeweils die Personen 1-3 im Singular und die 3. Person Plural.
// Subjuntivo Presente wird hier nicht bearbeitet, weil der von der ersten Person
// Singular abgeleitet wird und die sollte schon richtig sein.
if ((presente == time) || (imperativo == time))
{
if ((nosotros != person) && (vosotros != person))
{
pos = s.findRev("e");
if (pos>=0)
s.replace(pos, 1, "ie");
};
};
break;
case 3: // <o -> ue>
// betrifft den Presente und den Subjuntivo Presente und einige Imperativformen
// dabei jeweils die Personen 1-3 im Singular und die 3. Person Plural.
// Subjuntivo Presente wird hier nicht bearbeitet, weil der von der ersten Person
// Singular abgeleitet wird und die sollte schon richtig sein.
if ((presente == time) || (imperativo == time))
{
if ((nosotros != person) && (vosotros != person))
{
pos = s.findRev("o", -3);
if (pos>=0)
s.replace(pos, 1, "ue");
};
};
break;
case 4: // <u -> ue>
// betrifft den Presente und den Subjuntivo Presente und einige Imperativformen
// dabei jeweils die Personen 1-3 im Singular und die 3. Person Plural.
// Subjuntivo Presente wird hier nicht bearbeitet, weil der von der ersten Person
// Singular abgeleitet wird und die sollte schon richtig sein.
if ((presente == time) || (imperativo == time))
{
if ((nosotros != person) && (vosotros != person))
{
pos = s.findRev("u");
if (pos>=0)
s.replace(pos, 1, "ue");
};
};
break;
case 5: // <e -> i>
// Betrifft Pr<50>sens (1.-3. Pers Singular und 3. Person Plural)
// die Gerundform, die wird allerdings nicht hier behandelt, sondern in conjugateAll()
// indefinido 3. Person Sg und Pl.
// alle subjuntivo Formen und den imperativo
if ((presente == time) && (person != nosotros) && (person != vosotros))
{
TQString st = getStem();
pos = st.findRev("e");
if (pos>=0)
{
st.replace(pos, 1, "i");
s = st + verbEndings[time][getEnding(good)][person];
};
}
else
if ((indefinido == time) && ((el == person)||(ellos == person)))
{
TQString st = getStem();
pos = st.findRev("e");
if (pos>=0)
{
st.replace(pos, 1, "i");
s = st + verbEndings[time][getEnding(good)][person];
};
}
else
if (imperativo == time)
{
good = false;
// qWarning("Imperativo for group verbs isn't ready.");
};
break;
case 6: // <c -> qu> (vor e wird c zu qu)
pos = s.findRev("ce");
if (pos>=0)
s.replace(pos, 2, "que");
else
{
pos = s.findRev("c<EFBFBD>");
if (pos>=0)
s.replace(pos, 2, "qu<EFBFBD>");
}
break;
case 7: // <g -> gu> (vor e wird g zu gu)
pos = s.findRev("ge");
if (pos>=0)
s.replace(pos, 2, "gue");
else
{
pos = s.findRev("g<EFBFBD>");
if (pos>=0)
s.replace(pos, 2, "gu<EFBFBD>");
}
break;
case 8: // <z -> c> (vor e wird z zu c)
pos = s.findRev("ze");
if (pos>=0)
s.replace(pos, 2, "ce");
else
{
pos = s.findRev("z<EFBFBD>");
if (pos>=0)
s.replace(pos, 2, "c<EFBFBD>");
}
break;
case 9: // <gu -> g<>> (vor e wird gu zu g<>)
pos = s.findRev("gue");
if (pos>=0)
s.replace(pos, 3, "g<EFBFBD>e");
else
{
pos = s.findRev("gu<EFBFBD>");
if (pos>=0)
s.replace(pos, 3, "g<EFBFBD><EFBFBD>");
}
break;
case 10: // <c -> z> (vor o und a wird c zu z)
pos = s.findRev("co");
if (pos>=0)
s.replace(pos, 2, "zo");
else
{
pos = s.findRev("ca");
if (pos>=0)
s.replace(pos, 2, "za");
};
break;
case 11: // <g -> j> (vor o und a wird g zu j)
pos = s.findRev("ga");
if (pos>=0)
s.replace(pos, 2, "ja");
else
{
pos = s.findRev("go");
if (pos>=0)
s.replace(pos, 2, "jo");
};
break;
case 12: // <gu -> g> (vor o und a wird gu zu g)
pos = s.findRev("guo");
if (pos>=0)
s.replace(pos, 3, "go");
else
{
pos = s.findRev("gua");
if (pos>=0)
s.replace(pos, 3, "ga");
};
break;
case 13: // <qu -> c> (vor o und a wird qu zu c)
pos = s.findRev("quo");
if (pos>=0)
s.replace(pos, 3, "co");
else
{
pos = s.findRev("qua");
if (pos>=0)
s.replace(pos, 3, "ca");
};
break;
case 14: // <accent like 'enviar'>
// <20>nderungen betreffen die Pr<50>sensformen au<61>er nosotros und vosotros. Au<41>erdem den
// Subjuntivo presente, der von der 1.Person singular abgeleitet wird und daher hier nicht
// behandelt werden muss. Des Weiteren sind einige Imperativformen betroffen.
if (presente == time)
{
switch (person)
{
case yo:
s = s.left(s.length()-3) + "<EFBFBD>o#";
break;
case tu:
s = s.left(s.length()-4) + "<EFBFBD>as#";
break;
case el:
s = s.left(s.length()-3) + "<EFBFBD>a#";
break;
case ellos:
s = s.left(s.length()-4) + "<EFBFBD>an#";
break;
default:
{};
};
}
else
if (imperativo == time)
{
switch (person)
{
case tu:
s = s.left(s.length()-3) + "<EFBFBD>a#";
break;
case el:
s = s.left(s.length()-3) + "<EFBFBD>e#";
break;
case ellos:
s = s.left(s.length()-4) + "<EFBFBD>en#";
break;
default:
{};
};
};
break;
case 15: // <accent like 'continuar'>
// <20>nderungen betreffen die Pr<50>sensformen au<61>er nosotros und vosotros. Au<41>erdem den
// Subjuntivo presente, der von der 1.Person singular abgeleitet wird und daher hier nicht
// behandelt werden muss. Des Weiteren sind einige Imperativformen betroffen.
if (presente == time)
{
switch (person)
{
case yo:
s = s.left(s.length()-3) + "<EFBFBD>o#";
break;
case tu:
s = s.left(s.length()-4) + "<EFBFBD>as#";
break;
case el:
s = s.left(s.length()-3) + "<EFBFBD>a#";
break;
case ellos:
s = s.left(s.length()-4) + "<EFBFBD>an#";
break;
default:
{};
};
}
else
if (imperativo == time)
{
switch (person)
{
case tu:
s = s.left(s.length()-3) + "<EFBFBD>a#";
break;
case el:
s = s.left(s.length()-3) + "<EFBFBD>e#";
break;
case ellos:
s = s.left(s.length()-4) + "<EFBFBD>en#";
break;
default:
{};
};
};
break;
case 16: // <missing i>
// <20>nderungen betreffen die Gerund-Form, den Indefinido in der 3. Person Singular
// und Plural und den Subjuntivo Pasado. Hier wird der Subjuntivo nicht bearbeitet,
// weil er von der 3. Person des Indefinido abgeleitet wird. Diese Form sollte bereits
// ge<67>ndert sein. Ebenso wird der Gerund in der ConjugateAll()-Funktion behandelt.
if ("i<EFBFBD>#" == s.right(3))
{
s = s.left(s.length()-3) + "<EFBFBD>#";
}
else
if ("ieron#" == s.right(6))
{
s = s.left(s.length()-6) + "eron#";
};
break;
default:
good = false;
};
return good;
}