90 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /* m4check.c   (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved. */
 | |
| 
 | |
| #include "d4all.h"
 | |
| 
 | |
| #ifdef S4STAND_ALONE
 | |
| 
 | |
| /* not supported for FoxPro FPT memo files or dBase III and Clipper memo files */
 | |
| #ifndef S4MFOX
 | |
| #ifndef S4MNDX
 | |
| 
 | |
| #ifndef S4UNIX
 | |
|    #ifdef __TURBOC__
 | |
|       #pragma hdrstop
 | |
|    #endif
 | |
| #endif
 | |
| 
 | |
| #ifndef S4MEMO_OFF
 | |
| int S4FUNCTION f4memoCheck( MEMO4FILE *f4memo, DATA4 *data )
 | |
| {
 | |
|    F4FLAG flags ;
 | |
|    DATA4FILE *d4 ;
 | |
|    int  rc, iField ;
 | |
|    long numBlocks, memoId ;
 | |
|    MEMO4CHAIN_ENTRY cur ;
 | |
| 
 | |
|    d4 = f4memo->data ;
 | |
|    #ifndef S4OFF_MULTI
 | |
|       #ifdef S4SERVER
 | |
|          rc = dfile4lockFile( d4, d4->currentClientId, d4->serverId ) ;
 | |
|       #else
 | |
|          rc = d4lockFile( data ) ;
 | |
|       #endif
 | |
|       if ( rc != 0 )
 | |
|          return rc ;
 | |
|    #endif
 | |
| 
 | |
|    #ifndef S4OFF_WRITE
 | |
|       if ( ( rc = d4update( data ) ) != 0 )
 | |
|          return rc ;
 | |
|    #endif
 | |
| 
 | |
|    if ( f4flagInit( &flags, d4->c4, file4len( &f4memo->file ) / f4memo->blockSize ) < 0 )
 | |
|       return error4stack( d4->c4, e4memory, E95206 ) ;
 | |
| 
 | |
|    /* Set flags for the data file entries */
 | |
|    for ( d4top( data ) ; ! d4eof( data ) ; d4skip( data, 1L ) )
 | |
|    {
 | |
|       for ( iField = 0 ; iField < d4->nFieldsMemo ; iField++ )
 | |
|       {
 | |
|          numBlocks = (long)((long)f4memoLen(data->fieldsMemo[iField].field) + f4memo->blockSize - 1) / f4memo->blockSize ;
 | |
|          memoId = f4long( data->fieldsMemo[iField].field ) ;
 | |
| 
 | |
|          if ( f4flagIsAnySet( &flags, memoId, numBlocks ) )
 | |
|             return error4( d4->c4, e4info, E85204 ) ;
 | |
|          if ( f4flagSetRange( &flags, memoId, numBlocks ) < 0 )
 | |
|             return -1 ;
 | |
|       }
 | |
|    }
 | |
| 
 | |
|    /* Set flags for the free chain */
 | |
|    memset( (void *)&cur, 0, sizeof(cur) ) ;
 | |
|    memo4fileChainSkip( f4memo, &cur ) ;  /* Read in root */
 | |
| 
 | |
|    for ( memo4fileChainSkip( f4memo, &cur ) ; cur.next != -1 ; memo4fileChainSkip( f4memo, &cur ) )
 | |
|    {
 | |
|       rc = f4flagIsAnySet( &flags, cur.blockNo, cur.num) ;
 | |
|       if ( rc < 0 )
 | |
|          return rc ;
 | |
|       if ( rc )
 | |
|          return error4( d4->c4, e4info, E85204 ) ;
 | |
|       if ( f4flagSetRange( &flags, cur.blockNo, cur.num ) < 0 )
 | |
|          return -1 ;
 | |
|    }
 | |
| 
 | |
|    rc = f4flagIsAllSet( &flags, 1, file4len( &f4memo->file ) / f4memo->blockSize-1 ) ;
 | |
|    u4free( flags.flags ) ;
 | |
|    if ( rc == 0 )
 | |
|       return error4( d4->c4, e4result, E85205 ) ;
 | |
|    if ( rc < 0 )
 | |
|       return -1 ;
 | |
| 
 | |
|    return 0 ;
 | |
| }
 | |
| #endif /*  ifndef S4MEMO_OFF */
 | |
| 
 | |
| #endif  /*   ifndef S4MFOX   */
 | |
| #endif  /*   ifndef S4MNDX   */
 | |
| 
 | |
| #endif /* S4STAND_ALONE */
 |