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 */
 |