Getting =?UTF-8?Q?=E2=80=9C?= Posted 5.04 Hours ago. =?UTF-8?Q?=E2=80=9D?= from =?UTF-8?Q?=E2=80=9C?= 24 Aug 2007 01:25:20 GMT =?UTF-8?Q?=E2=80=9D.?=
By the way, the VC++ 8.0 code shown below is how I get
??? Posted 5.04 Hours ago. ??? from ??? 24 Aug 2007 01:25:20 GMT ???.
It also tells me how old files are when I'm backing up.
My Print.RES file hasn't been changed in 10 years, so it says:
??? Print.RES was last modified 10 Years ago. ???.
#undef _DEBUG
#define UNICODE
#define _WIN32_WINNT 0x0501
#define WIN32_LEAN_AND_MEAN
#include <Windows.H>
#include <Time.H>
#include <WChar.H>
#define LOOP while ( 1 )
#define Loop( N ) int J = - 1 , LLL = N ; while ( ++ J < LLL )
#define While( Should_Loop ) Ch = 1 , P -- ; \
while ( \
Ch && ( Ch = * ++ P , Ch2 = ! Ch ? 0 : P [ 1 ] , Should_Loop ) )
#define WhileBlack While ( Ch && Ch > 32 )
#define WhileWhite While ( Ch && Ch <= 32 )
#define WhiteSP ( Ch && ( Ch <= 32 || Ch == L',' || Ch == L'!' \
|| Ch == L':' || Ch == L'@' || Ch == L';' || Ch == L'<' \
|| Ch == L'>' || Ch == L'(' || Ch == L')' || Ch == L'"' \
|| Ch == L'\'' ) )
#define Next_Word { While ( ! WhiteSP ); While ( WhiteSP ); }
#define AtoI _wtof
#define Eq ! wcscmp
#define EqN ! wcsncmp
#define Str swprintf
#define Cat_Str wcscat
#define SecsToDate _wasctime
#pragma warning( disable: \
4189 4244 4305 4430 4508 4554 4701 4702 4706 4709 4996 )
typedef unsigned __int64 u64 ; typedef wchar_t * LnP ;
inline int er ( int X , int Y ) { return X < Y ? X : Y ; }
inline u64 er ( u64 X , u64 Y ) { return X < Y ? X : Y ; }
inline float er ( float X , float Y ) { return X < Y ? X : Y ; }
inline int ER ( int X , int Y ) { return X > Y ? X : Y ; }
inline u64 ER ( u64 X , u64 Y ) { return X > Y ? X : Y ; }
inline float ER ( float X , float Y ) { return X > Y ? X : Y ; }
inline int IsDigit( wchar_t Ch ) { return Ch >= '0' && Ch <= '9' ; }
// DateFmt() Sets Date_Now, in seconds since start of 1970.
// Sets Date_Born
#define Calc_Age_Days \
ER( u64( 0 ), Date_Now - Date_Born ) / _24_60_60
u64 Date_Born, Date_Now ;
LnP Month ; int Sec , Min , Hour , PM , Day , Year ;
const int _60_60 = 60 * 60 ; const float _24_60_60 = 24 * _60_60 ;
LnP DateFmt ( LnP P ) { LnP B = P ;
struct tm _TimeRec = { 0, -1 }, * TimeRec = & _TimeRec ;
Date_Born = Date_Now = time( 0 );
if ( ! P || ! * P ) TimeRec = localtime( ( time_t * ) & Date_Now );
else { int Ch, Ch2 ; WhileWhite;
if ( ! IsDigit ( Ch ) ) Next_Word TimeRec->tm_mday = AtoI ( P );
Next_Word LnP _Mo = P ; Next_Word
TimeRec->tm_year = AtoI ( P ) + ( P [ 2 ] <= 32 ? 100 : - 1900 );
Next_Word
const LnP Mos [] = {
L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun"
, L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec" };
Loop ( 12 ) if ( EqN ( _Mo, Mos [ J ], 3 ) ) break ;
TimeRec->tm_mon = J ;
Hour = AtoI ( P ); Next_Word Min = AtoI ( P ); Next_Word
TimeRec->tm_sec = AtoI ( P ); Next_Word
float Zf = 0 ;
if ( ! Eq( P, L"GMT" ) && ! Eq( P, L"UTC" ) )
Zf = AtoI ( P ) / 100. ;
int Z = Zf , Z_Min = 100 * ( Zf - Z );
TimeRec->tm_min = Min -= Z_Min ;
TimeRec->tm_hour
= Hour -= Z + ( _timezone / _60_60 - TimeRec->tm_isdst );
Date_Born = er( Date_Now , mktime( TimeRec ) ); }
LnP T = SecsToDate( TimeRec );
Year = AtoI ( T + 20 ); Month = T + 4 , Month[ 3 ] = 0 ;
Day = AtoI ( T + 8 ); Hour = AtoI ( T + 11 );
PM = Hour >= 12 ; if ( PM ) Hour -= 12 ;
Min = AtoI( T + 14 ); Sec = AtoI( T + 17 );
wchar_t sH[ 4 ] , sM[ 4 ] , Time_o_Day[ 44 ];
Str( sH, L"%d", Hour );
Str( sM, L"%s%d", Min <= 9 ? L"_" : L"", Min );
Str ( Time_o_Day, L"%s.%s %c"
, ! Hour ? L"_" : sH , ! Min ? L"__" : sM , PM ? 'P': 'A' );
static wchar_t Brv [ 88 ];
Str( Brv , L"%s %d, %d, %s" , Month , Day , Year , Time_o_Day );
return Brv ; }
// Prn() scales the float, prints to 3 decimal places
// and removes extraneous zeros from the left and right.
LnP Prn( float X ) { static int I ; static wchar_t B_[ 9 ][ 44 ];
LnP B = B_[ I ++ , I %= 9 ];
int Kilo = X >= 1000. ; if ( Kilo ) X /= 1000. ;
int Milli = X >= .001 && X < 1. ; if ( Milli ) X *= 1000. ;
Str( B, L"%.3f", X ); if ( * B == '0' ) B ++ ;
LnP P = B ; int Ch, Ch2 ; int FromLeft = 0, Found_Dot = 0 ;
While( FromLeft < 3 || ! Found_Dot ) { int Dot = Ch == '.' ;
Found_Dot |= Dot ; if ( ! Dot ) FromLeft ++ ; }
while ( -- P > B && P[ 1 ] != '.' && ( * P == '.' || * P == '0' ) );
if ( * ++ P == '.' && P - B > 3 ) { LnP C = P - 3 ;
wmemmove( C + 1 , C , 3 ), * C = ',', P ++ ; }
* P = 0 ; if ( P == B + 1 && * B == '.' ) * B = 0 ;
if ( Kilo ) Cat_Str( B , L" Kilo" );
if ( Milli ) Cat_Str( B , L" Milli" ); return B ; }
LnP Ago( float Days ) { static int I ; static wchar_t B_[ 4 ][ 44 ];
LnP B = B_[ I ++ , I %= 4 ];
float Years = Days / 365
, Months = Days / 30.5 , Hours = Days * 24 , Minutes = Hours * 60 ;
if ( Years >= 1 ) {
Str( B , L"%s Years" , Prn( Years ) ); return B ; }
if ( Months >= 1 ) {
Str( B , L"%s Months" , Prn( Months ) ); return B ; }
if ( Days >= 1 ) {
Str( B , L"%s Days" , Prn( Days ) ); return B ; }
if ( Hours >= 1 ) {
Str( B , L"%s Hours" , Prn( Hours ) ); return B ; }
if ( Minutes >= 1 ) {
Str( B , L"%d Minutes" , int( Minutes ) ); return B ; }
Str( B , L"%d Seconds" , int( Minutes * 60 ) ); return B ; }
int __stdcall WinMain( HINSTANCE, HINSTANCE, char*, int ) {
DateFmt( L"24 Aug 2007 01:25:20 GMT" );
wchar_t Output[ 88 ];
Str( Output, L"Posted %s ago.", Ago( Calc_Age_Days ) );
// Output[] now contains: ??? Posted 5.04 Hours ago. ???.
LnP FileName = L"Print.RES";
HANDLE fp = CreateFile( FileName, 0,0,0, OPEN_EXISTING, 0,0 );
GetFileTime( fp, 0, 0, ( FILETIME * ) & Date_Born );
// Convert FILETIME to seconds since start of 1970
Date_Born = ( Date_Born - 116444736000000000 ) / 10000000 ;
Str( Output
, L"%s was last modified %s ago.", FileName, Ago( Calc_Age_Days ) );
// Output[] now contains:
// ??? Print.RES was last modified 10 Years ago. ???.
}