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()
This commit is contained in:
@@ -8,6 +8,16 @@
|
||||
2008-12-31 13:59 UTC+0100 Foo Bar <foo.bar@foobar.org>
|
||||
*/
|
||||
|
||||
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
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* Harbour Project source code:
|
||||
* The Date API (C level)
|
||||
*
|
||||
* Copyright 1999 Antonio Linares <alinares@fivetech.com>
|
||||
* Copyright 1999 David G. Holm <dholm@jsd-llc.com>
|
||||
* 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 <dholm@jsd-llc.com>
|
||||
* 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 );
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user