@@ -193,6 +193,7 @@ typedef struct Options {
193
193
char * pattern_path ;
194
194
char * mask_path ;
195
195
bool recurse ;
196
+ bool reverse ;
196
197
} Options ;
197
198
198
199
void 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, ...)
252
253
exit (1 );
253
254
}
254
255
255
- void usage ()
256
+ void version ()
256
257
{
257
258
fprintf (stderr , "bgrep version: %s\n" , BGREP_VERSION );
259
+ }
260
+
261
+ void usage (bool extended )
262
+ {
263
+ version ();
258
264
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 );
262
282
}
263
283
264
284
void parse_opts (int argc , char * * argv , Options * options )
265
285
{
266
286
int c ;
267
287
char * pattern_path , * mask_path ;
268
288
269
- while ((c = getopt (argc , argv , "A:B:C:f:m:r " )) != -1 )
289
+ while ((c = getopt (argc , argv , "A:B:C:f:m:rehv " )) != -1 )
270
290
{
271
291
switch (c )
272
292
{
@@ -288,8 +308,19 @@ void parse_opts(int argc, char** argv, Options* options)
288
308
case 'r' :
289
309
options -> recurse = true;
290
310
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 ;
291
322
default :
292
- usage ();
323
+ usage (false );
293
324
}
294
325
}
295
326
@@ -383,7 +414,7 @@ int main(int argc, char **argv)
383
414
}
384
415
} else if (argc == 0 ) {
385
416
// a pattern is required.
386
- usage ();
417
+ usage (false );
387
418
} else
388
419
{
389
420
char * h = * argv ++ ;
@@ -476,6 +507,21 @@ int main(int argc, char **argv)
476
507
}
477
508
}
478
509
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
+
479
525
if (argc == 0 )
480
526
searchfile ("stdin" , 0 , value , mask , len );
481
527
else
0 commit comments