diff --git a/src/Learning/KWData/KWDatabaseFormatDetector.cpp b/src/Learning/KWData/KWDatabaseFormatDetector.cpp index 1e1545c80..4925da39e 100644 --- a/src/Learning/KWData/KWDatabaseFormatDetector.cpp +++ b/src/Learning/KWData/KWDatabaseFormatDetector.cpp @@ -1218,7 +1218,7 @@ int KWDatabaseFormatDetector::ComputeSeparatorPriority(char cSeparator) const // Recherche de la position dans les separateurs preferes nPriority = sPreferredSeparators.Find(cSeparator); - // Si non trouve, on prend le le cracater lui meme d'abord dans sa plage ascii, puis dans la plage ascii etendue + // Si non trouve, on prend le le caractere lui meme d'abord dans sa plage ascii, puis dans la plage ascii etendue if (nPriority == -1) { if (isprint(cSeparator)) diff --git a/src/Learning/KWData/KWDate.cpp b/src/Learning/KWData/KWDate.cpp index dc148e299..73dc5b617 100644 --- a/src/Learning/KWData/KWDate.cpp +++ b/src/Learning/KWData/KWDate.cpp @@ -14,8 +14,8 @@ boolean Date::Init(int nYear, int nMonth, int nDay) // Initialisation a invalide Reset(); - // L'annee doit etre comprise entre 1 et 4000 - if (nYear < 1 or nYear > 4000) + // L'annee doit etre valide + if (nYear < 1 or nYear > DateTime::nMaxYear) bOk = false; // Le mois doit etre compris entre 1 et 12 else if (nMonth < 1 or nMonth > 12) @@ -192,7 +192,7 @@ boolean Date::AddDays(int nValue) nYear = e / 1461 - 4716 + (14 - nMonth) / 12; // Initialisation si annee valide - if (1 <= nYear and nYear <= 4000) + if (1 <= nYear and nYear <= DateTime::nMaxYear) { SetYear(nYear); SetMonth(nMonth); diff --git a/src/Learning/KWData/KWDate.h b/src/Learning/KWData/KWDate.h index 577f77eaa..d68b322d5 100644 --- a/src/Learning/KWData/KWDate.h +++ b/src/Learning/KWData/KWDate.h @@ -29,7 +29,7 @@ class Date : public SystemObject void Reset(); // Initialisation - // Renvoie true si l'initialisation est valide (entre 01/01/0001 et 31/12/4000) + // Renvoie true si l'initialisation est valide (entre 01/01/0001 et 31/12/9999) boolean Init(int nYear, int nMonth, int nDay); // Operateurs de comparaison @@ -386,7 +386,7 @@ inline int Date::Compare(const Date dtOtherDate) const inline void Date::SetYear(int nValue) { - require(1 <= nValue and nValue <= 4000); + require(1 <= nValue and nValue <= DateTime::nMaxYear); dateValue.fields.nYear = nValue; //DDD dateValue.dateFields.nYear = nValue; } diff --git a/src/Learning/KWData/KWDateTime.cpp b/src/Learning/KWData/KWDateTime.cpp index f9f1dc80a..d8eb67d92 100644 --- a/src/Learning/KWData/KWDateTime.cpp +++ b/src/Learning/KWData/KWDateTime.cpp @@ -63,8 +63,20 @@ void DateTime::Test() dtDateTimeValue.WriteInternalFields(cout); assert(dtDateTimeValue.lBytes == dtForbiddenValue.lBytes); + // Test de la partie annees + cout << "\nTimezone years\n"; + dtDateTimeValue.lBytes = 0; + for (i = 0; i < nMaxYear; i++) + { + dtDateTimeValue.fields.nYear = i; + if (i % 1000 == 0) + cout << "." << dtDateTimeValue.fields.nYear; + assert(dtDateTimeValue.fields.nYear == (unsigned int)i); + } + cout << "\n"; + // Test de la partie a la frontiere de minutes de timestamp - cout << "Timezone minutes\n"; + cout << "\nTimezone minutes\n"; dtDateTimeValue.lBytes = 0; for (i = 0; i < 60; i++) { @@ -77,6 +89,18 @@ void DateTime::Test() assert(dtDateTimeValue.parts.nTime == 0); } cout << "\n"; + + // Test de la partie des fractions de secondes + cout << "\nTimezone frac seconds\n"; + dtDateTimeValue.lBytes = 0; + for (i = 0; i < nMaxFracSeconds; i++) + { + dtDateTimeValue.fields.nFrac = i; + if (i % 100 == 0) + cout << "." << dtDateTimeValue.fields.nFrac; + assert(dtDateTimeValue.fields.nFrac == (unsigned int)i); + } + cout << "\n"; } void DateTime::WriteInternalFields(ostream& ost) const diff --git a/src/Learning/KWData/KWDateTime.h b/src/Learning/KWData/KWDateTime.h index 3ef353105..db63454c2 100644 --- a/src/Learning/KWData/KWDateTime.h +++ b/src/Learning/KWData/KWDateTime.h @@ -60,7 +60,7 @@ union DateTime // Attention, il est critique que la taile complete de la structure soit 8 bytes, comme pour les KWValue // Le packing des structures de type bit field pour certains compilateurs ne fonctionne correctement // que pour des sous parties qui sont des multiples de la taille d'un int de 32 bits (cas de Visual C++) - // Cf. C99 standard 6.7.2.1/10 + // Cf. C99 standard 6.7.2.1/10 (c'est meme peu portable: l'ordre des bits peut dependre de l'endianess...) // C'est pourquoi la timezone etant a cheval sur les deux int, les bits de la partie minute // de la timezone sont coupes en deux @@ -70,7 +70,7 @@ union DateTime // Pour manipuler les champs de detail individuellement struct DateTimeFields { - unsigned int nYear : 12; // annee (entre 0 et 4000) + unsigned int nYear : 14; // annee (entre 0 et 9999) unsigned int nMonth : 4; // mois (entre 1 et 12) unsigned int nDay : 5; // jour (entre 1 et 31, ou 0 si invalide) unsigned int nTimeZoneSign : 1; // signe de la timezone (0 si negatif, 1 si positif) @@ -80,23 +80,26 @@ union DateTime unsigned int nHour : 5; // heure de 0 a 23, plus 1 unsigned int nMinute : 6; // minutes de 0 a 59 unsigned int nSecond : 6; // secondes de 0 a 59 - unsigned int nFrac : 15; // partie decimale des secondes; de 0 a 9999 (en 1/10000 de seconde) + unsigned int nFrac : 13; // partie decimale des secondes; de 0 a 999 (en 1/1000 de seconde) } fields; // Pour manipuler d'un coup tous les champs de Date ou de Time, et de Timezone le plus simplement struct DateTimeParts { - unsigned int nDate : 21; // sous-partie des champs Date de base + unsigned int nDate : 23; // sous-partie des champs Date de base unsigned int nTimezone1 : 9; // sous-partie des champs Date de timezone, en deux parties unsigned int nTimezone2 : 2; // - unsigned int nTime : 32; // sous-partie des champs Time + unsigned int nTime : 30; // sous-partie des champs Time } parts; + // Valeur max des annees + static const int nMaxYear = 9999; + // Nombre de digits utilises pour les fraction de secondes - static const int nFracSecondsDigitNumber = 4; + static const int nFracSecondsDigitNumber = 3; // Valeur max des fractions de secondes, en puissance de 10 - static const int nMaxFracSeconds = 10000; + static const int nMaxFracSeconds = 1000; // Constante utilisee pour gerer la valeur interdite de tous les types date time static const longint lForbiddenValue = 0xFFFFFFFFFFFFFFFF; diff --git a/src/Learning/MODL/MODL.cpp b/src/Learning/MODL/MODL.cpp index fee3d9477..63e706a1c 100644 --- a/src/Learning/MODL/MODL.cpp +++ b/src/Learning/MODL/MODL.cpp @@ -33,7 +33,7 @@ int main(int argc, char** argv) MDKhiopsLearningProject learningProject; //DDD - //DDD DateTime::Test(); + //DDD DateTime::Test(); /*DDD cout << "TEST Time\n"; Time::Test();