121 lines
2.7 KiB
C
121 lines
2.7 KiB
C
|
/* i4dump.c (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
|
||
|
|
||
|
#include "d4all.h"
|
||
|
#ifndef S4UNIX
|
||
|
#ifdef __TURBOC__
|
||
|
#pragma hdrstop
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
#ifdef S4STAND_ALONE
|
||
|
|
||
|
#ifndef S4INDEX_OFF
|
||
|
|
||
|
/* not supported for FoxPro compact index file structures */
|
||
|
#ifdef S4MDX /* ifndef S4FOX */
|
||
|
|
||
|
static void output( int h, char * s )
|
||
|
{
|
||
|
write( h, s, strlen(s) ) ;
|
||
|
}
|
||
|
|
||
|
static int tfile4dumpDo( TAG4FILE *t4, int outHandle, int level, int displayAll )
|
||
|
{
|
||
|
char outBuf[200] ;
|
||
|
int rc, iKey ;
|
||
|
B4BLOCK *blockOn ;
|
||
|
char buf[ I4MAX_KEY_SIZE ] ;
|
||
|
int len ;
|
||
|
|
||
|
rc = tfile4down( t4 ) ;
|
||
|
if ( rc < 0 || rc == 2 )
|
||
|
return -1 ;
|
||
|
blockOn = tfile4block( t4 ) ;
|
||
|
|
||
|
if ( b4leaf( blockOn ) && !displayAll )
|
||
|
{
|
||
|
tfile4up( t4 ) ;
|
||
|
return 0 ;
|
||
|
}
|
||
|
|
||
|
if ( b4leaf( blockOn) )
|
||
|
{
|
||
|
M4PRINT( outBuf, "\r\n\r\nLeaf B4BLOCK #: %ld Level %d\r\n\r\n", blockOn->fileBlock, level ) ;
|
||
|
output( outHandle, outBuf ) ;
|
||
|
output( outHandle, "Record Number Key\r\n" ) ;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
M4PRINT( outBuf, "\r\n\r\nBranch B4BLOCK #: %ld Level %d\r\n\r\n", blockOn->fileBlock, level ) ;
|
||
|
output( outHandle, outBuf ) ;
|
||
|
output( outHandle, "FILE4 B4BLOCK Key\r\n" ) ;
|
||
|
}
|
||
|
|
||
|
for ( iKey = 0; iKey < blockOn->nKeys; iKey++ )
|
||
|
{
|
||
|
M4PRINT( outBuf, "\r\n%10ld ", b4key(blockOn,iKey)->num ) ;
|
||
|
|
||
|
output( outHandle, outBuf ) ;
|
||
|
if ( tfile4type( t4 ) == r4str )
|
||
|
{
|
||
|
len = 50 ;
|
||
|
if ( len > t4->header.keyLen )
|
||
|
len = t4->header.keyLen ;
|
||
|
|
||
|
memcpy( buf, b4keyKey( blockOn, iKey ), len ) ;
|
||
|
buf[len] = 0 ;
|
||
|
output( outHandle, buf ) ;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( b4leaf( blockOn ) )
|
||
|
{
|
||
|
tfile4up( t4 ) ;
|
||
|
return 0 ;
|
||
|
}
|
||
|
|
||
|
M4PRINT( outBuf, "\r\n%10ld ", b4key( blockOn, iKey )->num ) ;
|
||
|
output( outHandle, outBuf ) ;
|
||
|
|
||
|
blockOn->keyOn = 0 ;
|
||
|
do
|
||
|
{
|
||
|
rc = tfile4dumpDo( t4, outHandle, level + 1, displayAll ) ;
|
||
|
if ( rc > 0 )
|
||
|
return error4( t4->codeBase, e4result, E94905 ) ;
|
||
|
if ( rc < 0 )
|
||
|
return -1 ;
|
||
|
} while ( b4skip( blockOn, 1) == 1 ) ;
|
||
|
|
||
|
tfile4up(t4) ;
|
||
|
return 0 ;
|
||
|
}
|
||
|
|
||
|
int tfile4dump( TAG4FILE *t4, int outHandle, const int displayAll )
|
||
|
{
|
||
|
int rc ;
|
||
|
|
||
|
#ifdef E4PARM_LOW
|
||
|
if ( t4 == 0 )
|
||
|
return error4( 0, e4parm_null, E94902 ) ;
|
||
|
#endif
|
||
|
|
||
|
if ( error4code( t4->codeBase ) < 0 )
|
||
|
return -1 ;
|
||
|
|
||
|
rc = index4lock( t4->indexFile, 0L ) ;
|
||
|
if ( rc )
|
||
|
return rc ;
|
||
|
|
||
|
if ( tfile4freeAll( t4 ) < 0 )
|
||
|
return -1 ;
|
||
|
|
||
|
output( outHandle, "\r\n\r\n" ) ;
|
||
|
tfile4dumpDo( t4, outHandle, 0, displayAll ) ;
|
||
|
return index4unlock( t4->indexFile, 0L ) ;
|
||
|
}
|
||
|
|
||
|
#endif /* S4MDX */
|
||
|
#endif /* S4INDEX_OFF */
|
||
|
#endif /* S4STAND_ALONE */
|