#include "gbos.h" /* strings [-n N] [file]: print runs of N or more printable characters * (default 4). Pairs with xxd now that /bin/ is readable - it is how * you find the text baked into a program image. */ #define MAXRUN 64 void main(void) { char *argv[8]; char run[MAXRUN]; unsigned char argc = argv_parse(argv, 8); char *nv = optval(argv, argc, 'n'); unsigned char min = nv ? atou(nv) : 4; unsigned char len = 0, fd = NOFD, i; char *fname = 0; int ch; if (min == 0) min = 4; if (min > MAXRUN) min = MAXRUN; for (i = 0; i < argc; i++) { if (argv[i][0] == '-') continue; if (nv == argv[i]) continue; fname = argv[i]; break; } if (fname) { fd = open(fname, O_READ); if (fd == EISDIR) { puts("strings: is a directory"); nl(); sexit(2); } if (fd == NOFD) { puts("strings: no such file"); nl(); sexit(2); } } for (;;) { if (fd == NOFD) { char c = readc(); ch = (c == EOF) ? -1 : c; } else ch = fgetc(fd); if (ch >= 32 && ch < 127) { if (len < MAXRUN) run[len++] = (char)ch; continue; } if (len >= min) { writes(run, len); nl(); } /* run ended: keep it? */ len = 0; if (ch < 0) break; } if (len >= min) { writes(run, len); nl(); } if (fd != NOFD) close(fd); }