/*
cLIeNUX tally NAME tally - count occurances of each possible byte value in files DESCRIPTION Handy for designing keymaps, possibly for other investigations. tally runs pretty quickly. What tally does is very simple and easy for a computer. Note that tally itself doesn't uncompress or unarchive. All args to tally are files to be processed. Shell expansion applies. Output is to stdout. This first version doesn't use stdin. So-o, can be used with advantage like... tally hello.c tally `find . -name "*.[ch]" ` | sort -nr |less et cetera. The tab-delimited fields in tally's output are... occurances count, which byte #, byte as ASCII, percentage ...which facilitates sorting by prevalence. SEE ALSO; ascii, wc BUGS see below */ /* from see open */ #include#include #include #include int i, j, fd, errno, /* phonetic past tense of read */ red; long count[256]; char buffer[4096]; /* I get the impression Linux likes this size */ float total; void report(){ /* output results to stdout (i.e. print) */ for (i = 0; i < 256 ; i++) /* one-liner loop for a total */ total = total + (float)count[i]; for (i = 0; i < 256 ; i++) /* for each possible byte value */ { printf ( "%d\t%d\t" , count[i], i ); if ( isprint(i)) /* output ASCII or unprintables as [number] */ { printf ( "%c\t", i ); } else { printf("[%d]\t", i); } printf("%2.2f %%", ( (float) count[i] / total ) * 100.0 ); printf("\n"); } } int main (int argc, char *argv[]) /* program starts running here. */ { for ( i = 1 ; i < argc ; i++) /* all args are files, no switches */ { fd = open( argv[i], O_RDONLY ); red = -2 ; while ( red ) /* buffer IO sans libc. pththtp */ { red = read(fd, buffer, 4096); if ( red == -1 ) break ; for (j = 0 ; j < red ; j++) count[buffer[j]]++ ; /* the crux of the biscuit, increment a byte's count */ } } /* end files loop */ report(); /* output results to stdout */ return 0; /* turn off some compiler warning noise */ } /* end of main, end of program code RIGHTS Copyright 1999 Richard Allen Hohensee This file and the tally executable are released for redistribution only as part of an intact entire cLIeNUX Core. */