tholm@uvicctr.UUCP (Terrence W. Holm) (05/05/88)
EFTH Minix report #1 - May 1988 - strings(1)
This is an implementation of strings(1) that we
wrote for Minix. Please consider this a public
domain program. If you can't think of a use for
this program now, we believe you will - some day :-)
A "man" page is included.
[Note: we are using "gres" in our shar files.]
echo x - strings.1
gres '^X' '' > strings.1 << '/'
XNAME
X strings(1) - find printable strings in a file
X
XSYNOPSIS
X strings [ -o ] [ -number ] [ file ]
X
XDESCRIPTION
X The "file", or standard input if "file" is not specified,
X is scanned for possible character strings. A "string" is
X a sequence of 4 or more printable ASCII characters followed
X by a '\0', '\n' or '\r'.
X
X This information might be useful for identifying an object
X file.
X
XOPTIONS
X -o Also display the character offset of the start
X of the string from the beginning of the file.
X Thus, the first character of the file is at
X offset zero (0). The offset is printed in decimal.
X
X -number Minimum sequence length which is considered a
X string (the default is 4). Note that the program
X truncates all strings over 78 characters, to
X aid readability of the output.
X
XSEE ALSO
X od(1)
/
echo x - strings.c
gres '^X' '' > strings.c << '/'
X/****************************************************************/
X/* */
X/* strings.c */
X/* */
X/* Find printable strings in a file. */
X/* This is the code for strings(1). */
X/* */
X/****************************************************************/
X/* origination 1988-Apr-14 T. Holm */
X/****************************************************************/
X
X
X
X
X/****************************************************************/
X/* */
X/* */
X/* Usage: strings [ -o ] [ -number ] [ file ] */
X/* */
X/* */
X/* The "file", or standard input if "file" is not specified, */
X/* is scanned for possible character strings. A "string" is */
X/* a sequence of 4 or more printable ASCII characters followed */
X/* by a '\0', '\n' or '\r'. */
X/* */
X/* */
X/* -o Also display the character offset of the start */
X/* of the string from the beginning of the file, */
X/* in decimal. */
X/* */
X/* -number Minimum sequence length which is considered a */
X/* string (the default is 4). */
X/* */
X/* */
X/****************************************************************/
X
X
X
X
X#include <stdio.h>
X
X
X#define FALSE 0
X#define TRUE 1
X#define MAX_STRING_LENGTH 78
X
X
X
X
X
Xmain( argc, argv )
X int argc;
X char *argv[];
X
X {
X char *my_name = argv[0]; /* The name of this program */
X
X char echo_position = FALSE; /* "-o" means echo where found */
X long position = 0; /* Where string was found */
X
X int string_size = 4; /* "-#" sets minimum string size */
X int count = 0; /* Size of string so far */
X
X char string[MAX_STRING_LENGTH]; /* A possible printable string */
X int c;
X
X
X
X /******** Parse the arguments ********/
X
X --argc;
X ++argv;
X
X
X if ( argc > 0 && strcmp( argv[0], "-o" ) == 0 )
X {
X echo_position = TRUE;
X
X --argc;
X ++argv;
X }
X
X
X if ( argc > 0 && *argv[0] == '-' )
X {
X string_size = atoi( argv[0]+1 );
X
X if ( string_size <= 0 )
X string_size = 1;
X
X --argc;
X ++argv;
X }
X
X
X if ( argc > 0 )
X {
X if( (freopen( argv[0], "r", stdin )) == NULL )
X {
X fprintf( stderr, "%s: Can not open file \"%s\"\n", my_name, argv[0] );
X exit( 1 );
X }
X
X --argc;
X ++argv;
X }
X
X
X if ( argc > 0 )
X {
X fprintf( stderr, "Usage: %s [ -o ] [ -number ] [ file ]\n", my_name );
X exit( 1 );
X }
X
X
X
X
X /******** The main loop ********/
X
X
X while( (c=getchar()) != EOF )
X {
X ++position;
X
X
X if ( c == '\0' || c == '\n' || c == '\r' )
X {
X /* Found the end of a printable string */
X
X if ( count >= string_size )
X Print( string, count, echo_position, position - 1 - count );
X
X count = 0;
X }
X
X
X else if ( c >= ' ' && c < '\177' || c == '\t' )
X {
X /* Append another printable character to the string */
X
X string[count] = c;
X ++count;
X
X if ( count == MAX_STRING_LENGTH )
X {
X Print( string, count, echo_position, position - count );
X count = 0;
X }
X }
X
X
X else /* Not a printable character */
X count = 0;
X
X } /* end while(getchar()) */
X
X exit( 0 );
X }
X
X
X
X
X
X
X
X
X/****************************************************************/
X/* */
X/* Print( string, count, echo_position, position ) */
X/* */
X/* If "echo_position" is TRUE then output the */
X/* "position" in the file. "count" printable */
X/* characters in "string" are output. */
X/* */
X/****************************************************************/
X
X
XPrint( string, count, echo_position, position )
X char string[];
X int count;
X char echo_position;
X long position;
X
X {
X if ( echo_position )
X printf( "%7D ", position );
X
X fwrite( string, 1, count, stdout );
X
X putchar( '\n' );
X }
/