/* * UNG's Not GNU * * Copyright (c) 2011, Jakob Kaivo * * 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 #include #include #include #include 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; }