home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / sci / crypt / 7197 / freq.c.Z / freq.c
Encoding:
C/C++ Source or Header  |  1993-01-28  |  1.8 KB  |  79 lines

  1. #include <stdio.h>
  2.  
  3. FILE *my_fopen(file, type)
  4. char *file, *type;
  5. {
  6.   FILE *fp;
  7.  
  8.   if (fp = fopen(file, type))
  9.     return fp;
  10.   (void) fprintf(stderr, "Can't open '%s' for '%s'\n", file, type);
  11.   exit(1);
  12. }
  13.  
  14.  
  15. main(argc, argv)
  16. int argc;
  17. char **argv;
  18. {
  19.   register FILE *inf=((argc > 1) ? my_fopen(argv[1], "rb") : stdin);
  20.   register FILE *outf=((argc > 2) ? my_fopen(argv[2], "w") : stdout);
  21.   unsigned long cnt[256], sum=0, avg, lowthresh, highthresh, lowlim, highlim;
  22.   register unsigned int i;
  23.  
  24.   for (i=0; i<256; i++) cnt[i] = 0L;
  25.  
  26.   while ((i=fgetc(inf)) != EOF)
  27.   {
  28.     ++cnt[i];
  29.   }
  30.  
  31.   for (i=0; i<256; i++) sum += cnt[i];
  32.   avg = sum/256;
  33.  
  34.   if (avg < 50L) 
  35.   {
  36.     lowthresh=avg/2L;
  37.     highthresh = avg + (avg - lowthresh);
  38.     lowlim = lowthresh/2L;
  39.     highlim = highthresh*2L;
  40.   } else if (avg < 200L)
  41.   {
  42.     lowthresh=(85L*avg)/100L;
  43.     highthresh = avg + (avg - lowthresh);
  44.     lowlim = (2L*lowthresh)/3L;
  45.     highlim = (3L*highthresh)/2L;
  46.   }  else if (avg < 1000L)
  47.   {
  48.     lowthresh=(92L*avg)/100L;
  49.     highthresh = avg + (avg - lowthresh);
  50.     lowlim = (3L*lowthresh)/4L;
  51.     highlim = (4L*highthresh)/3L;
  52.   } else if (avg < 10000L)
  53.   {
  54.     lowthresh=(965L*avg)/1000L;
  55.     highthresh = avg + (avg - lowthresh);
  56.     lowlim = (5L*lowthresh)/6L;
  57.     highlim = (6L*highthresh)/5L;
  58.   } else
  59.   {
  60.     lowthresh=(985L*avg)/1000L;
  61.     highthresh = avg + (avg - lowthresh);
  62.     lowlim = (9L*lowthresh)/10L;
  63.     highlim = (10L*highthresh)/9L;
  64.   }
  65.  
  66.   fprintf(outf, "average number of occurances/byte = %10ld.\n", avg);
  67.   for (i=0; i<256; i++)
  68.   {
  69.     if ((cnt[i] < lowthresh) || (cnt[i] > highthresh)) {
  70.       fprintf(outf, "%2.2x %10ld %s\n", i, cnt[i], (cnt[i] < lowthresh) ? "<" : ">");
  71.       if ((cnt[i] < lowlim) || (cnt[i] > highlim))
  72.       {
  73.     fprintf(outf, "%2.2x %10ld GHAAK!\n", i, cnt[i]);
  74.     exit(1);
  75.       }
  76.     }
  77.   }
  78. }
  79.