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
 |