diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 1f4a5ae2f8..1c41404338 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,16 @@ 2008-12-31 13:59 UTC+0100 Foo Bar */ +2008-06-11 18:22 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbdate.h + * harbour/source/rtl/dates.c + + added hb_dateUnformat() - code by David G. Holm extracted from CTOD() + * updated copyright note to point original author of hb_dateFormat() + and hb_dateUnformat() + + * harbour/source/rtl/dateshb.c + * use hb_dateUnformat() in CTOD() + 2008-06-11 16:22 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/contrib/hbw32/dllcall.c * added casting of wOrdinal to HB_PTR_DIFF to avoid waring diff --git a/harbour/include/hbdate.h b/harbour/include/hbdate.h index 5944e3ee2c..23cc5d993a 100644 --- a/harbour/include/hbdate.h +++ b/harbour/include/hbdate.h @@ -73,6 +73,7 @@ extern HB_EXPORT char * hb_dateCDOW( int iDay ); extern HB_EXPORT int hb_dateDOW( int iYear, int iMonth, int iDay ); extern HB_EXPORT int hb_dateJulianDOW( LONG lJulian ); extern HB_EXPORT char * hb_dateFormat( const char * szDate, char * szFormattedDate, const char * szDateFormat ); +extern HB_EXPORT long hb_dateUnformat( const char * szDate, const char * szDateFormat ); extern HB_EXPORT long hb_dateEncode( int iYear, int iMonth, int iDay ); extern HB_EXPORT void hb_dateDecode( long julian, int * piYear, int * piMonth, int * piDay ); extern HB_EXPORT void hb_dateStrPut( char * szDate, int iYear, int iMonth, int iDay ); diff --git a/harbour/source/rtl/dates.c b/harbour/source/rtl/dates.c index 9f8f2e4fb1..7e1687b149 100644 --- a/harbour/source/rtl/dates.c +++ b/harbour/source/rtl/dates.c @@ -6,7 +6,7 @@ * Harbour Project source code: * The Date API (C level) * - * Copyright 1999 Antonio Linares + * Copyright 1999 David G. Holm * www - http://www.harbour-project.org * * This program is free software; you can redistribute it and/or modify @@ -56,6 +56,7 @@ * * Copyright 1999 David G. Holm * hb_dateFormat() + * hb_dateUnformat() * * See doc/license.txt for licensing terms. * @@ -65,6 +66,7 @@ #include "hbapi.h" #include "hbdate.h" +#include "hbset.h" HB_EXPORT char * hb_dateFormat( const char * szDate, char * szFormattedDate, const char * szDateFormat ) { @@ -237,3 +239,97 @@ HB_EXPORT char * hb_dateFormat( const char * szDate, char * szFormattedDate, con return szFormattedDate; } + +HB_EXPORT long hb_dateUnformat( const char * szDate, const char * szDateFormat ) +{ + int d_value = 0, m_value = 0, y_value = 0; + + if( szDate ) + { + int d_pos = 0, m_pos = 0, y_pos = 0; + int count, digit, non_digit, size; + + if( ! szDateFormat ) + szDateFormat = hb_set.HB_SET_DATEFORMAT; + size = strlen( szDateFormat ); + + for( count = 0; count < size; count++ ) + { + switch( szDateFormat[ count ] ) + { + case 'D': + case 'd': + if( d_pos == 0 ) + { + if( m_pos == 0 && y_pos == 0 ) d_pos = 1; + else if( m_pos == 0 || y_pos == 0 ) d_pos = 2; + else d_pos = 3; + } + break; + case 'M': + case 'm': + if( m_pos == 0 ) + { + if( d_pos == 0 && y_pos == 0 ) m_pos = 1; + else if( d_pos == 0 || y_pos == 0 ) m_pos = 2; + else m_pos = 3; + } + break; + case 'Y': + case 'y': + if( y_pos == 0 ) + { + if( m_pos == 0 && d_pos == 0 ) y_pos = 1; + else if( m_pos == 0 || d_pos == 0 ) y_pos = 2; + else y_pos = 3; + } + } + } + + /* If there are non-digits at the start of the date field, + they are not to be treated as date field separators */ + non_digit = 1; + size = strlen( szDate ); + for( count = 0; count < size; count++ ) + { + digit = szDate[ count ]; + if( isdigit( digit ) ) + { + /* Process the digit for the current date field */ + if( d_pos == 1 ) + d_value = ( d_value * 10 ) + digit - '0'; + else if( m_pos == 1 ) + m_value = ( m_value * 10 ) + digit - '0'; + else if( y_pos == 1 ) + y_value = ( y_value * 10 ) + digit - '0'; + /* Treat the next non-digit as a date field separator */ + non_digit = 0; + } + else if( digit != ' ' ) + { + /* Process the non-digit */ + if( non_digit++ == 0 ) + { + /* Only move to the next date field on the first + consecutive non-digit that is encountered */ + d_pos--; + m_pos--; + y_pos--; + } + } + } + + if( y_value >= 0 && y_value < 100 ) + { + count = hb_set.HB_SET_EPOCH % 100; + digit = hb_set.HB_SET_EPOCH / 100; + + if( y_value >= count ) + y_value += ( digit * 100 ); + else + y_value += ( ( digit * 100 ) + 100 ); + } + } + + return hb_dateEncode( y_value, m_value, d_value ); +} diff --git a/harbour/source/rtl/dateshb.c b/harbour/source/rtl/dateshb.c index 2f71a618f0..a092482042 100644 --- a/harbour/source/rtl/dateshb.c +++ b/harbour/source/rtl/dateshb.c @@ -82,95 +82,7 @@ HB_FUNC( CTOD ) { if( ISCHAR( 1 ) ) - { - char * szDate = hb_parc( 1 ); - int d_value = 0, m_value = 0, y_value = 0; - - if( szDate ) - { - int d_pos = 0, m_pos = 0, y_pos = 0; - int count, digit, non_digit, size = strlen( hb_set.HB_SET_DATEFORMAT ); - - for( count = 0; count < size; count++ ) - { - switch( hb_set.HB_SET_DATEFORMAT[ count ] ) - { - case 'D': - case 'd': - if( d_pos == 0 ) - { - if( m_pos == 0 && y_pos == 0 ) d_pos = 1; - else if( m_pos == 0 || y_pos == 0 ) d_pos = 2; - else d_pos = 3; - } - break; - case 'M': - case 'm': - if( m_pos == 0 ) - { - if( d_pos == 0 && y_pos == 0 ) m_pos = 1; - else if( d_pos == 0 || y_pos == 0 ) m_pos = 2; - else m_pos = 3; - } - break; - case 'Y': - case 'y': - if( y_pos == 0 ) - { - if( m_pos == 0 && d_pos == 0 ) y_pos = 1; - else if( m_pos == 0 || d_pos == 0 ) y_pos = 2; - else y_pos = 3; - } - } - } - - /* If there are non-digits at the start of the date field, - they are not to be treated as date field separators */ - non_digit = 1; - size = strlen( szDate ); - for( count = 0; count < size; count++ ) - { - digit = szDate[ count ]; - if( isdigit( digit ) ) - { - /* Process the digit for the current date field */ - if( d_pos == 1 ) - d_value = ( d_value * 10 ) + digit - '0'; - else if( m_pos == 1 ) - m_value = ( m_value * 10 ) + digit - '0'; - else if( y_pos == 1 ) - y_value = ( y_value * 10 ) + digit - '0'; - /* Treat the next non-digit as a date field separator */ - non_digit = 0; - } - else if( digit != ' ' ) - { - /* Process the non-digit */ - if( non_digit++ == 0 ) - { - /* Only move to the next date field on the first - consecutive non-digit that is encountered */ - d_pos--; - m_pos--; - y_pos--; - } - } - } - - if( y_value >= 0 && y_value < 100 ) - { - count = hb_set.HB_SET_EPOCH % 100; - digit = hb_set.HB_SET_EPOCH / 100; - - if( y_value >= count ) - y_value += ( digit * 100 ); - else - y_value += ( ( digit * 100 ) + 100 ); - } - } - - hb_retd( y_value, m_value, d_value ); - } + hb_retdl( hb_dateUnformat( hb_parc( 1 ), hb_set.HB_SET_DATEFORMAT ) ); else hb_errRT_BASE_SubstR( EG_ARG, 1119, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); }