Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83; site unmvax.UUCP Path: utzoo!watmath!clyde!akgua!mcnc!philabs!cmcl2!lanl-a!unm-cvax!unmvax!lee From: lee@unmvax.UUCP Newsgroups: net.sources Subject: Public domain "strings" command Message-ID: <295@unmvax.UUCP> Date: Sun, 15-Apr-84 03:43:03 EST Article-I.D.: unmvax.295 Posted: Sun Apr 15 03:43:03 1984 Date-Received: Tue, 17-Apr-84 07:00:55 EST Organization: Univ. of New Mexico, Albuquerque Lines: 168 This is a public domain version of the command "strings" available in the Berkeley distributions. It is slightly more intellgent than the aforementioned version. It was written for a friend on a Plexus P-40 running V7. It works on his machine, but how well does Plexus conform to V7? I dunno, that is the only example I have. In the 4.2 man page it says that strings reports addresses in octal. The standard command does not, so this version does not either. Simple change if you want it to though... --Lee (Ward) {ucbvax,gatech,convex}!unmvax!lee To unarchive, remove the first line through and including the dashed line. Then type: % sh ------------------------------------------- : Run this with sh NOT csh! echo extracting strings.l cat << //*FUNKYSTUFF*// > strings.l .TH STRINGS L "14 April 1984" .UC .SH NAME strings \\- find printable strings in an object, or other file .SH SYNOPSIS .B strings [ .B \\- ] [ .B \\-o ] [ \\fB\\-\\fInumber\\fR ] file ... .SH DESCRIPTION .I Strings looks for ascii strings in a binary file. A string is any sequence of 4 or more printing characters ending with a newline or a null. Unless the .B \\- flag is given, .I strings only looks in the initialized data space of object files. If the .B \\-o flag is given, then each string is preceded by its offset in the file (in decimal). If the \\fB\\-\\fInumber\\fR flag is given then number is used as the minimum string length rather than 4. .SH "SEE ALSO" od(1) .SH AUTHOR Lee Ward, University of New Mexico .SH BUGS Though the string algorithm is a bit more intelligent than the Berkeley version, it is still pretty stupid. //*FUNKYSTUFF*// echo extracting strings.c cat << //*FUNKYSTUFF*// > strings.c /* * Public domain strings * * Conforms (closely) to the Berkeley 4.2 BSD manual page. * * Lee Ward * University of New Mexico * 4/14/84 */ # include # include # include /* Is the below right? Oh well.... */ # ifdef V7 # define N_BADMAG(x) !((x).a_magic == A_MAGIC1 || \\ (x).a_magic == A_MAGIC2 || \\ (x).a_magic == A_MAGIC3 || \\ (x).a_magic == A_MAGIC4) # define N_TXTOFF(x) (x).a_magic == A_MAGIC2 || \\ (x).a_magic == A_MAGIC3 ? \\ 8 * 1024 : sizeof(x) # endif int countflag = 0; int dataflag = 0; char *Usgstr = "[-] [-o] [-minlength] file..."; int minlength = 4; extern int errno; main (argc, argv) int argc; char *argv[]; { int x; char *aptr; struct exec exhdr; argv[argc] = NULL; for (x = 1; argc > 1 && *(aptr = argv[x]) == '-'; x++,argc--) { ++aptr; if (*aptr == NULL) dataflag++; else if (*aptr == 'o') countflag++; else if (isdigit(*aptr)) minlength = atoi(aptr); else { fprintf (stderr, "Usage: %s %s\\n", argv[0], Usgstr); exit (1); } } do { if (argc > 1) if (freopen(argv[x++], "r", stdin) == NULL) { perror (argv[x - 1]); exit (errno); } if (!dataflag && fread(&exhdr, sizeof(exhdr), 1, stdin) == 1 && !N_BADMAG(exhdr)) { fseek(stdin, (long )(N_TXTOFF(exhdr) + exhdr.a_text), 0); strings ((long )exhdr.a_data, (long )(N_TXTOFF(exhdr) + exhdr.a_text)); } else { fseek(stdin, 0L, 0); strings (-1L, 0L); } } while (argv[x] != NULL); } strings (count, loc) long count; long loc; { char c, buf[BUFSIZ]; char *bptr; bptr = buf; while (count--) { c = getchar(); loc++; if (c == NULL || c == '\\n' || bptr >= buf + BUFSIZ - 1) { if (bptr - buf > minlength) { *bptr = NULL; if (countflag) printf ("%7D\\t", loc - 1 - (long )( bptr - buf)); printf ("%s\\n", buf); } bptr = buf; } else if (c < 0177 && c >= ' ') *bptr++ = c; else bptr = buf; if (feof(stdin) || ferror(stdin)) break; } } //*FUNKYSTUFF*//