Skip to content

Commit 325176e

Browse files
committed
Add way to reverse input pattern, update README and help output
1 parent 6eb0e47 commit 325176e

File tree

2 files changed

+58
-8
lines changed

2 files changed

+58
-8
lines changed

README

+5-1
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@ curl -L 'https://github.com/tmbinc/bgrep/raw/master/bgrep.c' | gcc -O2 -x c -o $
1010

1111
usage:
1212

13-
bgrep [-B bytes] [-A bytes] [-C bytes] <hex> [<path> [...]]
13+
bgrep [-rehv] [-B bytes] [-A bytes] [-C bytes] <hex> [<path> [...]]
1414

15+
-r: recurse into directories
16+
-e: reverse hex input
1517
-B: bytes_before
1618
-A: bytes_after
1719
-C: bytes_before and bytes_after
20+
-h: print help
21+
-v: print version

bgrep.c

+53-7
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ typedef struct Options {
193193
char* pattern_path;
194194
char* mask_path;
195195
bool recurse;
196+
bool reverse;
196197
} Options;
197198

198199
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, ...)
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

264284
void 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:rehv")) != -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

Comments
 (0)