From 396dff843127acdb0d2304262c6fd655c1c41d84 Mon Sep 17 00:00:00 2001 From: Viktor Szakats Date: Sat, 14 Nov 2009 17:11:06 +0000 Subject: [PATCH] 2009-11-14 18:08 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * src/rtl/hbi18n1.c + Added plural form support for these languages: CS, FR, GA, HR, HU, JA, KO, LV, PT-BR, RO, SK, SL, SR, TR, UK, VI * src/rtl/cputime.c * Minor formatting. --- harbour/ChangeLog | 8 ++++ harbour/src/rtl/cputime.c | 4 +- harbour/src/rtl/hbi18n1.c | 86 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 92 insertions(+), 6 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 9f5ac3d59f..99bce2a150 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,14 @@ past entries belonging to author(s): Viktor Szakats. */ +2009-11-14 18:08 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) + * src/rtl/hbi18n1.c + + Added plural form support for these languages: + CS, FR, GA, HR, HU, JA, KO, LV, PT-BR, RO, SK, SL, SR, TR, UK, VI + + * src/rtl/cputime.c + * Minor formatting. + 2009-11-14 16:15 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * external/sqlite3/sqlite3.c * external/sqlite3/sqlite3.h diff --git a/harbour/src/rtl/cputime.c b/harbour/src/rtl/cputime.c index 907705da9f..eec7b56587 100644 --- a/harbour/src/rtl/cputime.c +++ b/harbour/src/rtl/cputime.c @@ -102,7 +102,7 @@ double hb_secondsCPU( int n ) { struct tms tm; - times(&tm); + times( &tm ); if( n > 10 ) { @@ -119,7 +119,7 @@ double hb_secondsCPU( int n ) /* In POSIX-1996 the CLK_TCK symbol is mentioned as obsolescent */ /* d /= CLK_TCK; */ - d /= (double) sysconf(_SC_CLK_TCK); + d /= ( double ) sysconf( _SC_CLK_TCK ); } #else if( n > 10 ) diff --git a/harbour/src/rtl/hbi18n1.c b/harbour/src/rtl/hbi18n1.c index 8414a58ccb..ad7ec8f6a0 100644 --- a/harbour/src/rtl/hbi18n1.c +++ b/harbour/src/rtl/hbi18n1.c @@ -98,6 +98,23 @@ #define HB_I18N_PLURAL_EN 1 #define HB_I18N_PLURAL_PL 2 #define HB_I18N_PLURAL_LT 3 +#define HB_I18N_PLURAL_CS 4 +#define HB_I18N_PLURAL_FR 5 +#define HB_I18N_PLURAL_GA 6 +#define HB_I18N_PLURAL_HR 7 +#define HB_I18N_PLURAL_HU 8 +#define HB_I18N_PLURAL_JA 9 +#define HB_I18N_PLURAL_KO 10 +#define HB_I18N_PLURAL_LV 11 +#define HB_I18N_PLURAL_PT_BR 12 +#define HB_I18N_PLURAL_RO 13 +#define HB_I18N_PLURAL_RU 14 +#define HB_I18N_PLURAL_SK 15 +#define HB_I18N_PLURAL_SL 16 +#define HB_I18N_PLURAL_SR 17 +#define HB_I18N_PLURAL_TR 18 +#define HB_I18N_PLURAL_UK 19 +#define HB_I18N_PLURAL_VI 20 typedef struct _HB_PLURAL_FORMS { @@ -108,9 +125,26 @@ HB_PLURAL_FORMS, *PHB_PLURAL_FORMS; static const HB_PLURAL_FORMS s_plural_forms[] = { - { "EN", HB_I18N_PLURAL_EN }, - { "PL", HB_I18N_PLURAL_PL }, - { "LT", HB_I18N_PLURAL_LT } + { "EN" , HB_I18N_PLURAL_EN }, + { "PL" , HB_I18N_PLURAL_PL }, + { "LT" , HB_I18N_PLURAL_LT }, + { "CS" , HB_I18N_PLURAL_CS }, + { "FR" , HB_I18N_PLURAL_FR }, + { "GA" , HB_I18N_PLURAL_GA }, + { "HR" , HB_I18N_PLURAL_HR }, + { "HU" , HB_I18N_PLURAL_HU }, + { "JA" , HB_I18N_PLURAL_JA }, + { "KO" , HB_I18N_PLURAL_KO }, + { "LV" , HB_I18N_PLURAL_LV }, + { "PT-BR", HB_I18N_PLURAL_PT_BR }, + { "RO" , HB_I18N_PLURAL_RO }, + { "RU" , HB_I18N_PLURAL_RU }, + { "SK" , HB_I18N_PLURAL_SK }, + { "SL" , HB_I18N_PLURAL_SL }, + { "SR" , HB_I18N_PLURAL_SR }, + { "TR" , HB_I18N_PLURAL_TR }, + { "UK" , HB_I18N_PLURAL_UK }, + { "VI" , HB_I18N_PLURAL_VI } }; #define HB_PLURAL_FOMRS_COUNT ( sizeof( s_plural_forms ) / sizeof( HB_PLURAL_FORMS ) ) @@ -168,6 +202,10 @@ static const char * hb_i18n_pluralformid( int iForm ) return NULL; } +/* NOTE: Source: + http://www.gnu.org/software/hello/manual/gettext/Plural-forms.html + [vszakats] */ + static long hb_i18n_pluralindex( int iForm, PHB_ITEM pNum ) { double n = hb_numRound( hb_itemGetND( pNum ), 10 ), n10, n100; @@ -180,12 +218,52 @@ static long hb_i18n_pluralindex( int iForm, PHB_ITEM pNum ) return n == 1 ? 1 : ( n10 >= 2 && n10 <= 4 && ( n100 < 10 || n100 >= 20 ) ? 2 : 3 ); + case HB_I18N_PLURAL_RO: + n100 = fmod( n, 100.0 ); + return n == 1 ? 1 : ( n == 0 || ( n100 > 0 && n100 < 20 ) ) ? 2 : 3; + + case HB_I18N_PLURAL_HR: + case HB_I18N_PLURAL_SR: + case HB_I18N_PLURAL_RU: + case HB_I18N_PLURAL_UK: + n10 = fmod( n, 10.0 ); + n100 = fmod( n, 100.0 ); + return n10 == 1 && n100 != 11 ? 1 : n10 >= 2 && n10 <= 4 && ( n100 < 10 || n100 >= 20 ) ? 2 : 3; + + case HB_I18N_PLURAL_CS: + case HB_I18N_PLURAL_SK: + return n == 1 ? 1 : ( ( n >= 2 && n <= 4 ) ? 2 : 3 ); + + case HB_I18N_PLURAL_SL: + n10 = fmod( n, 10.0 ); + n100 = fmod( n, 100.0 ); + return n100 == 1 ? 1 : ( n100 == 2 ? 1 : ( n100 == 3 || n100 == 4 ? 3 : 4 ) ); + case HB_I18N_PLURAL_LT: n10 = fmod( n, 10.0 ); n100 = fmod( n, 100.0 ); - return n10 == 1 && n100 != 11 ? 1 : (n10 != 0 && (n100 < 10 || n100 >= 20) ? 2 : 3); + return n10 == 1 && n100 != 11 ? 1 : ( n10 != 0 && ( n100 < 10 || n100 >= 20 ) ? 2 : 3 ); + + case HB_I18N_PLURAL_LV: + n10 = fmod( n, 10.0 ); + n100 = fmod( n, 100.0 ); + return ( n10 == 1 && n100 != 11 ) ? 1 : ( n != 0 ? 2 : 3 ); + + case HB_I18N_PLURAL_GA: + return n == 1 ? 1 : ( n == 2 ? 2 : 3 ); + + case HB_I18N_PLURAL_JA: + case HB_I18N_PLURAL_KO: + case HB_I18N_PLURAL_VI: + case HB_I18N_PLURAL_TR: + return 1; + + case HB_I18N_PLURAL_FR: + case HB_I18N_PLURAL_PT_BR: + return n <= 1 ? 1 : 2; case HB_I18N_PLURAL_EN: + case HB_I18N_PLURAL_HU: default: return n == 1 ? 1 : 2; }