diff options
author | Jakob Kaivo <jkk@ung.org> | 2019-03-13 21:51:07 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2019-03-13 21:51:07 -0400 |
commit | 27388f7bd90d0cc15164d6a0da4ad5c07b3b01bc (patch) | |
tree | 8573fa1c6947fc30838477ac37481472e639a9bc |
migrate to gitlab
-rw-r--r-- | strings.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/strings.c b/strings.c new file mode 100644 index 0000000..bc2f4a3 --- /dev/null +++ b/strings.c @@ -0,0 +1,116 @@ +/* + * UNG's Not GNU + * + * Copyright (c) 2011, Jakob Kaivo <jakob@kaivo.net> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> +#include <getopt.h> + +const char *strings_desc = "find printable strings in files"; +const char *strings_inv = "strings [-a] [-t format] -[n number] [file...]"; + +static int strings (FILE *f, int number, char format) +{ + char buf[BUFSIZ]; + char tbuf[BUFSIZ]; + int nread; + int offset = 0; + int i; + int count = 0; + + while (!feof (f)) { + nread = fread (buf, sizeof(char), BUFSIZ, f); + for (i = 0; i < nread; i++) { + if (buf[i] == '\0' || buf[i] == '\n') { + if (count >= number) { + switch (format) { + case 'd': + printf ("%d ", offset - count); + break; + case 'o': + printf ("%o ", offset - count); + break; + case 'x': + printf ("%x ", offset - count); + break; + default: + break; + } + fwrite (tbuf, sizeof(char), count, stdout); + putchar ('\n'); + } + count = 0; + } else if (isprint(buf[i])) { + tbuf[count] = buf[i]; + count++; + } else { + count = 0; + } + offset++; + } + } + return 0; +} + +int +main(int argc, char **argv) +{ + int c; + int number = 4; + char format = 0; + char *end; + + while ((c = getopt (argc, argv, ":an:t:")) != -1) { + switch (c) { + case 'a': + // Always scan the entire file + break; + case 'n': + number = strtol (optarg, &end, 10); + if (end != NULL && strlen (end) > 0) + return 1; + break; + case 't': + if (strlen(optarg) != 1) + return 1; + format = optarg[0]; + break; + default: + return 1; + } + } + + if ((format != 0 && format != 'd' && format != 'o' && format != 'x') + || number < 1) + return 1; + + if (optind >= argc) { + strings (stdin, number, format); + } + + while (optind < argc) { + FILE *f = fopen (argv[optind], "r"); + strings (f, number, format); + fclose (f); + optind++; + } + + return 0; +} |