campo-sirio/cb/source/m4check.c
alex af15e0698b Codebase
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-06-16 13:01:08 +00:00

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