The personal pronouns were victim of my KEduVocWordFlag change, but the articles were victim of an API mixup: KEduVocIdentifier.articles() returned by value,
and kvtml2reader was modifying the return value. Returning by reference solves the problem.
Additionally I added some code to hopefully catch the null-d-pointer bug in KEduVocWordType.
svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=847463
QString KEduVocArticle::article(const KEduVocWordFlags& flags)
{
- return d->m_articles.value(flags);
+ return d->m_articles.value(flags & (KEduVocWordFlag::genders | KEduVocWordFlag::numbers | KEduVocWordFlag::Definite | KEduVocWordFlag::Indefinite));
}
void KEduVocArticle::setArticle(const QString & article, const KEduVocWordFlags& flags)
{
- d->m_articles[flags] = article;
+ d->m_articles[flags & (KEduVocWordFlag::genders | KEduVocWordFlag::numbers | KEduVocWordFlag::Definite | KEduVocWordFlag::Indefinite)] = article;
}
bool KEduVocArticle::isEmpty()
{
- return d->m_articles.isEmpty();
+ // we don't count empty strings as articles
+ foreach(QString s, d->m_articles.values())
+ {
+ if (!s.isEmpty())
+ return false;
+ }
+ return true;
}
d->m_articles = articles;
}
-KEduVocArticle KEduVocIdentifier::article() const
+KEduVocArticle& KEduVocIdentifier::article() const
{
return d->m_articles;
}
-KEduVocPersonalPronoun KEduVocIdentifier::personalPronouns() const
+KEduVocPersonalPronoun& KEduVocIdentifier::personalPronouns() const
{
return d->m_personalPronouns;
}
* Articles (a, the in English, el, la,... in Spanish)
* @returns articles
*/
- KEduVocArticle article() const;
+ KEduVocArticle& article() const;
/**
* Sets the articles for this identifier
* Get the personal pronouns for this identifier
* @returns a KEduVocPersonalPronoun containing the personal pronouns
*/
- KEduVocPersonalPronoun personalPronouns() const;
+ KEduVocPersonalPronoun& personalPronouns() const;
/**
* Sets personal pronouns
defs[0] = KEduVocWordFlag::Definite;
defs[1] = KEduVocWordFlag::Indefinite;
-
for ( int num = 0; num <= 2; ++num) {
QDomElement numberElement = articleElement.firstChildElement( KVTML_GRAMMATICAL_NUMBER[num] );
if (!numberElement.isNull()) {
// the actual pronouns
- for ( int num = 0; num <= 2; num++ ) {
+ for ( int num = 0; num < 3; num++ ) {
QDomElement numberElement = m_domDoc.createElement( KVTML_GRAMMATICAL_NUMBER[num] );
for ( int person = 0; person < 5; person++ ) {
QString pronounString = pronoun.personalPronoun(numbers[num] | persons[person]);
QString KEduVocPersonalPronoun::personalPronoun(KEduVocWordFlags flags) const
{
- return d->m_personalpronouns.value(flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers));
+ return d->m_personalpronouns.value(flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers| KEduVocWordFlag::genders));
}
void KEduVocPersonalPronoun::setPersonalPronoun(const QString & personalpronoun, KEduVocWordFlags flags)
{
- d->m_personalpronouns[flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers)] = personalpronoun;
+ d->m_personalpronouns[flags & (KEduVocWordFlag::persons | KEduVocWordFlag::numbers| KEduVocWordFlag::genders)] = personalpronoun;
}
#include "keduvockvtml2writer.h"
#include <KDebug>
#include <QtCore/QMap>
+#include <assert.h>
class KEduVocTranslation::KEduVocTranslationPrivate
{
}
KEduVocTranslation::KEduVocTranslation(KEduVocExpression* entry) : d( new KEduVocTranslationPrivate(entry) )
-{}
+{
+
+ assert(d);
+
+}
KEduVocTranslation::KEduVocTranslation(KEduVocExpression* entry, const QString &translation ) : d( new KEduVocTranslationPrivate(entry) )
{
setText(translation.simplified());
+
+ assert(d);
+
}
KEduVocTranslation::KEduVocTranslation( const KEduVocTranslation &other )
if (other.d->m_declension) {
d->m_declension = new KEduVocDeclension(*other.d->m_declension);
}
+
+ assert(d);
+
}
KEduVocTranslation::~KEduVocTranslation()
if (translation.d->m_declension) {
d->m_declension = new KEduVocDeclension(*translation.d->m_declension);
}
+
+ assert(d);
+
return *this;
}
KEduVocWordType * KEduVocTranslation::wordType() const
{
- return d->m_wordType;
+ if (d)
+ return d->m_wordType;
+ else
+ return 0;
}
void KEduVocTranslation::setWordType(KEduVocWordType * wordType)
}
}
+ // TODO translation(i)'s d pointer can be null. How should we fix this?
// remove from cache
bool found = false;
foreach(int i, translation->entry()->translationIndices()) {