/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
//Filename : ODATE.CPP
//Description : Date Information Object
#include
#include
#include
#include
#include
#include
#include
//--------- Define static member variables -----------//
#define JULIAN_ADJUSTMENT 1721425L
static char month_str_array[][10] =
{
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
} ;
static int month_tot[]=
{ 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 } ;
// Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
// 31 28 31 30 31 30 31 31 30 31 30 31
//------------ Begin of function DateInfo::julain ----------//
//
// Convert from year, month, day integer format to julian date format
//
// Julian day is the number of days since the date Jan 1, 4713 BC
// Ex. Jan 1, 1981 is 2444606
//
// year, month, day = the components of the date
//
// Return : the julian date
// -1 illegal given date
//
long DateInfo::julian( int year, int month, int day )
{
long total, dayYear ;
dayYear = day_year( year, month, day) ;
if (dayYear < 1)
return( -1) ; /* Illegal Date */
total = ytoj(year) ;
total+= dayYear ;
total+= JULIAN_ADJUSTMENT ;
return total;
}
//-------------- End of function DateInfo::julian ------------//
//--------- Begin of function DateInfo::julian ---------//
//
// Convert a string such as "07/03/93" to long number
//
// Returns:
// >0 - Julian day
// That is the number of days since the date Jan 1, 4713 BC
// Ex. Jan 1, 1981 is 2444606
// 0 - NULL Date (dbf_date is all blank)
// -1 - Illegal Date
//
long DateInfo::julian( char *dateStr )
{
return julian( m.atoi( dateStr,4 ), m.atoi( dateStr+4,2 ),
m.atoi( dateStr+6,2 ) );
}
//---------- End of function DateInfo::julian ----------//
//------------ Begin of function DateInfo::get_date ---------//
//
// Return year, month or day of the given julian date
//
// julianDate = the julian date to be converted
// returnType = 'Y'-year, 'M'-month, 'D'-day
//
// Return : the year, month or day of the julian date
// -1 if the julian date passed is invalid
//
int DateInfo::get_date( long julianDate, char returnType )
{
int year, month, day, nDays, maxDays ;
long totalDays ;
if ( julianDate > 5373484 || julianDate < JULIAN_ADJUSTMENT )
return -1;
totalDays = (long) (julianDate) - JULIAN_ADJUSTMENT ;
year = (int) ((double)totalDays/365.2425) + 1 ;
nDays = (int) (totalDays - ytoj(year)) ;
if ( nDays <= 0 )
{
year-- ;
nDays = (int) (totalDays - ytoj(year)) ;
}
if (year%4 == 0 && year%100 != 0 || year%400 == 0)
maxDays = 366 ;
else
maxDays = 365 ;
if ( nDays > maxDays )
{
year++ ;
nDays -= maxDays ;
}
if ( month_day( year, nDays, month, day ) < 0 )
return -1;
//............................................//
switch( returnType )
{
case 'Y':
return year;
case 'M': // return the month
return month;
case 'D':
return day;
}
return 0;
}
//------------- End of function DateInfo::get_date --------//
//------------ Begin of function DateInfo::date_str ---------//
//
// Convert from julian date format to string date format
// Return a date string in the format of DD MMM YYYY e.g. 15 Jan 1992
//
// Julian day is the number of days since the date Jan 1, 4713 BC
// Ex. Jan 1, 1981 is 2444606
//
// julianDate = the julian date to be converted
// [int] shortMonthStr = short month string or not (e.g. Jan instead of January)
// (default : 0)
//
// Return : the formated date string
//
char* DateInfo::date_str( long julianDate, int shortMonthStr)
{
int year, month, day, nDays, maxDays ;
long totalDays ;
static char strBuf[16];
if ( julianDate > 5373484 || julianDate < JULIAN_ADJUSTMENT )
{
strBuf[0]=NULL;
return strBuf;
}
totalDays = (long) (julianDate) - JULIAN_ADJUSTMENT ;
year = (int) ((double)totalDays/365.2425) + 1 ;
nDays = (int) (totalDays - ytoj(year)) ;
if ( nDays <= 0 )
{
year-- ;
nDays = (int) (totalDays - ytoj(year)) ;
}
if (year%4 == 0 && year%100 != 0 || year%400 == 0)
maxDays = 366 ;
else
maxDays = 365 ;
if ( nDays > maxDays )
{
year++ ;
nDays -= maxDays ;
}
if ( month_day( year, nDays, month, day ) < 0 )
{
strBuf[0]=NULL;
return strBuf;
}
//--------------------------------------------//
static String str;
#if(defined(SPANISH))
if( shortMonthStr )
{
str = itoa(day,strBuf,10); // day
str += "-";
strcpy(strBuf, translate.process(month_str_array[month-1]));
if(strlen(strBuf) > 3)
strBuf[3] = '\0'; // limit month to 3 chars
str += strBuf; // month
str += "-";
str += itoa(year,strBuf,10); // year
}
else
{
str = itoa(day,strBuf,10); // day
str += " de ";
str += translate.process(month_str_array[month-1]);
str += " de ";
str += itoa(year,strBuf,10); // year
}
#elif(defined(FRENCH))
str = itoa(day,strBuf,10); // day
str += " ";
if( shortMonthStr )
{
strcpy(strBuf, translate.process(month_str_array[month-1]));
if(strlen(strBuf) > 3)
strBuf[3] = '\0'; // limit month to 4 chars
if(month == 7) // Juillet(July) abbreviated to Jul.
strBuf[2] = 'l';
str += strBuf; // month
}
else
{
str += translate.process(month_str_array[month-1]);
}
str += " ";
str += itoa(year,strBuf,10); // year
#else
// GERMAN and US
str = translate.process(month_str_array[month-1]);
if( shortMonthStr )
str = str.left(3);
str += " ";
str += itoa(day,strBuf,10);
str += ", ";
str += itoa(year,strBuf,10);
#endif
return str;
}
//------------- End of function DateInfo::date_str --------//
//------------ Begin of function DateInfo::month_str ---------//
//
// monthNo = the month (1-12)
//
// Return : the month string
//
char* DateInfo::month_str(int monthNo)
{
return translate.process(month_str_array[monthNo-1]);
}
//------------- End of function DateInfo::month_str --------//
//---------- Begin of function DateInfo::day_year ----------//
//
// Returns an (int) day of the year starting from 1.
// Ex. Jan 1, returns 1
//
// Returns -1 if it is an illegal date.
//
int DateInfo::day_year( int year, int month, int day )
{
int isLeap, monthDays ;
isLeap = ( year%4 == 0 && year%100 != 0 || year%400 == 0 ) ? 1 : 0 ;
monthDays = month_tot[ month+1 ] - month_tot[ month] ;
if ( month == 2 ) monthDays += isLeap ;
if ( year < 0 ||
month < 1 || month > 12 ||
day < 1 || day > monthDays )
return( -1 ) ; /* Illegal Date */
if ( month <= 2 ) isLeap = 0 ;
return( month_tot[month] + day + isLeap ) ;
}
//------------- End of function DateInfo::day_year -----------//
//----------- Begin of function DateInfo::ytoj ----------//
//
// c4ytoj - Calculates the number of days to the year
//
// This calculation takes into account the fact that
// 1) Years divisible by 400 are always leap years.
// 2) Years divisible by 100 but not 400 are not leap years.
// 3) Otherwise, years divisible by four are leap years.
//
// Since we do not want to consider the current year, we will
// subtract the year by 1 before doing the calculation.
long DateInfo::ytoj( int yr )
{
yr-- ;
return( yr*365L + yr/4L - yr/100L + yr/400L ) ;
}
//--------------- End of function DateInfo::ytoj -----------//
//--------- Begin of function DateInfo::month_day ---------//
//
// Given the year and the day of the year, returns the
// month and day of month.
//
int DateInfo::month_day( int year, int days, int &monthRef, int &dayRef )
{
int isLeap, i ;
isLeap = ( year%4 == 0 && year%100 != 0 || year%400 == 0 ) ? 1 : 0 ;
if ( days <= 59 ) isLeap = 0 ;
for( i = 2; i <= 13; i++)
{
if ( days <= month_tot[i] + isLeap )
{
monthRef = --i ;
if ( i <= 2) isLeap = 0 ;
dayRef = days - month_tot[ i] - isLeap ;
return( 0) ;
}
}
dayRef = 0 ;
monthRef = 0 ;
return( -1 ) ;
}
//----------- End of function DateInfo::month_day -----------//
//--------- Begin of function DateInfo::time_str ---------//
//
// Given a integer as time and then return the time string
//
// inTime = the time in integer format (e.g. 1600 --> "16:00" )
//
char* DateInfo::time_str(int inTime)
{
// #### begin Gilbert 18/8 ####//
static char strBuf[6] = "00:00";
//itoa( inTime/100, strBuf, 10 );
//itoa( inTime%100, strBuf+3, 10 );
strBuf[4] = '0' + inTime % 10;
strBuf[3] = '0' + (inTime/10) % 10;
strBuf[1] = '0' + (inTime/100) % 10;
strBuf[0] = '0' + (inTime/1000) % 10;
// #### end Gilbert 18/8 ####//
return strBuf;
}
//---------- End of function DateInfo::time_str ----------//
//-------- Begin of function DateInfo::days_in_month ------//
//
// return the no. of days in a given month
//
// inMonth = the specified month
//
// return : = the no. of days in a given monthh
//
int DateInfo::days_in_month(int inMonth)
{
return month_tot[inMonth+1] - month_tot[inMonth];
}
//---------- End of function DateInfo::days_in_month ------//
//-------- Begin of function DateInfo::add_months ------//
//
// Add months to the given julian date.
//
// inDate = the input julian date
// addMonth = the no. of months to add
//
// return : - the result julian date
//
int DateInfo::add_months(int inDate, int addMonth)
{
int inYear = year(inDate);
int inMonth = month(inDate);
int inDay = day(inDate);
inMonth += addMonth;
if( inMonth > 12 )
{
inMonth -= 12;
inYear++;
}
if( inDay > days_in_month(inMonth) )
inDay = days_in_month(inMonth);
return julian( inYear, inMonth, inDay );
}
//---------- End of function DateInfo::add_months ------//
//-------- Begin of function DateInfo::file_time_to_julian ------//
//
int DateInfo::file_time_to_julian(FILETIME& fileTime)
{
/*
WORD dosTime, dosDate;
CoFileTimeToDosDateTime( &fileTime, &dosDate, &dosTime );
//--------------------------------------------//
// Bits Contents
// 0-4 Days of the month (1-31).
// 5-8 Months (1 = January, 2 = February, and so forth).
// 9-15 Year offset from 1980 (add 1980 to get actual year).
//--------------------------------------------//
return julian( 1980 + (dosDate>>9), (dosDate>>5) & 0x0F, dosDate & 0x0F );
*/
return 0;
}
//---------- End of function DateInfo::file_time_to_julian ------//