which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@1014 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			572 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			572 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* i4init.c   (c)Copyright Sequiter Software Inc., 1990-1994.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| #ifndef S4UNIX
 | |
| #ifdef __TURBOC__
 | |
| #pragma hdrstop
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| #ifndef N4OTHER
 | |
| 
 | |
| #ifndef S4FOX
 | |
| int S4CALL t4cmp_doub( S4CMP_PARM data_ptr, S4CMP_PARM search_ptr, size_t len )
 | |
| {
 | |
|   double dif ;
 | |
| #ifdef S4UNIX
 | |
|   double d1, d2 ;
 | |
|   memcpy( (void *)&d1, data_ptr, sizeof(double) ) ;
 | |
|   memcpy( (void *)&d2, search_ptr, sizeof(double) ) ;
 | |
|   dif = d1 - d2 ;
 | |
| #else
 | |
|   dif = *((double *)data_ptr) - *((double *)search_ptr) ;
 | |
| #endif
 | |
| 
 | |
|   if ( dif > E4ACCURACY )
 | |
|     return r4after ;
 | |
|   if ( dif < -E4ACCURACY )
 | |
|     return -1 ;
 | |
|   return r4success ;
 | |
| }
 | |
| 
 | |
| int S4CALL t4desc_cmp_doub( S4CMP_PARM data_ptr, S4CMP_PARM search_ptr, size_t len )
 | |
| {
 | |
|   return -1 * t4cmp_doub( data_ptr, search_ptr, 0 ) ;
 | |
| }
 | |
| 
 | |
| int S4CALL t4desc_bcd_cmp( S4CMP_PARM data_ptr, S4CMP_PARM search_ptr, size_t len )
 | |
| {
 | |
|   return -1 * c4bcd_cmp( data_ptr, search_ptr, 0 ) ;
 | |
| }
 | |
| 
 | |
| int S4CALL t4desc_memcmp( S4CMP_PARM data_ptr, S4CMP_PARM search_ptr, size_t len )
 | |
| {
 | |
|   return -1 * u4memcmp( data_ptr, search_ptr, len ) ;
 | |
| }
 | |
| 
 | |
| void t4str_to_date_mdx( char *result, char *input, int dummy )
 | |
| {
 | |
|   double d ;
 | |
|   d = (double) date4long(input) ;
 | |
|   memcpy( result, (void *)&d, sizeof(double) ) ;
 | |
| }
 | |
| 
 | |
| void t4no_change_double( char *result, double d )
 | |
| {
 | |
|   memcpy( result, (void *)&d, sizeof(double) ) ;
 | |
| }
 | |
| 
 | |
| void t4no_change_str( char *a, char *b, int l)
 | |
| {
 | |
|   memcpy(a,b,l) ;
 | |
| }
 | |
| 
 | |
| #ifndef S4INDEX_OFF
 | |
| int S4FUNCTION t4init( TAG4 *t4, INDEX4 *i4, T4DESC *tag_info )
 | |
