// // 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 #include "al.h" #include "_match.h" #include 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() ); }