From 325176e15f97244ac51a24fed319f7a973af86c0 Mon Sep 17 00:00:00 2001 From: Ada Date: Wed, 26 Feb 2025 00:08:43 +0000 Subject: [PATCH] Add way to reverse input pattern, update README and help output --- README | 6 +++++- bgrep.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/README b/README index ab63324..55b88e0 100644 --- a/README +++ b/README @@ -10,8 +10,12 @@ curl -L 'https://github.com/tmbinc/bgrep/raw/master/bgrep.c' | gcc -O2 -x c -o $ usage: -bgrep [-B bytes] [-A bytes] [-C bytes] [ [...]] +bgrep [-rehv] [-B bytes] [-A bytes] [-C bytes] [ [...]] +-r: recurse into directories +-e: reverse hex input -B: bytes_before -A: bytes_after -C: bytes_before and bytes_after +-h: print help +-v: print version diff --git a/bgrep.c b/bgrep.c index b8699ef..697fbfa 100644 --- a/bgrep.c +++ b/bgrep.c @@ -193,6 +193,7 @@ typedef struct Options { char* pattern_path; char* mask_path; bool recurse; + bool reverse; } Options; void recurse(const char *path, const unsigned char *value, const unsigned char *mask, int len, const Options* options) @@ -252,13 +253,32 @@ void die(const char* msg, ...) exit(1); } -void usage() +void version() { fprintf(stderr, "bgrep version: %s\n", BGREP_VERSION); +} + +void usage(bool extended) +{ + version(); fprintf(stderr, "usage:\n"); - fprintf(stderr, " %s [-r] [-B bytes] [-A bytes] [-C bytes] [ [...]]\n", *original_argv); - fprintf(stderr, " %s [-r] -f [-m ] [ [...]]\n", *original_argv); - exit(1); + fprintf(stderr, "\t%s [-rehv] [-B bytes] [-A bytes] [-C bytes] [ [...]]\n", *original_argv); + fprintf(stderr, "\t%s [-rehv] -f [-m ] [ [...]]\n", *original_argv); + if (extended) + { + fprintf(stderr, "options:\n"); + fprintf(stderr, "\t-r\trecurse into directories\n"); + fprintf(stderr, "\t-e\treverse byte pattern\n"); + fprintf(stderr, "\t-B\tprint number of bytes before result\n"); + fprintf(stderr, "\t-A\tprint number of bytes after result\n"); + fprintf(stderr, "\t-C\tprint number of bytes before and after result\n"); + fprintf(stderr, "\t-f\tpath to pattern file\n"); + fprintf(stderr, "\t-m\tpath to mask file\n"); + fprintf(stderr, "\t-h\tprint this help\n"); + fprintf(stderr, "\t-v\tprint version\n"); + } + else + exit(1); } void parse_opts(int argc, char** argv, Options* options) @@ -266,7 +286,7 @@ void parse_opts(int argc, char** argv, Options* options) int c; char* pattern_path, * mask_path; - while ((c = getopt(argc, argv, "A:B:C:f:m:r")) != -1) + while ((c = getopt(argc, argv, "A:B:C:f:m:rehv")) != -1) { switch (c) { @@ -288,8 +308,19 @@ void parse_opts(int argc, char** argv, Options* options) case 'r': options->recurse = true; break; + case 'e': + options->reverse = true; + break; + case 'v': + version(); + exit(0); + break; + case 'h': + usage(true); + exit(0); + break; default: - usage(); + usage(false); } } @@ -383,7 +414,7 @@ int main(int argc, char **argv) } } else if (argc == 0) { // a pattern is required. - usage(); + usage(false); } else { char *h = *argv++; @@ -476,6 +507,21 @@ int main(int argc, char **argv) } } + if (options.reverse && len > 1) + { + for (int i = 0; i < len / 2; ++i) + { + unsigned char tmp; + tmp = value[i]; + value[i] = value[len - i - 1]; + value[len - i - 1] = tmp; + + tmp = mask[i]; + mask[i] = mask[len - i - 1]; + mask[len - i - 1] = tmp; + } + } + if (argc == 0) searchfile("stdin", 0, value, mask, len); else