| {
 | |
|   CODE4 *c4 ;
 | |
|   FILE4SEQ_READ seqread ;
 | |
|   char buffer[1024], garbage_buffer[518], expr_buf[I4MAX_EXPR_SIZE+1], *ptr ;
 | |
|   int len ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( i4 == 0 || t4 == 0 || tag_info == 0 )
 | |
|     e4severe( e4parm, E4_T4INIT ) ;
 | |
| #endif
 | |
| 
 | |
|   c4 = i4->code_base ;
 | |
|   if ( c4->error_code < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
|   t4->index = i4 ;
 | |
|   t4->code_base = c4 ;
 | |
|   t4->unique_error =  c4->default_unique_error ;
 | |
|   t4->cmp = (S4CMP_FUNCTION *)u4memcmp ;
 | |
| 
 | |
|   t4->header_offset = tag_info->header_pos * 512 ;
 | |
| 
 | |
|   file4seq_read_init( &seqread, &i4->file, t4->header_offset, buffer, sizeof(buffer) ) ;
 | |
|   if ( file4seq_read_all( &seqread, &t4->header, sizeof(T4HEADER)) < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
| #ifdef S4BYTE_SWAP
 | |
|   t4->header.key_len = x4reverse_short( (void *)&t4->header.key_len ) ;
 | |
|   t4->header.keys_max = x4reverse_short( (void *)&t4->header.keys_max ) ;
 | |
|   t4->header.group_len = x4reverse_short( (void *)&t4->header.group_len ) ;
 | |
|   t4->header.unique = x4reverse_short( (void *)&t4->header.unique ) ;
 | |
| #endif
 | |
| 
 | |
|   t4->header.root = -1 ;
 | |
| 
 | |
|   u4ncpy( t4->alias, tag_info->tag, sizeof(t4->alias) ) ;
 | |
|   c4trim_n( t4->alias, sizeof(t4->alias) ) ;
 | |
| #ifndef S4UNIX
 | |
|   c4upper( t4->alias ) ;
 | |
| #endif
 | |
| 
 | |
|   file4seq_read_all( &seqread, expr_buf, sizeof(expr_buf)-1 ) ;
 | |
|   c4trim_n( expr_buf, sizeof(expr_buf) ) ;
 | |
|   t4->expr = expr4parse( i4->data, expr_buf ) ;
 | |
|   if ( !t4->expr )
 | |
|     return -1 ;
 | |
| 
 | |
|   len = expr4key_len( t4->expr ) ;
 | |
|   if ( len < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
|   if ( t4->header.key_len != (short)len )
 | |
|   {
 | |
| #ifdef S4DEBUG_DEV
 | |
|     e4describe( c4, e4index, i4->file.name, "t4init()", "Expression length doesn't match tag length" ) ;
 | |
| #endif
 | |
|     return e4( c4, e4index, i4->file.name ) ;
 | |
|   }
 | |
|   t4init_seek_conv( t4, t4->header.type ) ;
 | |
| 
 | |
|   file4seq_read_all( &seqread, garbage_buffer, sizeof(garbage_buffer) ) ;
 | |
| 
 | |
|   file4seq_read_all( &seqread, expr_buf, sizeof(expr_buf)-1 ) ;
 | |
|   c4trim_n( expr_buf, sizeof(expr_buf) ) ;
 | |
| 
 | |
|   if ( garbage_buffer[1] == 1 )   /* Q&E support ... has filter */
 | |
|   {
 | |
|     if ( expr_buf[0] != 0 )
 | |
|     {
 | |
|       if ( garbage_buffer[2] == 1 )
 | |
|         t4->has_keys = t4->had_keys = 1 ;
 | |
|       else
 | |
|         t4->has_keys = t4->had_keys = 0 ;
 | |
| 
 | |
|       t4->filter = expr4parse( i4->data, expr_buf ) ;
 | |
|       if ( t4->filter == 0 )
 | |
|         return -1 ;
 | |
|       len = expr4key( t4->filter, &ptr ) ;
 | |
|       if ( len < 0 )
 | |
|         return -1 ;
 | |
|       if ( expr4type( t4->filter ) != 'L' )
 | |
|       {
 | |
| #ifdef S4DEBUG_DEV
 | |
|         e4describe( c4, e4index, i4->file.name, "t4init()", "Filter type not expected logical" ) ;
 | |
| #endif
 | |
|         return e4describe( c4, e4index, E4_INDEX_FIL, i4->file.name, (char *) 0 ) ;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| void S4FUNCTION t4init_seek_conv( TAG4 *t4, int key_type )
 | |
| {
 | |
|   int is_desc ;
 | |
| 
 | |
|   is_desc = t4->header.type_code & 8 ;
 | |
| 
 | |
|   switch( key_type )
 | |
|   {
 | |
|   case r4num:
 | |
|     if ( is_desc )
 | |
|       t4->cmp = t4desc_bcd_cmp ;
 | |
|     else
 | |
|       t4->cmp = c4bcd_cmp ;
 | |
| 
 | |
|     t4->stok = c4bcd_from_a ;
 | |
|     t4->dtok = c4bcd_from_d ;
 | |
|     break ;
 | |
| 
 | |
|   case r4date:
 | |
|     if ( is_desc )
 | |
|       t4->cmp = t4desc_cmp_doub ;
 | |
|     else
 | |
|       t4->cmp = t4cmp_doub ;
 | |
|     t4->stok = t4str_to_date_mdx ;
 | |
|     t4->dtok = t4no_change_double ;
 | |
|     break ;
 | |
| 
 | |
|   case r4str:
 | |
|     if ( is_desc )
 | |
|       t4->cmp = t4desc_memcmp ;
 | |
|     else
 | |
|       t4->cmp = (S4CMP_FUNCTION *)u4memcmp ;
 | |
|     t4->stok = t4no_change_str ;
 | |
|     t4->dtok = 0 ;
 | |
|     break ;
 | |
| 
 | |
|   default:
 | |
| #ifdef S4DEBUG
 | |
|     e4severe( e4info, E4_INFO_INV ) ;
 | |
| #else
 | |
|     e4( t4->code_base, e4info, E4_INFO_INV ) ;
 | |
| #endif
 | |
|   }
 | |
| #ifdef S4UNIX
 | |
|   switch( key_type )
 | |
|   {
 | |
|   case r4num:
 | |
|     t4->key_type = r4num ;
 | |
|     break ;
 | |
| 
 | |
|   case r4date:
 | |
|     t4->key_type = r4date ;
 | |
|     break ;
 | |
| 
 | |
|   case r4str:
 | |
|     t4->key_type = r4str ;
 | |
|     break ;
 | |
|   }
 | |
| #endif
 | |
| }
 | |
| #endif  /* ifndef S4INDEX_OFF */
 | |
| #endif  /* ifndef S4FOX */
 | |
| 
 | |
| #ifdef S4FOX
 | |
| #ifndef S4INDEX_OFF
 | |
| 
 | |
| #ifdef S4LANGUAGE
 | |
| extern unsigned char v4map[256];
 | |
| #else
 | |
| #ifdef S4ANSI
 | |
| extern unsigned char v4map[256];
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| int S4CALL t4cdx_cmp( S4CMP_PARM data_ptr, S4CMP_PARM search_ptr, size_t len )
 | |
| {
 | |
|   unsigned char *data = (unsigned char *)data_ptr ;
 | |
|   unsigned char *search = (unsigned char *)search_ptr ;
 | |
|   unsigned on ;
 | |
| 
 | |
|   for( on = 0 ; on < len ; on++ )
 | |
|   {
 | |
|     if ( data[on] != search[on] )
 | |
|     {
 | |
| #ifdef S4VMAP
 | |
|       if ( v4map[data[on]] > v4map[search[on]] ) return -1 ;  /* gone too far */
 | |
| #else
 | |
|       if ( data[on] > search[on] ) return -1 ;  /* gone too far */
 | |
| #endif
 | |
|       break ;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return on ;
 | |
| }
 | |
| 
 | |
| void t4no_change_str( char *a, char *b, int l )
 | |
| {
 | |
|   memcpy(a,b,l) ;
 | |
| }
 | |
| 
 | |
| void t4str_to_log( char *b, char *a, int l )
 | |
| {
 | |
|   int pos = 0 ;
 | |
| 
 | |
|   for ( ; l != pos ; pos++ )
 | |
|     switch( a[pos] )
 | |
|     {
 | |
|     case 't':
 | |
|     case 'T':
 | |
|     case 'y':
 | |
|     case 'Y':
 | |
|       b[0] = 'T' ;
 | |
|       return ;
 | |
|     case 'f':
 | |
|     case 'F':
 | |
|     case 'n':
 | |
|     case 'N':
 | |
|       b[0] = 'F' ;
 | |
|       return ;
 | |
|     default:
 | |
|       break ;
 | |
|     }
 | |
| 
 | |
|   b[0] = 'F' ;
 | |
| }
 | |
| 
 | |
| int S4FUNCTION t4init( TAG4 *t4, INDEX4 *i4, long file_pos, char *name )
 | |
| {
 | |
|   CODE4 *c4 ;
 | |
|   char expr_buf[I4MAX_EXPR_SIZE+1], *ptr ;
 | |
|   int len ;
 | |
|   char top_size ;
 | |
| 
 | |
| #ifdef S4DEBUG
 | |
|   if ( i4 == 0 || t4 == 0 || name == 0 || file_pos < 0 )
 | |
|     e4severe( e4parm, E4_T4INIT ) ;
 | |
| #endif
 | |
| 
 | |
|   c4 = i4->code_base ;
 | |
|   if ( c4->error_code < 0 )
 | |
|     return -1 ;
 | |
| 
 | |
|   t4->index = i4 ;
 | |
|   t4->code_base = c4 ;
 | |
|   t4->unique_error =  c4->default_unique_error ;
 | |
|   t4->header_offset = file_pos ;
 | |
|   t4->header.root = -1 ;
 | |
|   t4->cmp = t4cdx_cmp ;
 | |
| 
 | |
|   top_size = 2 * sizeof(long) + 4*sizeof(char) + sizeof(short) + 2 * sizeof(unsigned char) ;
 | |
|   if ( file4read_all( &i4->file, file_pos, &t4->header, top_size ) < 0 )
 | |
|     return 0 ;
 | |
|   if ( file4read_all( &i4->file, file_pos + (long)top_size + 486L, &t4->header.descending,
 | |
|                      ( 5 * sizeof(short) ) ) < 0 )
 | |
|     return 0 ;
 | |
| #ifdef S4BYTE_SWAP
 | |
|   t4->header.root = x4reverse_long( (void *)&t4->header.root ) ;
 | |
|   t4->header.free_list = x4reverse_long( (void *)&t4->header.free_list ) ;
 | |
|   t4->header.version = x4reverse_long( (void *)&t4->header.version ) ;
 | |
|   t4->header.key_len = x4reverse_short( (void *)&t4->header.key_len ) ;
 | |
|   t4->header.descending = x4reverse_short( (void *)&t4->header.descending ) ;
 | |
|   t4->header.filter_pos = x4reverse_short( (void *)&t4->header.filter_pos ) ;
 | |
|   t4->header.filter_len = x4reverse_short( (void *)&t4->header.filter_len ) ;
 | |
|   t4->header.expr_pos = x4reverse_short( (void *)&t4->header.expr_pos ) ;
 | |
|   t4->header.expr_len = x4reverse_short( (void *)&t4->header.expr_len ) ;
 | |
| #endif
 | |
| 
 | |
|   u4ncpy( t4->alias, name, sizeof(t4->alias) ) ;
 | |
|   c4trim_n( t4->alias, sizeof(t4->alias) ) ;
 | |
| #ifndef S4UNIX
 | |
|   c4upper( t4->alias ) ;
 | |
| #endif
 | |
| 
 | |
|   if ( t4->header.type_code < 0x80 )  /* non-compound header; so expression */
 | |
|   {
 | |
| #ifdef S4DEBUG
 | |
|     if ( t4->header.expr_len+1 > sizeof( expr_buf ) )
 | |
|       e4severe( e4info, E4_INFO_EXP ) ;
 | |
| #endif
 | |
|     file4read_all( &i4->file, file_pos+B4BLOCK_SIZE, expr_buf, t4->header.expr_len ) ;
 | |
|     expr_buf[t4->header.expr_len] = '\0' ;
 | |
|     t4->expr = expr4parse( i4->data, expr_buf ) ;
 | |
|     if ( t4->expr == 0 )
 | |
|       return -1 ;
 | |
| 
 | |
|     len = expr4key_len( t4->expr ) ;
 | |
|     if ( len < 0 )
 | |
|       return -1 ;
 | |
| 
 | |
|     if ( t4->header.key_len != len )
 | |
|     {
 | |
| #ifdef S4DEBUG_DEV
 | |
|       e4describe( c4, e4index, i4->file.name, "t4init()", "Expression length doesn't match tag length" ) ;
 | |
| #endif
 | |
|       return e4( c4, e4index, i4->file.name ) ;
 | |
|     }
 | |
| 
 | |
|     t4init_seek_conv(t4, t4->expr->type ) ;
 | |
| 
 | |
|     if ( t4->header.type_code & 0x08 )   /* For clause (filter) exists */
 | |
|     {
 | |
|       file4read_all( &i4->file, file_pos+B4BLOCK_SIZE+t4->header.expr_len, expr_buf, t4->header.filter_len ) ;
 | |
|       expr_buf[t4->header.filter_len] = '\0' ;
 | |
| 
 | |
|       t4->filter = expr4parse( i4->data, expr_buf ) ;
 | |
|       if ( t4->filter == 0 )
 | |
|         return -1 ;
 | |
|       len = expr4key( t4->filter, &ptr ) ;
 | |
|       if ( len < 0 )
 | |
|         return -1 ;
 | |
|       if ( expr4type( t4->filter ) != 'L' )
 | |
|       {
 | |
| #ifdef S4DEBUG_DEV
 | |
|         e4describe( c4, e4index, i4->file.name, "t4init()", "Filter type not expected logical" ) ;
 | |
| #endif
 | |
|         return e4describe( c4, e4index, E4_INDEX_FIL, i4->file.name, (char *) 0 ) ;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   return 0 ;
 | |
| }
 | |
| 
 | |
| void S4FUNCTION t4init_seek_conv( TAG4 *t4, int type )
 | |
| {
 | |
|   t4->cmp = t4cdx_cmp ;
 | |
| 
 | |
|   switch( type )
 | |
|   {
 | |
|   case r4date:
 | |
|   case r4date_doub:
 | |
|     t4->stok = t4dtstr_to_fox ;
 | |
|     t4->dtok = t4dbl_to_fox ;
 | |
|     t4->p_char = '\0' ;
 | |
|     break ;
 | |
|   case r4num:
 | |
|   case r4num_doub:
 | |
|     t4->stok = t4str_to_fox ;
 | |
|     t4->dtok = t4dbl_to_fox ;
 | |
|     t4->p_char = '\0' ;
 | |
|     break ;
 | |
|   case r4str:
 | |
|     t4->stok = t4no_change_str ;
 | |
|     t4->dtok = 0 ;
 | |
|     t4->p_char = ' ' ;
 | |
|     break ;
 | |
|   case r4log:
 | |
|     t4->stok = t4str_to_log ;
 | |
|     t4->dtok = 0 ;
 | |
|     break ;
 | |
|   default:
 | |
| #ifdef S4DEBUG
 | |
|     e4severe( e4info, E4_INFO_INV ) ;
 | |
| #else
 | |
|     e4( t4->code_base, e4info, E4_INFO_INV ) ;
 | |
| #endif
 | |
|   }
 | |
| #ifdef S4UNIX
 | |
|   switch( type )
 | |
|   {
 | |
|   case r4num:
 | |
|   case r4num_doub:
 | |
|     t4->key_type = r4num ;
 | |
|     break ;
 | |
| 
 | |
|   case r4date:
 | |
|   case r4date_doub:
 | |
|     t4->key_type = r4date ;
 | |
|     break ;
 | |
| 
 | |
|   case r4str:
 | |
|     t4->key_type = r4str ;
 | |
|     break ;
 | |
| 
 | |
|   case r4log:
 | |
|     t4->key_type = r4log ;
 | |
|     break ;
 | |
|   }
 | |
| #endif
 | |
| }
 | |
| 
 | |
| #endif   /*  ifdef S4FOX  */
 | |
| #endif   /*  ifndef S4INDEX_OFF  */
 | |
| 
 | |
| #endif   /*  ifndef N4OTHER  */
 | |
| 
 | |
| #ifdef N4OTHER
 | |
| 
 | |
| int S4CALL t4cmp_doub( S4CMP_PARM data_ptr, S4CMP_PARM search_ptr, size_t len )
 | |
| {
 | |
| #ifdef S4UNIX
 | |
|   double d1, d2 ;
 | |
|   memcpy( &d1, data_ptr, sizeof(double) ) ;
 | |
|   memcpy( &d2, search_ptr, sizeof(double) ) ;
 | |
|   double dif = d1 - d2 ;
 | |
| #else
 | |
|   double dif = *((double *)data_ptr) - *((double *)search_ptr) ;
 | |
| #endif
 | |
| 
 | |
|   if ( dif > E4ACCURACY )  return r4after ;
 | |
|   if ( dif < -E4ACCURACY ) return -1 ;
 | |
|   return r4success ;
 | |
| }
 | |
| 
 | |
| void  t4str_to_doub( char *result, char *input, int dummy )
 | |
| {
 | |
|   double d ;
 | |
|   d = c4atod( input, strlen( input )) ;
 | |
|   memcpy( result, &d, sizeof(double) ) ;
 | |
| }
 | |
| 
 | |
| void t4str_to_date_mdx( char *result, char *input, int dummy )
 | |
| {
 | |
|   double d = (double) date4long(input) ;
 | |
|   memcpy( result, &d, sizeof(double) ) ;
 | |
| }
 | |
| 
 | |
| void t4no_change_double( char *result, double d )
 | |
| {
 | |
|   memcpy( result, &d, sizeof(double) ) ;
 | |
| }
 | |
| 
 | |
| void t4no_change_str( char *a, char *b, int l)
 | |
| {
 | |
|   memcpy(a,b,l) ;
 | |
| }
 | |
| 
 | |
| #ifdef S4CLIPPER
 | |
| void  t4str_to_clip( char *result, char *input, int dummy )
 | |
| {
 | |
|   memcpy ( result, input, strlen( input ) ) ;
 | |
|   c4clip( result, strlen( result ) ) ;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| void  t4date_doub_to_str( char *result, double d )
 | |
| {
 | |
|   long  l ;
 | |
| 
 | |
|   l = (long) d ;
 | |
|   date4assign( result, l ) ;
 | |
| }
 | |
| 
 | |
| #ifndef S4INDEX_OFF
 | |
| 
 | |
| void S4FUNCTION t4init_seek_conv( TAG4 *t4, int key_type )
 | |
| {
 | |
|   switch( key_type )
 | |
|   {
 | |
| #ifdef S4NDX
 | |
|   case r4num:
 | |
|   case r4num_doub:
 | |
|     t4->cmp = t4cmp_doub ;
 | |
|     t4->stok = t4str_to_doub ;
 | |
|     t4->dtok = t4no_change_double ;
 | |
|     break ;
 | |
| 
 | |
|   case r4date:
 | |
|   case r4date_doub:
 | |
|     t4->cmp = t4cmp_doub ;
 | |
|     t4->stok = t4str_to_date_mdx ;
 | |
|     t4->dtok = t4no_change_double ;
 | |
|     break ;
 | |
| #else
 | |
|   case r4date:
 | |
|   case r4date_doub:
 | |
|     t4->cmp = (S4CMP_FUNCTION *)u4memcmp ;
 | |
|     t4->stok = t4no_change_str ;
 | |
|     t4->dtok = t4date_doub_to_str ;
 | |
|     break ;
 | |
| 
 | |
|   case r4num:
 | |
|   case r4num_doub:
 | |
|     t4->cmp = (S4CMP_FUNCTION *)u4memcmp ;
 | |
|     t4->stok = t4str_to_clip ;
 | |
|     t4->dtok = 0 ;
 | |
|     break ;
 | |
| #endif
 | |
| 
 | |
|   case r4str:
 | |
|     t4->cmp = (S4CMP_FUNCTION *)u4memcmp ;
 | |
|     t4->stok = t4no_change_str ;
 | |
|     t4->dtok = 0 ;
 | |
|     break ;
 | |
| 
 | |
|   default:
 | |
| #ifdef S4DEBUG
 | |
|     e4severe( e4info, E4_INFO_INV ) ;
 | |
| #else
 | |
|     e4( t4->code_base, e4info, E4_INFO_INV ) ;
 | |
| #endif
 | |
|   }
 | |
| #ifdef S4UNIX
 | |
|   switch( key_type )
 | |
|   {
 | |
|   case r4num:
 | |
|   case r4num_doub:
 | |
|     t4->key_type = r4num ;
 | |
|     break ;
 | |
| 
 | |
|   case r4date:
 | |
|   case r4date_doub:
 | |
|     t4->key_type = r4date ;
 | |
|     break ;
 | |
| 
 | |
|   case r4str:
 | |
|     t4->key_type = r4str ;
 | |
|     break ;
 | |
|   }
 | |
| #endif
 | |
| }
 | |
| #endif   /* N4OTHER */
 | |
| 
 | |
| #endif   /* S4INDEX_OFF */
 |