/* * strings : display all ascii strings in a file * by Joel Swank August 1988 * Version 1.0 */ #include #include #include #define MAX 80 /* size of string buffer */ #define STRINGSIZE 3 #define MAXSTRINGSIZE MAX-1 #define MINSTRINGSIZE 1 #define STDIN 0 /* file descriptor for stdin */ char buffer[MAX]; int stringsize = STRINGSIZE; int caps = FALSE; /* caps only flag */ int small = FALSE; /* small only flag */ int numerics = FALSE; /* include numerics flag */ FILE *fdopen(); int fileflag = FALSE; /* detect no files - use stdin */ main(argc,argv) int argc; char *argv[]; { register FILE *filep ; register cnt ; /* get command line options */ getcmd(argc, argv); /* get command line filenames */ for (cnt=1; cnt < argc; cnt++) { if (*argv[cnt] != '-') { if ((filep = fopen(argv[cnt], "r")) == NULL) fatal("can't open %s", argv[cnt]) ; printf("FILE: %s\n",argv[cnt]); dofile(filep); fclose(filep); fileflag = TRUE; } } if (!fileflag) /* if no files given, use stdin */ { filep = fdopen(STDIN, "r"); dofile(filep); fclose(filep); } exit(0); } /* * process open file via stream pointer */ dofile(filep) FILE *filep; { register int accept; register int pos = 0; register int chr; while ((chr = getc(filep)) != EOF) { accept = FALSE; /* assume invalid */ /* check all requested characters */ if ((chr <= 'z' && chr >= 'a') && !caps ) accept = TRUE; if ((chr <= 'Z' && chr >= 'A') && !small ) accept = TRUE; if ((chr <= '9' && chr >= '0') && numerics ) accept = TRUE; if (chr == '_') accept = TRUE; if (pos >= MAX-1) accept = FALSE; if (accept) { buffer[pos++] = chr; } else if (pos != 0) { buffer[pos] = '\0'; if (strlen(buffer) >= stringsize) printf("%s\n",buffer); pos = 0; } } } /* * fatal - print standard error msg and halt process */ fatal(ptrn, data1, data2) register char *ptrn, *data1, *data2 ; { printf("ERROR: "); printf(ptrn, data1, data2) ; putchar('\n'); exit(1); } /* * getcmd - get arguments from command line */ getcmd(argc, argv) register argc ; register char *argv[] ; { register cnt ; /* get command options */ for (cnt=1; cnt < argc; cnt++) { if (*argv[cnt] == '-') { switch(argv[cnt][1]) { case 'l': stringsize = atoi(&argv[cnt][2]) ; if (stringsize < MINSTRINGSIZE || stringsize > MAXSTRINGSIZE) fatal("Bad -l value: %s", argv[cnt]) ; break ; case 'c': caps = TRUE; break ; case 's': small = TRUE; break ; case 'n': numerics = TRUE; break ; case '?': /* help option */ usage(); printf(" Strings Ver 1.0 - display ASCII strings from a file.\n"); printf(" Options:\n"); printf(" lnnn - set minimum length of string to display - default 3.\n"); printf(" c - include capital letters only.\n"); printf(" s - include lower case letters only.\n"); printf(" n - include the digits 0 through 9.\n"); printf(" ? - display this list.\n"); exit(0); default: usage(); exit(0); } } } } usage() { printf("usage:strings [-lnnn] [-c] [-s] [-n] [-?] [file ...]\n"); }