Skip to content

Commit

Permalink
WIP step 8
Browse files Browse the repository at this point in the history
Bascule vers la limite a 9999 pour les annees
  • Loading branch information
marcboulle committed Nov 28, 2023
1 parent d3a3a68 commit 0ca1a25
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 15 deletions.
2 changes: 1 addition & 1 deletion src/Learning/KWData/KWDatabaseFormatDetector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
6 changes: 3 additions & 3 deletions src/Learning/KWData/KWDate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions src/Learning/KWData/KWDate.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
}
Expand Down
26 changes: 25 additions & 1 deletion src/Learning/KWData/KWDateTime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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++)
{
Expand All @@ -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
Expand Down
17 changes: 10 additions & 7 deletions src/Learning/KWData/KWDateTime.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
Expand All @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/Learning/MODL/MODL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down

0 comments on commit 0ca1a25

Please sign in to comment.