BSD 3 development
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Tue, 13 Feb 1979 07:16:12 +0000 (23:16 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Tue, 13 Feb 1979 07:16:12 +0000 (23:16 -0800)
Work on file usr/src/cmd/strings.c

Synthesized-from: 3bsd

usr/src/cmd/strings.c [new file with mode: 0644]

diff --git a/usr/src/cmd/strings.c b/usr/src/cmd/strings.c
new file mode 100644 (file)
index 0000000..9bb8c26
--- /dev/null
@@ -0,0 +1,143 @@
+#include <stdio.h>
+#include <a.out.h>
+#include <ctype.h>
+
+long   ftell();
+
+/*
+ * Strings - extract strings from an object file for whatever
+ *
+ * Bill Joy UCB 
+ * April 22, 1978
+ *
+ * The algorithm is to look for sequences of "non-junk" characters
+ * The variable "minlen" is the minimum length string printed.
+ * This helps get rid of garbage.
+ * Default minimum string length is 4 characters.
+ */
+
+struct exec header;
+
+char   *infile = "Standard input";
+int    oflg;
+int    asdata;
+long   offset;
+int    minlength = 4;
+
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+
+       argc--, argv++;
+       while (argc > 0 && argv[0][0] == '-') {
+               register int i;
+               if (argv[0][1] == 0)
+                       asdata++;
+               else for (i = 1; argv[0][i] != 0; i++) switch (argv[0][i]) {
+
+               case 'o':
+                       oflg++;
+                       break;
+
+               case 'a':
+                       asdata++;
+                       break;
+
+               default:
+                       if (!isdigit(argv[0][i])) {
+                               fprintf(stderr, "Usage: strings [ - ] [ -o ] [ -# ] [ file ... ]\n");
+                               exit(1);
+                       }
+                       minlength = argv[0][i] - '0';
+                       for (i++; isdigit(argv[0][i]); i++)
+                               minlength = minlength * 10 + argv[0][i] - '0';
+                       i--;
+                       break;
+               }
+               argc--, argv++;
+       }
+       do {
+               if (argc > 0) {
+                       if (freopen(argv[0], "r", stdin) == NULL) {
+                               perror(argv[0]);
+                               exit(1);
+                       }
+                       infile = argv[0];
+                       argc--, argv++;
+               }
+               fseek(stdin, (long) 0, 0);
+               if (asdata ||
+                   fread((char *)&header, sizeof header, 1, stdin) != 1 || 
+                   !ismagic(header.a_magic)) {
+                       fseek(stdin, (long) 0, 0);
+                       find((long) 100000000L);
+                       continue;
+               }
+               fseek(stdin, (long) header.a_text, 1);
+               find((long) header.a_data);
+       } while (argc > 0);
+}
+
+find(cnt)
+       long cnt;
+{
+       static char buf[BUFSIZ];
+       register char *cp;
+       register int c, cc;
+
+       cp = buf, cc = 0;
+       for (; cnt != 0; cnt--) {
+               c = getc(stdin);
+               if (c == '\n' || dirt(c) || cnt == 0) {
+                       if (cp > buf && cp[-1] == '\n')
+                               --cp;
+                       *cp++ = 0;
+                       if (cp > &buf[minlength]) {
+                               if (oflg)
+                                       printf("%7D ", ftell(stdin) - cc - 1);
+                               printf("%s\n", buf);
+                       }
+                       cp = buf, cc = 0;
+               } else {
+                       if (cp < &buf[sizeof buf - 2])
+                               *cp++ = c;
+                       cc++;
+               }
+               if (ferror(stdin) || feof(stdin))
+                       break;
+       }
+}
+
+dirt(c)
+       int c;
+{
+
+       switch (c) {
+
+       case '\n':
+       case '\f':
+               return (0);
+
+       case 0177:
+               return (1);
+
+       default:
+               return (c > 0200 || c < ' ');
+       }
+}
+
+ismagic(a)
+       int a;
+{
+
+       switch (a) {
+
+       case A_MAGIC1:
+       case A_MAGIC2:
+       case A_MAGIC3:
+       case A_MAGIC4:
+               return (1);
+       }
+       return (0);
+}