116 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
//
 | 
						|
// EX10CON.CPP
 | 
						|
//
 | 
						|
//  C++/DOS Example program for ArchiveLib 2.0
 | 
						|
//
 | 
						|
//  Copyright (c) Greenleaf Software, Inc. 1994 - 1996
 | 
						|
//  All Rights Reserved
 | 
						|
//
 | 
						|
// MEMBERS/FUNCTIONS DEMONSTRATED
 | 
						|
//
 | 
						|
//
 | 
						|
// DESCRIPTION
 | 
						|
//
 | 
						|
//  This example program is used to show off some of the pattern
 | 
						|
//  matching functions.  It is sort of a baby grep, able to look
 | 
						|
//  through any list of files for a particular string.  The format
 | 
						|
//  you pass on the command line is:
 | 
						|
//
 | 
						|
//     EX10DOS pattern wild-card
 | 
						|
//
 | 
						|
//  You can omit wild-card, or wild-card and pattern, in which case
 | 
						|
//  the defaults of "new" and "*.CPP" will be used.
 | 
						|
//
 | 
						|
// REVISION HISTORY
 | 
						|
//
 | 
						|
//  February 1, 1996  2.0A  : Second release
 | 
						|
//
 | 
						|
//
 | 
						|
 | 
						|
#include <fstream.h>
 | 
						|
#include "al.h"
 | 
						|
#include "_match.h"
 | 
						|
#include <conio.h>
 | 
						|
 | 
						|
void scan( char *name, char *pattern );
 | 
						|
 | 
						|
int main( int argc, char *argv[] )
 | 
						|
{
 | 
						|
 cout << "Archive Library 2.0\nEX10CON.CPP\n\n";
 | 
						|
 cout << "This example program is used to show off some of the pattern\n";
 | 
						|
 cout << "matching functions.  It is sort of a baby grep, able to look\n";
 | 
						|
 cout << "through any list of files for a particular string.  The format\n";
 | 
						|
 cout << "you pass on the command line is:\n";
 | 
						|
 cout << "\n";
 | 
						|
 cout << "   EX10CON pattern wild-card\n";
 | 
						|
 cout << "\n";
 | 
						|
 cout << "You can omit wild-card, or wild-card and pattern, in which case\n";
 | 
						|
 cout << "the defaults of 'new' and '*.CPP' will be used.\n\n";
 | 
						|
 getch();
 | 
						|
 | 
						|
//
 | 
						|
// The first part of the program just sets up the arguments, then
 | 
						|
// calls a couple of the match diagnostic functions.
 | 
						|
//
 | 
						|
 | 
						|
 char *names = "*.CPP";
 | 
						|
 char *pattern = "new";
 | 
						|
 if ( argc > 1 )
 | 
						|
     pattern = argv[ 1 ];
 | 
						|
 if ( argc > 2 )
 | 
						|
     names = argv[ 2 ];
 | 
						|
 cout << "Pattern : " << pattern << "\n";
 | 
						|
 int error_type;
 | 
						|
 cout << "contains wild characters: "
 | 
						|
      << is_pattern( pattern )
 | 
						|
      << "\n";
 | 
						|
 cout << "Is valid: "
 | 
						|
      << is_valid_pattern( pattern, &error_type )
 | 
						|
      << "\n";
 | 
						|
 if ( matche( "[A-", "test" ) != MATCH_PATTERN )
 | 
						|
     cout << "Logic error in match engine\n";
 | 
						|
 cout << "Hit any key to continue..." << flush;
 | 
						|
 getch();
 | 
						|
 cout << endl;
 | 
						|
 | 
						|
//
 | 
						|
// The second part of the program creates an extended pattern, which
 | 
						|
// should look like this:  "*pattern*".  We are going to search for
 | 
						|
// that search pattern in each line of each file.  The file names are
 | 
						|
// expanded one by one, and the scanner subroutine is called.
 | 
						|
//
 | 
						|
 | 
						|
 char *extended_pattern = new char[ strlen( pattern ) + 2 ];
 | 
						|
 strcpy( extended_pattern, "*" );
 | 
						|
 strcat( extended_pattern, pattern );
 | 
						|
 strcat( extended_pattern, "*" );
 | 
						|
 ALWildCardExpander *machine = new ALWildCardExpander( names );
 | 
						|
 char *name;
 | 
						|
 while ( ( name = machine->GetNextFile() ) != 0 )
 | 
						|
     scan( name, extended_pattern );
 | 
						|
 delete machine;
 | 
						|
 return 1;
 | 
						|
}
 | 
						|
 | 
						|
//
 | 
						|
// This routine reads in a line at a time from the specified file. It
 | 
						|
// tests each line for a match to the pattern.  Any matches are printed out,
 | 
						|
// and that is that.
 | 
						|
//
 | 
						|
 | 
						|
void scan( char *name, char *pattern )
 | 
						|
{
 | 
						|
 char buffer[ 133 ];
 | 
						|
 int line_number = 0;
 | 
						|
 | 
						|
 ifstream input;
 | 
						|
 input.open( name );
 | 
						|
 do {
 | 
						|
     input.getline( buffer, 133 );
 | 
						|
     line_number++;
 | 
						|
     if ( match( pattern, buffer ) ) {
 | 
						|
         cout << name << " " << line_number << ":" << buffer << "\n";
 | 
						|
     }
 | 
						|
 } while ( !input.eof() );
 | 
						|
}
 |