Files
Compsys-2021-Assignments/A2/histogram.h
Nikolaj 456adc7611 😄
2021-10-26 16:12:26 +02:00

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