72 lines
1.8 KiB
C
72 lines
1.8 KiB
C
// This header file contains not just function prototypes, but also
|
|
// the definitions. This means it does not need to be compiled
|
|
// separately.
|
|
//
|
|
// You should not need to modify this file.
|
|
|
|
#ifndef HISTOGRAM_H
|
|
#define HISTOGRAM_H
|
|
|
|
// Move the cursor down 'n' lines. Negative 'n' supported.
|
|
static void move_lines(int n) {
|
|
if (n < 0) {
|
|
printf("\033[%dA", -n);
|
|
} else {
|
|
printf("\033[%dB", n);
|
|
}
|
|
}
|
|
|
|
// Clear from cursor to end of line.
|
|
static void clear_line() {
|
|
printf("\033[K");
|
|
}
|
|
|
|
// Print a visual representation of a histogram to the screen. After
|
|
// printing, the cursor is moved back to the beginning of the output.
|
|
// This means that next time print_histogram() is called, the previous
|
|
// output will be overwritten.
|
|
static void print_histogram(int histogram[8]) {
|
|
int64_t bits_seen = 0;
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
bits_seen += histogram[i];
|
|
}
|
|
|
|
for (int i = 0; i < 8; i++) {
|
|
clear_line();
|
|
printf("Bit %d: ", i);
|
|
|
|
double proportion = histogram[i] / ((double)bits_seen);
|
|
for (int i = 0; i < 60*proportion; i++) {
|
|
printf("*");
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
clear_line();
|
|
printf("%ld bits processed.\n", (long)bits_seen);
|
|
move_lines(-9);
|
|
}
|
|
|
|
// Merge the former histogram into the latter, setting the former to
|
|
// zero in the process.
|
|
static void merge_histogram(int from[8], int to[8]) {
|
|
for (int i = 0; i < 8; i++) {
|
|
to[i] += from[i];
|
|
from[i] = 0;
|
|
}
|
|
}
|
|
|
|
// Update the histogram with the bits of a byte.
|
|
static void update_histogram(int histogram[8], unsigned char byte) {
|
|
// For all bits in a byte...
|
|
for (int i = 0; i < 8; i++) {
|
|
// count if bit 'i' is set.
|
|
if (byte & (1<<i)) {
|
|
histogram[i]++;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|