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