/* log scale compaction of word frequencies use -lm option when compiling! usage: freq min max any frequencies below min are threshholded but any frequencies above max cause an error */ #include static void usage() { fprintf(stderr,"usage: a.out minfreq maxfreq\n"); exit(0); } main(int ac, char **av) { int min, max; double logscale; double logmin; double log(double); int atoi(char *); int c; if (ac != 3) usage(); min = atoi(av[1]); max = atoi(av[2]); if (max <= 0 || (max-min) <= 0) usage(); logmin = log((double)min); logscale = 255/(log((double)max) - logmin); while ((c = getchar()) != EOF) { int n = 0; double x; while ((c = getchar()) != ' ') ; /* skip word itself */ while ((c = getchar()) != '\n') n = (n*10) + (c-'0'); n = (int) (logscale * (log((double)n) - logmin)); if (n > 255) fprintf(stderr,"frequency too large\n"); if (n < 0) n = 0; putchar(n); } }