home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 24
/
CD_ASCQ_24_0995.iso
/
vrac
/
wordy315.zip
/
SEARCH.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-29
|
3KB
|
144 lines
#include "srch.h"
#define ARGCOUNT 2
#define BAD_ARGS 2
#define BUZZ 60
#define DELAY1 500
#define FILE_ERROR 10
void buzz()
{
sound( BUZZ );
delay( DELAY1 );
nosound();
return;
}
Rflag b_search( char *search_word, FILE *fp, long left, long right )
{
int result;
long middle;
char discard [MAX_WLEN + 1],
working [MAX_WLEN + 1],
target [MAX_WLEN];
Rflag bflag = FAIL;
strcpy( working, search_word );
strcat( working, "\n" ); //Because fgets() reads CR's
while( right - left > MAX_SPAN )
{
middle = ( left + right ) / 2;
fseek( fp, middle, SEEK_SET );
fgets( discard, MAX_WLEN + 1, fp ); //Throw away partial(?) string.
fgets( target, MAX_WLEN, fp );
result = strcmp( working, target );
if( !result )
{ bflag = SUCCESS; break; }
if( result < 0 )
right = middle;
else
if( result > 0 )
left = middle;
else
{
puts( "Error in strcmp() in BINARY SEARCH !" );
exit( COMPARISON_ERROR ); //Error in strcmp() !
}
}
if( !bflag )
bflag = l_search( search_word, fp );
return( bflag );
}
Rflag l_search( char *search_word, FILE *fp )
{
long backstep;
int test,
i;
char target [MAX_WLEN],
work [MAX_WLEN + 1],
CR_str [] = "\n";
Rflag flag = FAIL;
if( ( backstep = ftell( fp ) ) > 2 * MAX_SPAN )
backstep = -1L * ( 2 * MAX_SPAN ); //Else backstep to file begin.
else
backstep = -1L * backstep;
fseek( fp, backstep, SEEK_CUR );
strcpy( work, search_word ); //Make working copy.
strcat( work, CR_str ); //Because fgets() reads CR's
for( i = 0; i <= MAXTESTS; i++ )
{
if( !( fgets( target, MAX_WLEN, fp ) ) ) break; //EOF!
test = strcmp( work, target );
if( test < 0 && i > 0 )
break; //Passed possible match
if( !test )
{ flag = SUCCESS; break; }
}
return ( flag );
}
Rflag lookup( char *tstword )
{
FILE *fptr;
long file_end; //Byte count of eof [length of file]
const long file_begin = 0L;
Rflag rflag;
disable(); //Turn off timer, so TSR doesn't mess up disk io.
if( NULL == ( fptr = fopen( Wordfile, "r" ) ) )
exit( FILE_ERROR );
file_end = filelength( fileno( fptr ) );
rflag = b_search( tstword, fptr, file_begin, file_end );
// ^^^^Preserves filepos in call!
fclose( fptr );
enable(); //Turn on timer again.
return( rflag );
}
void main( int argc, char **argv )
{
if( argc != ARGCOUNT )
{
puts( "\nFormat: search word" );
exit( BAD_ARGS );
}
if( lookup( argv[1] ) )
printf( "\7\7\7%s found!", argv[1] );
else
{
buzz();
printf( "%s NOT found.", argv[1] );
}
}