tools/linguist/shared/numerus.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
    62 static const uchar icelandicRules[] =
    62 static const uchar icelandicRules[] =
    63     { Q_MOD_10 | Q_EQ, 1, Q_AND, Q_MOD_100 | Q_NEQ, 11 };
    63     { Q_MOD_10 | Q_EQ, 1, Q_AND, Q_MOD_100 | Q_NEQ, 11 };
    64 static const uchar irishStyleRules[] =
    64 static const uchar irishStyleRules[] =
    65     { Q_EQ, 1, Q_NEWRULE,
    65     { Q_EQ, 1, Q_NEWRULE,
    66       Q_EQ, 2 };
    66       Q_EQ, 2 };
    67 static const uchar slovakRules[] =
    67 static const uchar slovakStyleRules[] =
    68     { Q_EQ, 1, Q_NEWRULE,
    68     { Q_EQ, 1, Q_NEWRULE,
    69       Q_BETWEEN, 2, 4 };
    69       Q_BETWEEN, 2, 4 };
    70 static const uchar macedonianRules[] =
    70 static const uchar macedonianRules[] =
    71     { Q_MOD_10 | Q_EQ, 1, Q_NEWRULE,
    71     { Q_MOD_10 | Q_EQ, 1, Q_NEWRULE,
    72       Q_MOD_10 | Q_EQ, 2 };
    72       Q_MOD_10 | Q_EQ, 2 };
    98 static const uchar arabicRules[] =
    98 static const uchar arabicRules[] =
    99     { Q_EQ, 0, Q_NEWRULE,
    99     { Q_EQ, 0, Q_NEWRULE,
   100       Q_EQ, 1, Q_NEWRULE,
   100       Q_EQ, 1, Q_NEWRULE,
   101       Q_EQ, 2, Q_NEWRULE,
   101       Q_EQ, 2, Q_NEWRULE,
   102       Q_MOD_100 | Q_BETWEEN, 3, 10, Q_NEWRULE,
   102       Q_MOD_100 | Q_BETWEEN, 3, 10, Q_NEWRULE,
   103       Q_MOD_100 | Q_NOT | Q_BETWEEN, 0, 2 };
   103       Q_MOD_100 | Q_GEQ, 11 };
   104 static const uchar tagalogRules[] =
   104 static const uchar tagalogRules[] =
   105     { Q_LEQ, 1, Q_NEWRULE,
   105     { Q_LEQ, 1, Q_NEWRULE,
   106       Q_MOD_10 | Q_EQ, 4, Q_OR, Q_MOD_10 | Q_EQ, 6, Q_OR, Q_MOD_10 | Q_EQ, 9 };
   106       Q_MOD_10 | Q_EQ, 4, Q_OR, Q_MOD_10 | Q_EQ, 6, Q_OR, Q_MOD_10 | Q_EQ, 9 };
   107 static const uchar catalanRules[] =
   107 static const uchar catalanRules[] =
   108     { Q_EQ, 1, Q_NEWRULE,
   108     { Q_EQ, 1, Q_NEWRULE,
   112 static const char * const englishStyleForms[] = { "Singular", "Plural", 0 };
   112 static const char * const englishStyleForms[] = { "Singular", "Plural", 0 };
   113 static const char * const frenchStyleForms[] = { "Singular", "Plural", 0 };
   113 static const char * const frenchStyleForms[] = { "Singular", "Plural", 0 };
   114 static const char * const icelandicForms[] = { "Singular", "Plural", 0 };
   114 static const char * const icelandicForms[] = { "Singular", "Plural", 0 };
   115 static const char * const latvianForms[] = { "Singular", "Plural", "Nullar", 0 };
   115 static const char * const latvianForms[] = { "Singular", "Plural", "Nullar", 0 };
   116 static const char * const irishStyleForms[] = { "Singular", "Dual", "Plural", 0 };
   116 static const char * const irishStyleForms[] = { "Singular", "Dual", "Plural", 0 };
   117 static const char * const slovakForms[] = { "Singular", "Paucal", "Plural", 0 };
   117 static const char * const slovakStyleForms[] = { "Singular", "Paucal", "Plural", 0 };
   118 static const char * const macedonianForms[] = { "Singular", "Dual", "Plural", 0 };
   118 static const char * const macedonianForms[] = { "Singular", "Dual", "Plural", 0 };
   119 static const char * const lithuanianForms[] = { "Singular", "Paucal", "Plural", 0 };
   119 static const char * const lithuanianForms[] = { "Singular", "Paucal", "Plural", 0 };
   120 static const char * const russianStyleForms[] = { "Singular", "Dual", "Plural", 0 };
   120 static const char * const russianStyleForms[] = { "Singular", "Dual", "Plural", 0 };
   121 static const char * const polishForms[] = { "Singular", "Paucal", "Plural", 0 };
   121 static const char * const polishForms[] = { "Singular", "Paucal", "Plural", 0 };
   122 static const char * const romanianForms[] = { "Singular", "Paucal", "Plural", 0 };
   122 static const char * const romanianForms[] = { "Singular", "Paucal", "Plural", 0 };
   277     // Missing: Sami,
   277     // Missing: Sami,
   278     QLocale::Samoan,
   278     QLocale::Samoan,
   279     QLocale::Sanskrit,
   279     QLocale::Sanskrit,
   280     EOL
   280     EOL
   281 };
   281 };
   282 static const QLocale::Language slovakLanguages[] = { QLocale::Slovak, QLocale::Czech, EOL };
   282 static const QLocale::Language slovakStyleLanguages[] = { QLocale::Slovak, QLocale::Czech, EOL };
   283 static const QLocale::Language macedonianLanguage[] = { QLocale::Macedonian, EOL };
   283 static const QLocale::Language macedonianLanguage[] = { QLocale::Macedonian, EOL };
   284 static const QLocale::Language lithuanianLanguage[] = { QLocale::Lithuanian, EOL };
   284 static const QLocale::Language lithuanianLanguage[] = { QLocale::Lithuanian, EOL };
   285 static const QLocale::Language russianStyleLanguages[] = {
   285 static const QLocale::Language russianStyleLanguages[] = {
   286     QLocale::Bosnian,
   286     QLocale::Bosnian,
   287     QLocale::Byelorussian,
   287     QLocale::Byelorussian,
   316     const uchar *rules;
   316     const uchar *rules;
   317     int rulesSize;
   317     int rulesSize;
   318     const char * const *forms;
   318     const char * const *forms;
   319     const QLocale::Language *languages;
   319     const QLocale::Language *languages;
   320     const QLocale::Country *countries;
   320     const QLocale::Country *countries;
       
   321     const char * const gettextRules;
   321 };
   322 };
   322 
   323 
   323 static const NumerusTableEntry numerusTable[] = {
   324 static const NumerusTableEntry numerusTable[] = {
   324     { 0, 0, japaneseStyleForms, japaneseStyleLanguages, 0 },
   325     { 0, 0, japaneseStyleForms, japaneseStyleLanguages, 0, "nplurals=1; plural=0;" },
   325     { englishStyleRules, sizeof(englishStyleRules), englishStyleForms, englishStyleLanguages, 0 },
   326     { englishStyleRules, sizeof(englishStyleRules), englishStyleForms, englishStyleLanguages, 0,
       
   327       "nplurals=2; plural=(n != 1);" },
   326     { frenchStyleRules, sizeof(frenchStyleRules), frenchStyleForms, frenchStyleLanguages,
   328     { frenchStyleRules, sizeof(frenchStyleRules), frenchStyleForms, frenchStyleLanguages,
   327       frenchStyleCountries },
   329       frenchStyleCountries, "nplurals=2; plural=(n > 1);" },
   328     { latvianRules, sizeof(latvianRules), latvianForms, latvianLanguage, 0 },
   330     { latvianRules, sizeof(latvianRules), latvianForms, latvianLanguage, 0,
   329     { icelandicRules, sizeof(icelandicRules), icelandicForms, icelandicLanguage, 0 },
   331       "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" },
   330     { irishStyleRules, sizeof(irishStyleRules), irishStyleForms, irishStyleLanguages, 0 },
   332     { icelandicRules, sizeof(icelandicRules), icelandicForms, icelandicLanguage, 0,
   331     { slovakRules, sizeof(slovakRules), slovakForms, slovakLanguages, 0 },
   333       "nplurals=2; plural=(n%10==1 && n%100!=11 ? 0 : 1);" },
   332     { macedonianRules, sizeof(macedonianRules), macedonianForms, macedonianLanguage, 0 },
   334     { irishStyleRules, sizeof(irishStyleRules), irishStyleForms, irishStyleLanguages, 0,
   333     { lithuanianRules, sizeof(lithuanianRules), lithuanianForms, lithuanianLanguage, 0 },
   335       "nplurals=3; plural=(n==1 ? 0 : n==2 ? 1 : 2);" },
   334     { russianStyleRules, sizeof(russianStyleRules), russianStyleForms, russianStyleLanguages, 0 },
   336     { slovakStyleRules, sizeof(slovakStyleRules), slovakStyleForms, slovakStyleLanguages, 0,
   335     { polishRules, sizeof(polishRules), polishForms, polishLanguage, 0 },
   337       "nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);" },
   336     { romanianRules, sizeof(romanianRules), romanianForms, romanianLanguages, 0 },
   338     { macedonianRules, sizeof(macedonianRules), macedonianForms, macedonianLanguage, 0,
   337     { slovenianRules, sizeof(slovenianRules), slovenianForms, slovenianLanguage, 0 },
   339       "nplurals=3; plural=(n%100==1 ? 0 : n%100==2 ? 1 : 2);" },
   338     { malteseRules, sizeof(malteseRules), malteseForms, malteseLanguage, 0 },
   340     { lithuanianRules, sizeof(lithuanianRules), lithuanianForms, lithuanianLanguage, 0,
   339     { welshRules, sizeof(welshRules), welshForms, welshLanguage, 0 },
   341       "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);" },
   340     { arabicRules, sizeof(arabicRules), arabicForms, arabicLanguage, 0 },
   342     { russianStyleRules, sizeof(russianStyleRules), russianStyleForms, russianStyleLanguages, 0,
   341     { tagalogRules, sizeof(tagalogRules), tagalogForms, tagalogLanguage, 0 },
   343       "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" },
   342     { catalanRules, sizeof(catalanRules), catalanForms, catalanLanguage, 0 }
   344     { polishRules, sizeof(polishRules), polishForms, polishLanguage, 0,
       
   345       "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" },
       
   346     { romanianRules, sizeof(romanianRules), romanianForms, romanianLanguages, 0,
       
   347       "nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2);" },
       
   348     { slovenianRules, sizeof(slovenianRules), slovenianForms, slovenianLanguage, 0,
       
   349       "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" },
       
   350     { malteseRules, sizeof(malteseRules), malteseForms, malteseLanguage, 0,
       
   351       "nplurals=4; plural=(n==1 ? 0 : (n==0 || (n%100>=1 && n%100<=10)) ? 1 : (n%100>=11 && n%100<=19) ? 2 : 3);" },
       
   352     { welshRules, sizeof(welshRules), welshForms, welshLanguage, 0,
       
   353       "nplurals=5; plural=(n==0 ? 0 : n==1 ? 1 : (n>=2 && n<=5) ? 2 : n==6 ? 3 : 4);" },
       
   354     { arabicRules, sizeof(arabicRules), arabicForms, arabicLanguage, 0,
       
   355       "nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : (n%100>=3 && n%100<=10) ? 3 : n%100>=11 ? 4 : 5);" },
       
   356     { tagalogRules, sizeof(tagalogRules), tagalogForms, tagalogLanguage, 0,
       
   357       "nplurals=3; plural=(n==1 ? 0 : (n%10==4 || n%10==6 || n%10== 9) ? 1 : 2);" },
       
   358     { catalanRules, sizeof(catalanRules), catalanForms, catalanLanguage, 0,
       
   359       "nplurals=3; plural=(n==1 ? 0 : (n==11 || n/1000==11 || n/1000000==11 || n/1000000000==11) ? 1 : 2);" },
   343 };
   360 };
   344 
   361 
   345 static const int NumerusTableSize = sizeof(numerusTable) / sizeof(numerusTable[0]);
   362 static const int NumerusTableSize = sizeof(numerusTable) / sizeof(numerusTable[0]);
   346 
   363 
   347 // magic number for the file
   364 // magic number for the file
   350     0x3c, 0xb8, 0x64, 0x18, 0xca, 0xef, 0x9c, 0x95,
   367     0x3c, 0xb8, 0x64, 0x18, 0xca, 0xef, 0x9c, 0x95,
   351     0xcd, 0x21, 0x1c, 0xbf, 0x60, 0xa1, 0xbd, 0xdd
   368     0xcd, 0x21, 0x1c, 0xbf, 0x60, 0xa1, 0xbd, 0xdd
   352 };
   369 };
   353 
   370 
   354 bool getNumerusInfo(QLocale::Language language, QLocale::Country country,
   371 bool getNumerusInfo(QLocale::Language language, QLocale::Country country,
   355                            QByteArray *rules, QStringList *forms)
   372                     QByteArray *rules, QStringList *forms, const char **gettextRules)
   356 {
   373 {
   357     while (true) {
   374     while (true) {
   358         for (int i = 0; i < NumerusTableSize; ++i) {
   375         for (int i = 0; i < NumerusTableSize; ++i) {
   359             const NumerusTableEntry &entry = numerusTable[i];
   376             const NumerusTableEntry &entry = numerusTable[i];
   360             for (int j = 0; entry.languages[j] != EOL; ++j) {
   377             for (int j = 0; entry.languages[j] != EOL; ++j) {
   363                             || (entry.countries && entry.countries[j] == country))) {
   380                             || (entry.countries && entry.countries[j] == country))) {
   364                     if (rules) {
   381                     if (rules) {
   365                         *rules = QByteArray::fromRawData(reinterpret_cast<const char *>(entry.rules),
   382                         *rules = QByteArray::fromRawData(reinterpret_cast<const char *>(entry.rules),
   366                                                     entry.rulesSize);
   383                                                     entry.rulesSize);
   367                     }
   384                     }
       
   385                     if (gettextRules)
       
   386                         *gettextRules = entry.gettextRules;
   368                     if (forms) {
   387                     if (forms) {
   369                         forms->clear();
   388                         forms->clear();
   370                         for (int k = 0; entry.forms[k]; ++k)
   389                         for (int k = 0; entry.forms[k]; ++k)
   371                             forms->append(QLatin1String(entry.forms[k]));
   390                             forms->append(QLatin1String(entry.forms[k]));
   372                     }
   391                     }