687 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			687 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* i4init.c   (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| #ifdef __TURBOC__
 | |
|    #pragma hdrstop
 | |
| #endif
 | |
| 
 | |
| #ifdef S4CLIENT_OR_FOX
 | |
| long time4long( const char *time, int strLen )
 | |
| {
 | |
|    long val, hold ;
 | |
| 
 | |
|    hold = c4atoi( time, 2 ) ;
 | |
|    val = hold*3600000 ;
 | |
|    hold = c4atoi( time+3, 2 ) ;
 | |
|    val += hold*60000 ;
 | |
|    hold = c4atoi( time+6, 2 ) ;
 | |
|    val += hold*1000 ;
 | |
|    if ( time[8] != 0 && strLen > 8 )
 | |
|    {
 | |
|       hold = c4atoi( time+9, 3 ) ;
 | |
|       val += hold ;
 | |
|    }
 | |
| 
 | |
|    return val ;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #ifndef S4CLIENT
 | |
| 
 | |
| #ifndef N4OTHER
 | |
| 
 | |
| #ifdef S4FOX
 | |
| #ifdef P4ARGS_USED
 | |
|    #pragma argsused
 | |
| #endif
 | |
| void t4strToCur( char *result, const char *input, const int len )
 | |
| {
 | |
|    CURRENCY4 hold ;
 | |
| 
 | |
|    c4atoCurrency( &hold, input, len ) ;
 | |
|    t4curToFox( result, &hold ) ;
 | |
| }
 | |
| 
 | |
| /* seek string must be:  CCYYMMDDHH:MM:SS */
 | |
| void t4strToDateTime( char *result, const char *input, const int len )
 | |
| {
 | |
|    long dt[2] ;
 | |
| 
 | |
|    if ( len < 16 )
 | |
|    {
 | |
|       memset( result, 0, 8 ) ;   /* 4 byte double */
 | |
|       return ;
 | |
|    }
 | |
| 
 | |
|    dt[0] = date4long( input ) ;
 | |
|    dt[1] = time4long( input + 8, len - 8 ) ;
 | |
|    t4dateTimeToFox( result, dt ) ;
 | |
| }
 | |
| 
 | |
| #ifdef P4ARGS_USED
 | |
|    #pragma argsused
 | |
| #endif
 | |
| /* result must be big enough to hold a CURRENCY4 structure - 8 bytes */
 | |
| void t4dblToCur( char *result, const double d )
 | |
| {
 | |
|    char currencyBuffer[21] ;
 | |
| 
 | |
|    c4dtoa45( d, currencyBuffer, 20, 4 ) ;
 | |
|    c4atoCurrency( (CURRENCY4 *)result, currencyBuffer, 20 ) ;
 | |
| }
 | |
| 
 | |
| #ifdef P4ARGS_USED
 | |
|    #pragma argsused
 | |
| #endif
 | |
| void t4strToInt( char *result, const char *input, const int len )
 | |
| {
 | |
|    long val ;
 | |
| 
 | |
|    val = c4atol( input, len ) ;
 | |
|    t4intToFox( result, &val ) ;
 | |
| }
 | |
| 
 | |
| #ifdef P4ARGS_USED
 | |
|    #pragma argsused
 | |
| #endif
 | |
| void t4dblToInt( char *result, const double d )
 | |
| {
 | |
|    long val ;
 | |
| 
 | |
|    val = (int)d ;
 | |
|    t4intToFox( result, &val ) ;
 | |
| }
 | |
| #else
 | |
| int S4CALL t4cmpDoub( S4CMP_PARM dataPtr, S4CMP_PARM searchPtr, size_t len )
 | |
| {
 | |
|    double dif ;
 | |
|    #ifdef S4DATA_ALIGN
 | |
|       double d1, d2 ;
 | |
|       memcpy( (void *)&d1, dataPtr, sizeof(double) ) ;
 | |
|       memcpy( (void *)&d2, searchPtr, sizeof(double) ) ;
 | |
|       dif = d1 - d2 ;
 | |
|    #else
 | |
|       dif = *((double *)dataPtr) - *((double *)searchPtr) ;
 | |
|    #endif
 | |
| 
 | |
|    if ( dif > E4ACCURACY )
 | |
|       return r4after ;
 | |
|    if ( dif < -E4ACCURACY )
 | |
|       return -1 ;
 | |
|    return r4success ;
 | |
| }
 | |
| 
 | |
| int S4CALL t4descCmpDoub( S4CMP_PARM dataPtr, S4CMP_PARM searchPtr, size_t len )
 | |
| {
 | |
|    return -1 * t4cmpDoub( dataPtr, searchPtr, 0 ) ;
 | |
| }
 | |
| 
 | |
| int S4CALL t4descBcdCmp( S4CMP_PARM dataPtr, S4CMP_PARM searchPtr, size_t len )
 | |
| {
 | |
|    return -1 * c4bcdCmp( dataPtr, searchPtr, 0 ) ;
 | |
| }
 | |
| 
 | |
| int S4CALL t4descMemcmp( S4CMP_PARM dataPtr, S4CMP_PARM searchPtr, size_t len )
 | |
| {
 | |
|    return -1 * u4memcmp( dataPtr, searchPtr, len ) ;
 | |
| }
 | |
| 
 | |
| void t4strToDateMdx( char *result, const char *input, const int dummy )
 | |
| {
 | |
|    double d ;
 | |
|    d = (double) date4long(input) ;
 | |
|    memcpy( result, (void *)&d, sizeof(double) ) ;
 | |
| }
 | |
| 
 | |
| void t4noChangeDouble( char *result, const double d )
 | |
| {
 | |
|    memcpy( result, (void *)&d, sizeof(double) ) ;
 | |
| }
 | |
| 
 | |
| void t4noChangeStr( char *a, const char *b, const int l)
 | |
| {
 | |
|    memcpy(a,b,l) ;
 | |
| }
 | |
| 
 | |
| #ifndef S4OFF_INDEX
 | |
| /* S4MDX */
 | |
| int tfile4init( TAG4FILE *t4, INDEX4 *i4, T4DESC *tagInfo )
 | |
| {
 | |
|    CODE4 *c4 ;
 | |
|    FILE4SEQ_READ seqread ;
 | |
|    char buffer[1024], garbageBuffer[518], exprBuf[I4MAX_EXPR_SIZE+1], *ptr ;
 | |
|    int len ;
 | |
| 
 | |
|    #ifdef E4PARM_LOW
 | |
|       if ( i4 == 0 || t4 == 0 || tagInfo == 0 )
 | |
|          return error4( 0, e4parm, E94904 ) ;
 | |
|    #endif
 | |
| 
 | |
|    c4 = i4->codeBase ;
 | |
|    if ( error4code( c4 ) < 0 )
 | |
|       return -1 ;
 | |
| 
 | |
|    t4->indexFile = i4->indexFile ;
 | |
|    t4->codeBase = c4 ;
 | |
|    t4->cmp = (S4CMP_FUNCTION *)u4memcmp ;
 | |
| 
 | |
|    t4->headerOffset = tagInfo->headerPos * 512 ;
 | |
| 
 | |
|    file4seqReadInit( &seqread, &i4->indexFile->file, t4->headerOffset, buffer, sizeof(buffer) ) ;
 | |
|    if ( file4seqReadAll( &seqread, &t4->header, sizeof(T4HEADER)) < 0 )
 | |
|       return -1 ;
 | |
| 
 | |
|    #ifdef S4BYTE_SWAP
 | |
|       t4->header.keyLen = x4reverseShort( (void *)&t4->header.keyLen ) ;
 | |
|       t4->header.keysMax = x4reverseShort( (void *)&t4->header.keysMax ) ;
 | |
|       t4->header.groupLen = x4reverseShort( (void *)&t4->header.groupLen ) ;
 | |
|       t4->header.unique = x4reverseShort( (void *)&t4->header.unique ) ;
 | |
|    #endif
 | |
| 
 | |
|    t4->header.root = -1 ;
 | |
| 
 | |
|    u4ncpy( t4->alias, tagInfo->tag, sizeof(t4->alias) ) ;
 | |
|    c4trimN( t4->alias, sizeof(t4->alias) ) ;
 | |
|    c4upper( t4->alias ) ;
 | |
| 
 | |
|    file4seqReadAll( &seqread, exprBuf, sizeof(exprBuf)-1 ) ;
 | |
|    c4trimN( exprBuf, sizeof(exprBuf) ) ;
 | |
|    t4->expr = expr4parseLow( i4->data, exprBuf, t4 ) ;
 | |
|    if ( !t4->expr )
 | |
|       return -1 ;
 | |
| 
 | |
|    len = expr4keyLen( t4->expr ) ;
 | |
|    if ( len < 0 )
 | |
|       return error4stack( c4, len, E94904 ) ;
 | |
| 
 | |
|    if ( t4->header.keyLen != (short)len )
 | |
|       return error4describe( c4, e4index, E84901, i4->indexFile->file.name, 0, 0 ) ;
 | |
| 
 | |
|    tfile4initSeekConv( t4, t4->header.type ) ;
 | |
| 
 | |
|    file4seqReadAll( &seqread, garbageBuffer, sizeof(garbageBuffer) ) ;
 | |
| 
 | |
|    file4seqReadAll( &seqread, exprBuf, sizeof(exprBuf)-1 ) ;
 | |
|    c4trimN( exprBuf, sizeof(exprBuf) ) ;
 | |
| 
 | |
|    if ( garbageBuffer[1] == 1 )   /* Q&E support ... has filter */
 | |
|    {
 | |
|       if ( exprBuf[0] != 0 )
 | |
|       {
 | |
|          if ( garbageBuffer[2] == 1 )
 | |
|             t4->hasKeys = t4->hadKeys = 1 ;
 | |
|          else
 | |
|             t4->hasKeys = t4->hadKeys = 0 ;
 | |
| 
 | |
|          t4->filter = expr4parseLow( i4->data, exprBuf, t4 ) ;
 | |
|          if ( t4->filter == 0 )
 | |
|             return -1 ;
 | |
|          len = expr4key( t4->filter, &ptr ) ;
 | |
|          if ( len < 0 )
 | |
|             return -1 ;
 | |
|          if ( expr4type( t4->filter ) != 'L' )
 | |
|             error4describe( c4, e4index, E84903, i4->indexFile->file.name, 0, 0 ) ;
 | |
|       }
 | |
|    }
 | |
|    return 0 ;
 | |
| }
 | |
| 
 | |
| int tfile4initSeekConv( TAG4FILE *t4, int keyType )
 | |
| {
 | |
|    int isDesc ;
 | |
| 
 | |
|    isDesc = t4->header.typeCode & 8 ;
 | |
| 
 | |
|    switch( keyType )
 | |
|    {
 | |
|       case r4num:
 | |
|          if ( isDesc )
 | |
|             t4->cmp = (S4CMP_FUNCTION *)t4descBcdCmp ;
 | |
|          else
 | |
|             t4->cmp = (S4CMP_FUNCTION *)c4bcdCmp ;
 | |
| 
 | |
|          t4->stok = c4bcdFromA ;
 | |
|          t4->dtok = c4bcdFromD ;
 | |
|          break ;
 | |
| 
 | |
|       case r4date:
 | |
|          if ( isDesc )
 | |
|             t4->cmp = (S4CMP_FUNCTION *)t4descCmpDoub ;
 | |
|          else
 | |
|             t4->cmp = (S4CMP_FUNCTION *)t4cmpDoub ;
 | |
|          t4->stok = t4strToDateMdx ;
 | |
|          t4->dtok = t4noChangeDouble ;
 | |
|          break ;
 | |
| 
 | |
|       case r4str:
 | |
|          if ( isDesc )
 | |
|             t4->cmp = (S4CMP_FUNCTION *)t4descMemcmp ;
 | |
|          else
 | |
|             t4->cmp = (S4CMP_FUNCTION *)u4memcmp ;
 | |
|          t4->stok = t4noChangeStr ;
 | |
|          t4->dtok = 0 ;
 | |
|          break ;
 | |
| 
 | |
|       default:
 | |
|          return error4( t4->codeBase, e4info, E82901 ) ;
 | |
|    }
 | |
|    #ifdef S4UNIX
 | |
|       switch( keyType )
 | |
|       {
 | |
|          case r4num:
 | |
|             t4->keyType = r4num ;
 | |
|             break ;
 | |
| 
 | |
|          case r4date:
 | |
|             t4->keyType = r4date ;
 | |
|             break ;
 | |
| 
 | |
|          case r4str:
 | |
|             t4->keyType = r4str ;
 | |
|             break ;
 | |
|       }
 | |
|    #endif
 | |
| 
 | |
|    return 0 ;
 | |
| }
 | |
| #endif  /* ifndef S4OFF_INDEX */
 | |
| #endif  /* ifndef S4FOX */
 | |
| 
 | |
| #ifdef S4FOX
 | |
| #ifndef S4OFF_INDEX
 | |
| 
 | |
| #ifdef S4LANGUAGE
 | |
|    extern unsigned char v4map[256];
 | |
| #else
 | |
|    #ifdef S4ANSI
 | |
|       extern unsigned char v4map[256];
 | |
|    #endif
 | |
| #endif
 | |
| 
 | |
| int S4CALL t4cdxCmp( S4CMP_PARM dataPtr, S4CMP_PARM searchPtr, size_t len )
 | |
| {
 | |
|    unsigned char *data = (unsigned char *)dataPtr ;
 | |
|    unsigned char *search = (unsigned char *)searchPtr ;
 | |
|    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 t4noChangeStr( char *a, const char *b, const int l )
 | |
| {
 | |
|    memcpy( a, b, (unsigned int)l ) ;
 | |
| }
 | |
| 
 | |
| void t4strToLog( char *dest, const char *src, const int l )
 | |
| {
 | |
|    int pos = 0 ;
 | |
| 
 | |
|    for ( ; l != pos ; pos++ )
 | |
|       switch( src[pos] )
 | |
|       {
 | |
|          case 't':
 | |
|          case 'T':
 | |
|          case 'y':
 | |
|          case 'Y':
 | |
|             dest[0] = 'T' ;
 | |
|             return ;
 | |
|          case 'f':
 | |
|          case 'F':
 | |
|          case 'n':
 | |
|          case 'N':
 | |
|             dest[0] = 'F' ;
 | |
|             return ;
 | |
|          default:
 | |
|             break ;
 | |
|       }
 | |
| 
 | |
|    dest[0] = 'F' ;
 | |
| }
 | |
| 
 | |
| /* S4FOX */
 | |
| int tfile4init( TAG4FILE *t4, INDEX4 *i4, long filePos, unsigned char *name )
 | |
| {
 | |
|    CODE4 *c4 ;
 | |
|    char exprBuf[I4MAX_EXPR_SIZE+1], *ptr ;
 | |
|    int len ;
 | |
|    unsigned int topSize ;
 | |
|    #ifdef S4DATA_ALIGN
 | |
|       unsigned int size, delta ;
 | |
|    #endif
 | |
| 
 | |
|    #ifdef E4PARM_LOW
 | |
|       if ( i4 == 0 || t4 == 0 || name == 0 || filePos < 0 )
 | |
|          return error4( 0, e4parm, E94904 ) ;
 | |
|    #endif
 | |
| 
 | |
|    c4 = i4->codeBase ;
 | |
|    if ( error4code( c4 ) < 0 )
 | |
|       return -1 ;
 | |
| 
 | |
|    t4->indexFile = i4->indexFile ;
 | |
|    t4->codeBase = c4 ;
 | |
|    t4->headerOffset = filePos ;
 | |
|    t4->header.root = -1 ;
 | |
|    t4->cmp = (S4CMP_FUNCTION *)t4cdxCmp ;
 | |
| 
 | |
|    topSize = 2 * sizeof(long) + 4*sizeof(char) + sizeof(short) + 2 * sizeof(unsigned char) ;
 | |
|    if ( file4readAll( &i4->indexFile->file, filePos, &t4->header, topSize ) < 0 )
 | |
|       return 0 ;
 | |
|    if ( file4readAll( &i4->indexFile->file, filePos + (long)topSize + 478L, &t4->header.sortSeq, ( 8 * sizeof(char) ) ) < 0 )
 | |
|       return 0 ;
 | |
|    t4->header.sortSeq[7] = '\0' ;
 | |
|    if ( file4readAll( &i4->indexFile->file, filePos + (long)topSize + 486L, &t4->header.descending, ( 5 * sizeof(short) ) ) < 0 )
 | |
|       return 0 ;
 | |
|    #ifdef S4BYTE_SWAP
 | |
|       t4->header.root = x4reverseLong( (void *)&t4->header.root ) ;
 | |
|       t4->header.freeList = x4reverseLong( (void *)&t4->header.freeList ) ;
 | |
|       t4->header.version = x4reverseLong( (void *)&t4->header.version ) ;
 | |
|       t4->header.keyLen = x4reverseShort( (void *)&t4->header.keyLen ) ;
 | |
|       t4->header.descending = x4reverseShort( (void *)&t4->header.descending ) ;
 | |
|       t4->header.filterPos = x4reverseShort( (void *)&t4->header.filterPos ) ;
 | |
|       t4->header.filterLen = x4reverseShort( (void *)&t4->header.filterLen ) ;
 | |
|       t4->header.exprPos = x4reverseShort( (void *)&t4->header.exprPos ) ;
 | |
|       t4->header.exprLen = x4reverseShort( (void *)&t4->header.exprLen ) ;
 | |
|    #endif
 | |
| 
 | |
|    u4ncpy( t4->alias, (char *)name, sizeof(t4->alias) ) ;
 | |
|    c4trimN( t4->alias, sizeof(t4->alias) ) ;
 | |
|    c4upper( t4->alias ) ;
 | |
| 
 | |
|    if ( *t4->header.sortSeq == '\0' )
 | |
|    {
 | |
|       if ( tfile4setCollatingSeq( t4, sort4machine ) < 0 )
 | |
|          return error4( c4, e4index, E84907 ) ;
 | |
|    }
 | |
|    #ifdef S4GENERAL
 | |
|    else if ( strcmp( t4->header.sortSeq, "GENERAL" ) == 0 )
 | |
|    {
 | |
|       if ( tfile4setCollatingSeq( t4, sort4general ) < 0 )
 | |
|          return error4( c4, e4index, E84907 ) ;
 | |
|    }
 | |
|    #endif
 | |
|    else
 | |
|       return error4( c4, e4index, E84907 ) ;
 | |
| 
 | |
|    if ( t4->header.typeCode < 0x80 )  /* non-compound header; so expression */
 | |
|    {
 | |
|       #ifdef E4ANALYZE
 | |
|          if ( t4->header.exprLen+1 > sizeof( exprBuf ) )
 | |
|              return error4( c4, e4info, E84902 ) ;
 | |
|       #endif
 | |
|       file4readAll( &i4->indexFile->file, filePos+B4BLOCK_SIZE, exprBuf, (unsigned int)t4->header.exprLen ) ;
 | |
|       exprBuf[t4->header.exprLen] = '\0' ;
 | |
|       t4->expr = expr4parseLow( i4->data, exprBuf, t4 ) ;
 | |
|       if ( t4->expr == 0 )
 | |
|          return -1 ;
 | |
| 
 | |
|       len = expr4keyLen( t4->expr ) ;
 | |
|       if ( len < 0 )
 | |
|          return -1 ;
 | |
| 
 | |
|       if ( t4->header.keyLen != len )
 | |
|          return error4describe( c4, e4index, E84901, i4->indexFile->file.name, 0, 0 ) ;
 | |
| 
 | |
|       tfile4initSeekConv(t4, t4->expr->type ) ;
 | |
| 
 | |
|       if ( t4->header.typeCode & 0x08 )   /* For clause (filter) exists */
 | |
|       {
 | |
|          file4readAll( &i4->indexFile->file, filePos + B4BLOCK_SIZE + t4->header.exprLen, exprBuf, (unsigned int)t4->header.filterLen ) ;
 | |
|          exprBuf[t4->header.filterLen] = '\0' ;
 | |
| 
 | |
|          t4->filter = expr4parseLow( i4->data, exprBuf, t4 ) ;
 | |
|          if ( t4->filter == 0 )
 | |
|             return -1 ;
 | |
|          len = expr4key( t4->filter, &ptr ) ;
 | |
|          if ( len < 0 )
 | |
|             return -1 ;
 | |
|          if ( expr4type( t4->filter ) != 'L' )
 | |
|             error4describe( c4, e4index, E84903, i4->indexFile->file.name, 0, 0 ) ;
 | |
|       }
 | |
|    }
 | |
| 
 | |
|    #ifdef S4DATA_ALIGN
 | |
|       size = (unsigned int)sizeof(long) + t4->header.keyLen ;
 | |
|       delta = 4 - size % 4 ;
 | |
|       t4->builtKeyMemory = mem4create( c4, 3, size + delta, 2, 0 ) ;
 | |
|    #else
 | |
|       t4->builtKeyMemory = mem4create( c4, 3, (unsigned int)sizeof(long) + t4->header.keyLen + 1, 2, 0 ) ;
 | |
|    #endif
 | |
| 
 | |
|    return 0 ;
 | |
| }
 | |
| 
 | |
| int tfile4initSeekConv( TAG4FILE *t4, int type )
 | |
| {
 | |
|    t4->cmp = (S4CMP_FUNCTION *)t4cdxCmp ;
 | |
| 
 | |
|    switch( type )
 | |
|    {
 | |
|       case r4date:
 | |
|       case r4dateDoub:
 | |
|          t4->stok = t4dtstrToFox ;
 | |
|          t4->dtok = t4dblToFox ;
 | |
|          t4->pChar = '\0' ;
 | |
|          break ;
 | |
|       case r4numDoub:
 | |
|          if ( expr4currency( t4->expr ) )  /* then should be converted to a currency */
 | |
|          {
 | |
|             t4->stok = t4strToCur ;
 | |
|             t4->dtok = t4dblToCurFox ;
 | |
|             t4->pChar = '\0' ;
 | |
|             break ;
 | |
|          }
 | |
|          /* else fall through, same as r4num */
 | |
|       case r4num:
 | |
|          t4->stok = t4strToFox ;
 | |
|          t4->dtok = t4dblToFox ;
 | |
|          t4->pChar = '\0' ;
 | |
|          break ;
 | |
|       case r4str:
 | |
|          t4->stok = t4noChangeStr ;
 | |
|          t4->dtok = 0 ;
 | |
|          t4->pChar = ' ' ;
 | |
|          #ifdef S4VFP_KEY
 | |
|             if ( tfile4vfpKey( t4 ) )
 | |
|                t4->pChar = '\0' ;   /* if this changes check t4strToVFPKey() to ensure correctness */
 | |
|          #endif
 | |
|          break ;
 | |
|       case r4log:
 | |
|          t4->stok = t4strToLog ;
 | |
|          t4->dtok = 0 ;
 | |
|          break ;
 | |
|       #ifdef S4FOX
 | |
|          case r4int:
 | |
|             t4->stok = t4strToInt ;
 | |
|             t4->dtok = t4dblToInt ;
 | |
|             t4->pChar = '\0' ;
 | |
|             break ;
 | |
|          case r4dateTime:
 | |
|             t4->stok = t4strToDateTime ;
 | |
|             t4->dtok = 0 ;
 | |
|             t4->pChar = '\0' ;
 | |
|             break ;
 | |
|          case r4currency:
 | |
|             t4->stok = t4strToCur ;
 | |
|             t4->dtok = t4dblToCur ;
 | |
|             t4->pChar = '\0' ;
 | |
|             break ;
 | |
|       #endif
 | |
|       default:
 | |
|          return error4( t4->codeBase, e4info, E82901 ) ;
 | |
|    }
 | |
|    #ifdef S4UNIX
 | |
|       switch( type )
 | |
|       {
 | |
|          case r4num:
 | |
|          case r4numDoub:
 | |
|             t4->keyType = r4num ;
 | |
|             break ;
 | |
| 
 | |
|          case r4date:
 | |
|          case r4dateDoub:
 | |
|             t4->keyType = r4date ;
 | |
|             break ;
 | |
| 
 | |
|          case r4str:
 | |
|             t4->keyType = r4str ;
 | |
|             break ;
 | |
| 
 | |
|          case r4log:
 | |
|             t4->keyType = r4log ;
 | |
|             break ;
 | |
|       }
 | |
|    #endif
 | |
| 
 | |
|    return 0 ;
 | |
| }
 | |
| 
 | |
| #endif   /*  ifdef S4FOX  */
 | |
| #endif   /*  ifndef S4OFF_INDEX  */
 | |
| 
 | |
| #endif   /*  ifndef N4OTHER  */
 | |
| 
 | |
| #ifdef N4OTHER
 | |
| 
 | |
| #ifdef P4ARGS_USED
 | |
|    #pragma argsused
 | |
| #endif
 | |
| int S4CALL t4cmpDoub( S4CMP_PARM dataPtr, S4CMP_PARM searchPtr, size_t len )
 | |
| {
 | |
|    #ifdef S4DATA_ALIGN
 | |
|       double d1, d2 ;
 | |
|       memcpy( &d1, dataPtr, sizeof(double) ) ;
 | |
|       memcpy( &d2, searchPtr, sizeof(double) ) ;
 | |
|       double dif = d1 - d2 ;
 | |
|    #else
 | |
|       double dif = *((double *)dataPtr) - *((double *)searchPtr) ;
 | |
|    #endif
 | |
| 
 | |
|    if ( dif > E4ACCURACY )  return r4after ;
 | |
|    if ( dif < -E4ACCURACY ) return -1 ;
 | |
|    return r4success ;
 | |
| }
 | |
| 
 | |
| #ifdef P4ARGS_USED
 | |
|    #pragma argsused
 | |
| #endif
 | |
| void  t4strToDoub( char *result, const char *input, const int dummy )
 | |
| {
 | |
|    double d ;
 | |
|    d = c4atod( input, strlen( input )) ;
 | |
|    memcpy( result, &d, sizeof(double) ) ;
 | |
| }
 | |
| 
 | |
| #ifdef P4ARGS_USED
 | |
|    #pragma argsused
 | |
| #endif
 | |
| void t4strToDateMdx( char *result, const char *input, const int dummy )
 | |
| {
 | |
|    double d = (double) date4long(input) ;
 | |
|    memcpy( result, &d, sizeof(double) ) ;
 | |
| }
 | |
| 
 | |
| void t4noChangeDouble( char *result, const double d )
 | |
| {
 | |
|    memcpy( result, &d, sizeof(double) ) ;
 | |
| }
 | |
| 
 | |
| void t4noChangeStr( char *a, const char *b, const int l)
 | |
| {
 | |
|    memcpy(a,b,l) ;
 | |
| }
 | |
| 
 | |
| #ifdef S4CLIPPER
 | |
| /* if input len != 0 then it is used to position value to right-justify */
 | |
| void  t4strToClip( char *result, const char *input, const int len )
 | |
| {
 | |
|    int iLen, dLen ;
 | |
| 
 | |
|    iLen = strlen( input ) ;
 | |
|    dLen = len - iLen ;
 | |
|    if ( dLen > 0 )
 | |
|    {
 | |
|       memset( result, ' ', dLen ) ;
 | |
|       memcpy( result + dLen, input, iLen ) ;
 | |
|    }
 | |
|    else
 | |
|       memcpy( result, input, iLen ) ;
 | |
|    c4clip( result, strlen( result ) ) ;
 | |
| }
 | |
| #endif
 | |
| 
 | |
| void  t4dateDoubToStr( char *result, const double d )
 | |
| {
 | |
|    long  l ;
 | |
| 
 | |
|    l = (long) d ;
 | |
|    date4assign( result, l ) ;
 | |
| }
 | |
| 
 | |
| #ifndef S4OFF_INDEX
 | |
| 
 | |
| int tfile4initSeekConv( TAG4FILE *t4, int keyType )
 | |
| {
 | |
|    switch( keyType )
 | |
|    {
 | |
|       case r4date:
 | |
|       case r4dateDoub:
 | |
|          t4->cmp = (S4CMP_FUNCTION *)u4memcmp ;
 | |
|          t4->stok = t4noChangeStr ;
 | |
|          t4->dtok = t4dateDoubToStr ;
 | |
|          break ;
 | |
| 
 | |
|       case r4num:
 | |
|       case r4numDoub:
 | |
|          t4->cmp = (S4CMP_FUNCTION *)u4memcmp ;
 | |
|          t4->stok = t4strToClip ;
 | |
|          t4->dtok = 0 ;
 | |
|          break ;
 | |
| 
 | |
|       case r4str:
 | |
|          t4->cmp = (S4CMP_FUNCTION *)u4memcmp ;
 | |
|          t4->stok = t4noChangeStr ;
 | |
|          t4->dtok = 0 ;
 | |
|          break ;
 | |
| 
 | |
|       default:
 | |
|          return error4( t4->codeBase, e4tagInfo, E82901 ) ;
 | |
|    }
 | |
|    #ifdef S4UNIX
 | |
|       switch( keyType )
 | |
|       {
 | |
|          case r4num:
 | |
|          case r4numDoub:
 | |
|             t4->keyType = r4num ;
 | |
|             break ;
 | |
| 
 | |
|          case r4date:
 | |
|          case r4dateDoub:
 | |
|             t4->keyType = r4date ;
 | |
|             break ;
 | |
| 
 | |
|          case r4str:
 | |
|             t4->keyType = r4str ;
 | |
|             break ;
 | |
|       }
 | |
|    #endif
 | |
| 
 | |
|    return 0 ;
 | |
| }
 | |
| #endif   /* S4OFF_INDEX */
 | |
| #endif   /* N4OTHER */
 | |
| #endif   /* S4CLIENT */
 |