@@ -193,6 +193,7 @@ typedef struct Options {
193193 char * pattern_path ;
194194 char * mask_path ;
195195 bool recurse ;
196+ bool reverse ;
196197} Options ;
197198
198199void recurse (const char * path , const unsigned char * value , const unsigned char * mask , int len , const Options * options )
@@ -252,21 +253,40 @@ void die(const char* msg, ...)
252253 exit (1 );
253254}
254255
255- void usage ()
256+ void version ()
256257{
257258 fprintf (stderr , "bgrep version: %s\n" , BGREP_VERSION );
259+ }
260+
261+ void usage (bool extended )
262+ {
263+ version ();
258264 fprintf (stderr , "usage:\n" );
259- fprintf (stderr , " %s [-r] [-B bytes] [-A bytes] [-C bytes] <hex> [<path> [...]]\n" , * original_argv );
260- fprintf (stderr , " %s [-r] -f <pattern> [-m <mask>] [<path> [...]]\n" , * original_argv );
261- exit (1 );
265+ fprintf (stderr , "\t%s [-rehv] [-B bytes] [-A bytes] [-C bytes] <hex> [<path> [...]]\n" , * original_argv );
266+ fprintf (stderr , "\t%s [-rehv] -f <pattern> [-m <mask>] [<path> [...]]\n" , * original_argv );
267+ if (extended )
268+ {
269+ fprintf (stderr , "options:\n" );
270+ fprintf (stderr , "\t-r\trecurse into directories\n" );
271+ fprintf (stderr , "\t-e\treverse byte pattern\n" );
272+ fprintf (stderr , "\t-B\tprint number of bytes before result\n" );
273+ fprintf (stderr , "\t-A\tprint number of bytes after result\n" );
274+ fprintf (stderr , "\t-C\tprint number of bytes before and after result\n" );
275+ fprintf (stderr , "\t-f\tpath to pattern file\n" );
276+ fprintf (stderr , "\t-m\tpath to mask file\n" );
277+ fprintf (stderr , "\t-h\tprint this help\n" );
278+ fprintf (stderr , "\t-v\tprint version\n" );
279+ }
280+ else
281+ exit (1 );
262282}
263283
264284void parse_opts (int argc , char * * argv , Options * options )
265285{
266286 int c ;
267287 char * pattern_path , * mask_path ;
268288
269- while ((c = getopt (argc , argv , "A:B:C:f:m:r " )) != -1 )
289+ while ((c = getopt (argc , argv , "A:B:C:f:m:reh;-help;v;-version " )) != -1 )
270290 {
271291 switch (c )
272292 {
@@ -288,8 +308,19 @@ void parse_opts(int argc, char** argv, Options* options)
288308 case 'r' :
289309 options -> recurse = true;
290310 break ;
311+ case 'e' :
312+ options -> reverse = true;
313+ break ;
314+ case 'v' :
315+ version ();
316+ exit (0 );
317+ break ;
318+ case 'h' :
319+ usage (true);
320+ exit (0 );
321+ break ;
291322 default :
292- usage ();
323+ usage (false );
293324 }
294325 }
295326
@@ -383,7 +414,7 @@ int main(int argc, char **argv)
383414 }
384415 } else if (argc == 0 ) {
385416 // a pattern is required.
386- usage ();
417+ usage (false );
387418 } else
388419 {
389420 char * h = * argv ++ ;
@@ -476,6 +507,21 @@ int main(int argc, char **argv)
476507 }
477508 }
478509
510+ if (options .reverse && len > 1 )
511+ {
512+ for (int i = 0 ; i < len / 2 ; ++ i )
513+ {
514+ unsigned char tmp ;
515+ tmp = value [i ];
516+ value [i ] = value [len - i - 1 ];
517+ value [len - i - 1 ] = tmp ;
518+
519+ tmp = mask [i ];
520+ mask [i ] = mask [len - i - 1 ];
521+ mask [len - i - 1 ] = tmp ;
522+ }
523+ }
524+
479525 if (argc == 0 )
480526 searchfile ("stdin" , 0 , value , mask , len );
481527 else
0 commit comments