2001-10-19 18:36:57 +04:00
/*
2004-03-30 23:35:44 +04:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2010-04-21 12:01:51 +04:00
* Copyright ( C ) 2004 - 2010 Red Hat , Inc . All rights reserved .
2001-10-19 18:36:57 +04:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
* of the GNU General Public License v .2 .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
2016-01-21 13:49:46 +03:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2001-10-19 18:36:57 +04:00
*/
2010-04-21 12:01:51 +04:00
# include "libdevmapper.h"
2001-10-19 18:36:57 +04:00
# include "log.h"
# include <stdio.h>
# include <ctype.h>
# include <string.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <unistd.h>
# include <fcntl.h>
# include <sys/mman.h>
static int _read_spec ( const char * file , char * * * regex , int * nregex )
{
char buffer [ 1024 ] , * start , * ptr ;
FILE * fp = fopen ( file , " r " ) ;
int asize = 100 ;
2010-04-21 12:01:51 +04:00
char * * rx = dm_malloc ( sizeof ( * rx ) * asize ) ;
2001-10-19 18:36:57 +04:00
int nr = 0 ;
if ( ! fp )
return 0 ;
while ( fgets ( buffer , sizeof ( buffer ) , fp ) ) {
/* trim leading whitespace */
for ( ptr = buffer ; * ptr & & isspace ( ( int ) * ptr ) ; ptr + + ) ;
if ( ! * ptr | | * ptr = = ' # ' )
continue ;
if ( * ptr = = ' \" ' ) {
ptr + + ;
start = ptr ;
while ( * ptr & & * ptr ! = ' \" ' ) {
if ( * ptr = = ' \\ ' )
ptr + + ;
ptr + + ;
}
if ( ! * ptr ) {
fprintf ( stderr , " Formatting error : "
" No terminating quote \n " ) ;
return 0 ;
}
2010-04-21 12:01:51 +04:00
rx [ nr ] = dm_malloc ( ( ptr - start ) + 1 ) ;
2001-10-19 18:36:57 +04:00
strncpy ( rx [ nr ] , start , ptr - start ) ;
rx [ nr ] [ ptr - start ] = ' \0 ' ;
nr + + ;
} else {
fprintf ( stderr , " %s " , ptr ) ;
fprintf ( stderr , " Formatting error : \" <regex> \" "
" <token_name> \n " ) ;
return 0 ;
}
}
* regex = rx ;
* nregex = nr ;
return 1 ;
}
static void _free_regex ( char * * regex , int nregex )
{
int i ;
for ( i = 0 ; i < nregex ; i + + )
2010-04-21 12:01:51 +04:00
dm_free ( regex [ i ] ) ;
2001-10-19 18:36:57 +04:00
2010-04-21 12:01:51 +04:00
dm_free ( regex ) ;
2001-10-19 18:36:57 +04:00
}
2010-04-21 12:01:51 +04:00
static void _scan_input ( struct dm_regex * m , char * * regex )
2001-10-19 18:36:57 +04:00
{
char buffer [ 256 ] , * ptr ;
int r ;
while ( fgets ( buffer , sizeof ( buffer ) , stdin ) ) {
if ( ( ptr = strchr ( buffer , ' \n ' ) ) )
* ptr = ' \0 ' ;
2010-04-21 12:01:51 +04:00
r = dm_regex_match ( m , buffer ) ;
2001-10-19 18:36:57 +04:00
if ( r > = 0 )
printf ( " %s : %s \n " , buffer , regex [ r ] ) ;
}
}
int main ( int argc , char * * argv )
{
2005-10-17 03:03:59 +04:00
struct dm_pool * mem ;
2010-04-21 12:01:51 +04:00
struct dm_regex * scanner ;
2001-10-19 18:36:57 +04:00
char * * regex ;
int nregex ;
2010-04-21 12:01:51 +04:00
int ret = 0 ;
2010-08-09 14:23:54 +04:00
int want_finger_print = 0 , i ;
const char * pattern_file = NULL ;
2001-10-19 18:36:57 +04:00
2010-08-09 14:23:54 +04:00
for ( i = 1 ; i < argc ; i + + )
if ( ! strcmp ( argv [ i ] , " --fingerprint " ) )
want_finger_print = 1 ;
else
pattern_file = argv [ i ] ;
if ( ! pattern_file ) {
fprintf ( stderr , " Usage : %s [--fingerprint] <pattern_file> \n " , argv [ 0 ] ) ;
2001-10-19 18:36:57 +04:00
exit ( 1 ) ;
}
2010-04-21 12:01:51 +04:00
dm_log_init_verbose ( _LOG_DEBUG ) ;
2001-10-19 18:36:57 +04:00
2010-04-21 12:01:51 +04:00
if ( ! ( mem = dm_pool_create ( " match_regex " , 10 * 1024 ) ) ) {
2001-10-19 18:36:57 +04:00
fprintf ( stderr , " Couldn't create pool \n " ) ;
2010-04-21 12:01:51 +04:00
ret = 2 ;
goto err ;
2001-10-19 18:36:57 +04:00
}
2010-08-09 14:23:54 +04:00
if ( ! _read_spec ( pattern_file , & regex , & nregex ) ) {
2001-10-19 18:36:57 +04:00
fprintf ( stderr , " Couldn't read the lex specification \n " ) ;
2010-04-21 12:01:51 +04:00
ret = 3 ;
goto err ;
2001-10-19 18:36:57 +04:00
}
2010-04-21 12:01:51 +04:00
if ( ! ( scanner = dm_regex_create ( mem , ( const char * * ) regex , nregex ) ) ) {
2001-10-19 18:36:57 +04:00
fprintf ( stderr , " Couldn't build the lexer \n " ) ;
2010-04-21 12:01:51 +04:00
ret = 4 ;
goto err ;
2001-10-19 18:36:57 +04:00
}
2010-08-09 14:23:54 +04:00
if ( want_finger_print )
printf ( " fingerprint: %x \n " , dm_regex_fingerprint ( scanner ) ) ;
2001-10-19 18:36:57 +04:00
_scan_input ( scanner , regex ) ;
_free_regex ( regex , nregex ) ;
2010-04-21 12:01:51 +04:00
err :
2005-10-17 03:03:59 +04:00
dm_pool_destroy ( mem ) ;
2001-10-19 18:36:57 +04:00
2010-04-21 12:01:51 +04:00
return ret ;
2001-10-19 18:36:57 +04:00
}