which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@1550 c028cbd2-c16b-5b4b-a496-9718f37d4682
345 lines
8.1 KiB
C
Executable File
345 lines
8.1 KiB
C
Executable File
/* d4seek.c (c)Copyright Sequiter Software Inc., 1990-1994. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
#ifndef S4UNIX
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef S4INDEX_OFF
|
|
|
|
/* function to ensure the integrity of the seeks return value */
|
|
/* in single user mode, exclusive, or if file is locked, the data is assumed up to date, and not checked */
|
|
static int d4seek_check( DATA4 *data, TAG4 *tag, int rc, char *buf, int len )
|
|
{
|
|
int skipped, rc2 ;
|
|
char *dbf_key ;
|
|
|
|
#ifndef S4SINGLE
|
|
if ( rc == r4locked )
|
|
return r4locked ;
|
|
#endif
|
|
|
|
if ( t4eof( tag ) )
|
|
return d4go_eof( data ) ;
|
|
|
|
if ( len > tag->header.key_len )
|
|
len = tag->header.key_len ;
|
|
|
|
#ifndef S4SINGLE
|
|
if ( d4lock_test_file( data ) )
|
|
{
|
|
#endif
|
|
rc2 = d4go( data, t4recno( tag ) ) ;
|
|
if ( rc2 )
|
|
return rc2 ;
|
|
return rc ;
|
|
#ifndef S4SINGLE
|
|
}
|
|
skipped = 0 ;
|
|
for( ;; )
|
|
{
|
|
rc2 = d4go( data, t4recno( tag ) ) ;
|
|
if ( rc2 )
|
|
return rc2 ;
|
|
|
|
if ( t4expr_key( tag, &dbf_key ) < 0 )
|
|
return -1 ;
|
|
#ifdef S4FOX
|
|
if ( !u4memcmp( t4key( tag ), dbf_key, len ) ) /* matched */
|
|
#else
|
|
if ( !(*tag->cmp)( t4key( tag ), dbf_key, len ) ) /* matched */
|
|
#endif
|
|
{
|
|
if ( skipped )
|
|
{
|
|
#ifdef S4FOX
|
|
rc2 = u4memcmp( dbf_key, buf, len ) ;
|
|
#else
|
|
rc2 = (*tag->cmp)( dbf_key, buf, len ) ;
|
|
#endif
|
|
if ( rc2 == 0 ) /* worked */
|
|
return rc2 ;
|
|
if ( rc2 > 0 )
|
|
return r4after ;
|
|
/* other wise, if < 0, can't return r4after, so go down and skip next */
|
|
}
|
|
else
|
|
return rc ;
|
|
}
|
|
|
|
/* try next record */
|
|
if ( t4skip( tag, 1L ) == 0 ) /* eof */
|
|
return d4go_eof( data ) ;
|
|
if ( data->code_base->error_code < 0 )
|
|
return -1 ;
|
|
skipped = 1 ;
|
|
}
|
|
#endif
|
|
}
|
|
int S4FUNCTION d4seek( DATA4 *data, char *str )
|
|
{
|
|
return d4seek_n( data, str, strlen(str) ) ;
|
|
}
|
|
|
|
int S4FUNCTION d4seek_n( DATA4 *data, char *str, int len )
|
|
{
|
|
TAG4 *tag ;
|
|
int rc ;
|
|
char buf[I4MAX_KEY_SIZE] ;
|
|
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E4_D4SEEK ) )
|
|
return 0 ;
|
|
#endif
|
|
|
|
if ( data == 0 || str == 0 )
|
|
#ifdef S4DEBUG
|
|
e4severe( e4parm, E4_D4SEEK ) ;
|
|
#else
|
|
return -1 ;
|
|
#endif
|
|
|
|
if ( data->code_base->error_code < 0 )
|
|
return -1 ;
|
|
|
|
tag = d4tag_default( data ) ;
|
|
if ( tag == 0 )
|
|
return r4no_tag ;
|
|
|
|
#ifndef S4OFF_WRITE
|
|
rc = d4update_record( data, 0 ) ; /* was 1 */
|
|
if ( rc )
|
|
return rc ;
|
|
#endif
|
|
|
|
#ifdef S4UNIX
|
|
#ifdef S4MDX
|
|
switch ( tag->key_type )
|
|
{
|
|
case r4num:
|
|
c4bcd_from_a( buf, str, len ) ;
|
|
break ;
|
|
case r4date:
|
|
t4str_to_date_mdx( buf, str, len ) ;
|
|
break ;
|
|
case r4str:
|
|
t4no_change_str( buf, str, len ) ;
|
|
break ;
|
|
default:
|
|
e4severe( e4info, E4_INFO_INV ) ;
|
|
}
|
|
#endif
|
|
#ifdef S4FOX
|
|
switch ( tag->key_type )
|
|
{
|
|
case r4num:
|
|
case r4num_doub:
|
|
t4str_to_fox( buf, str, len ) ;
|
|
break ;
|
|
case r4date:
|
|
case r4date_doub:
|
|
t4dtstr_to_fox( buf, str, len ) ;
|
|
break ;
|
|
case r4str:
|
|
t4no_change_str( buf, str, len ) ;
|
|
break ;
|
|
case r4log:
|
|
t4str_to_log( buf, str, len ) ;
|
|
break ;
|
|
default:
|
|
e4severe( e4info, E4_INFO_INV ) ;
|
|
}
|
|
#endif
|
|
#ifdef S4CLIPPER
|
|
switch ( tag->key_type )
|
|
{
|
|
case r4num:
|
|
case r4num_doub:
|
|
t4str_to_clip( buf, str, len ) ;
|
|
break ;
|
|
case r4date:
|
|
case r4date_doub:
|
|
case r4str:
|
|
t4no_change_str( buf, str, len ) ;
|
|
break ;
|
|
default:
|
|
e4severe( e4info, E4_INFO_INV ) ;
|
|
}
|
|
#endif
|
|
#ifdef S4NDX
|
|
switch ( tag->key_type )
|
|
{
|
|
case r4num:
|
|
case r4num_doub:
|
|
t4str_to_doub( buf, str, len ) ;
|
|
break ;
|
|
case r4date:
|
|
case r4date_doub:
|
|
t4str_to_date_mdx( buf, str, len ) ;
|
|
break ;
|
|
case r4str:
|
|
t4no_change_str( buf, str, len ) ;
|
|
break ;
|
|
default:
|
|
e4severe( e4info, E4_INFO_INV ) ;
|
|
}
|
|
#endif
|
|
#else
|
|
(*tag->stok)( buf, str, len ) ;
|
|
#endif
|
|
|
|
if ( t4type( tag ) != r4str )
|
|
len = tag->header.key_len ;
|
|
else
|
|
if ( len <= 0 ) len = strlen( str ) ;
|
|
|
|
rc = t4version_check( tag, 0, 0 ) ;
|
|
if ( rc < 0 )
|
|
return rc ;
|
|
|
|
rc = t4seek( tag, buf, len ) ;
|
|
|
|
return d4seek_check( data, tag, rc, buf, len ) ; /* return a valid value */
|
|
}
|
|
|
|
int S4FUNCTION d4seek_double( DATA4 *data, double dkey )
|
|
{
|
|
TAG4 *tag ;
|
|
int rc ;
|
|
char buf[I4MAX_KEY_SIZE] ;
|
|
#ifdef S4CLIPPER
|
|
int len ;
|
|
#endif
|
|
|
|
#ifdef S4VBASIC
|
|
if ( c4parm_check( data, 2, E4_D4SEEK_DBL ) )
|
|
return 0 ;
|
|
#endif
|
|
|
|
if ( data == 0 )
|
|
#ifdef S4DEBUG
|
|
e4severe( e4parm, E4_D4SEEK_DBL ) ;
|
|
#else
|
|
return -1 ;
|
|
#endif
|
|
|
|
if ( data->code_base->error_code < 0 )
|
|
return -1 ;
|
|
|
|
tag = d4tag_default( data ) ;
|
|
if ( tag == 0 )
|
|
return r4no_tag ;
|
|
|
|
#ifndef S4OFF_WRITE
|
|
rc = d4update_record( data, 0 ) ; /* was 1 */
|
|
if ( rc )
|
|
return rc ;
|
|
#endif
|
|
|
|
#ifdef S4CLIPPER
|
|
if ( tag->dtok == 0 )
|
|
{
|
|
len = tag->header.key_len ;
|
|
c4dtoa45( dkey, buf, len, tag->header.key_dec ) ;
|
|
if ( buf[0] == '*' ) /* unknown overflow result */
|
|
return -1 ;
|
|
c4clip( buf, len ) ;
|
|
}
|
|
else
|
|
#else
|
|
if ( tag->dtok == 0 )
|
|
#ifdef S4DEBUG
|
|
e4severe( e4info, E4_INFO_WT4 ) ;
|
|
#else
|
|
return -1 ;
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef S4UNIX
|
|
#ifdef S4MDX
|
|
switch ( tag->key_type )
|
|
{
|
|
case r4num:
|
|
c4bcd_from_d( buf, dkey ) ;
|
|
break ;
|
|
case r4date:
|
|
t4no_change_double( buf, dkey ) ;
|
|
break ;
|
|
case r4str:
|
|
break ;
|
|
default:
|
|
e4severe( e4info, E4_INFO_INV ) ;
|
|
}
|
|
#endif
|
|
#ifdef S4FOX
|
|
switch ( tag->key_type )
|
|
{
|
|
case r4num:
|
|
case r4num_doub:
|
|
case r4date:
|
|
case r4date_doub:
|
|
t4dbl_to_fox( buf, dkey ) ;
|
|
break ;
|
|
case r4str:
|
|
case r4log:
|
|
break ;
|
|
default:
|
|
e4severe( e4info, E4_INFO_INV ) ;
|
|
}
|
|
#endif
|
|
#ifdef S4CLIPPER
|
|
switch ( tag->key_type )
|
|
{
|
|
case r4num:
|
|
case r4num_doub:
|
|
case r4str:
|
|
break ;
|
|
case r4date:
|
|
case r4date_doub:
|
|
t4date_doub_to_str( buf, dkey ) ;
|
|
break ;
|
|
default:
|
|
e4severe( e4info, E4_INFO_INV ) ;
|
|
}
|
|
#endif
|
|
#ifdef S4NDX
|
|
switch ( tag->key_type )
|
|
{
|
|
case r4num:
|
|
case r4num_doub:
|
|
case r4date:
|
|
case r4date_doub:
|
|
t4no_change_double( buf, dkey ) ;
|
|
break ;
|
|
case r4str:
|
|
break ;
|
|
default:
|
|
e4severe( e4info, E4_INFO_INV ) ;
|
|
}
|
|
#endif
|
|
#else
|
|
(*tag->dtok)( buf, dkey ) ;
|
|
#endif
|
|
|
|
rc = t4version_check( tag, 0, 0 ) ;
|
|
if ( rc < 0 )
|
|
return rc ;
|
|
|
|
rc = t4seek( tag, buf, tag->header.key_len ) ;
|
|
|
|
return d4seek_check( data, tag, rc, buf, tag->header.key_len ) ; /* return a valid value */
|
|
}
|
|
|
|
#endif /* S4INDEX_OFF */
|
|
|
|
#ifdef S4VB_DOS
|
|
|
|
int d4seek_v( DATA4 *data, char *seek )
|
|
{
|
|
return d4seek( data, c4str(seek) ) ;
|
|
}
|
|
|
|
#endif
|