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:
Przemyslaw Czerpak
2008-06-11 16:23:02 +00:00
parent 73c9510cbc
commit 3f9251e4ae
4 changed files with 109 additions and 90 deletions

View File

@@ -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

View File

@@ -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 );

View File

@@ -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 );
}

View File

@@ -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 );
}