diff --git a/output/raw.c b/output/raw.c index 7f5d329..854a74a 100644 --- a/output/raw.c +++ b/output/raw.c @@ -1,60 +1,48 @@ #include -#include #include +#define TEN_THSND 10000 +#define BIT_16 16 +#define BIT_8 8 + +#define NORMALIZE_AND_WRITE(type) _NORMALIZE_AND_WRITE(type) +#define _NORMALIZE_AND_WRITE(type) \ + for (int i = 0; i < bars_count; i++) { \ + uint##type##_t f_##type = UINT##type##_MAX; \ + if (f[i] < TEN_THSND) \ + f_##type *= f[i] / TEN_THSND; \ + write(fd, &f_##type, sizeof(uint##type##_t)); \ + } -int print_raw_out(int bars, int fp, int is_bin, int bit_format, int ascii_range, char bar_delim, char frame_delim, int f[200]) { - int i; - - if (is_bin == 1){//binary - if (bit_format == 16 ){//16bit: - - for (i = 0; i < bars; i++) { - uint16_t f16; - if (f[i] > 10000) { - f16 = 65535; - } - else { - f16 = ((float)f[i] / 10000) * 65535; - } - write(fp, &f16,sizeof(uint16_t)); - } - - } else {//8bit: - - for (i = 0; i < bars; i++) { - uint8_t f8; - if (f[i] > 10000) { - f8 = 255; - } - else { - f8 = ((float)f[i] / 10000) * 255; - } - write(fp, &f8,sizeof(uint8_t)); - } - +int print_raw_out(int bars_count, int fd, int is_binary, int bit_format, +int ascii_range, char bar_delim, char frame_delim, const int const f[200]) { + if (is_binary) { + switch (bit_format) { + case BIT_16: + NORMALIZE_AND_WRITE(BIT_16); + break; + case BIT_8: + NORMALIZE_AND_WRITE(BIT_8); + break; } - } else {//ascii: - - for (i = 0; i < bars; i++) { - int f_ranged = ((float)f[i] / 10000) * ascii_range; - if (f_ranged > ascii_range) f_ranged = ascii_range; - - //finding size of number-string in byte - int size; - if (f_ranged != 0) size = floor (log10 (abs (f_ranged))) + 1; - else size = 1; - char barheight[size]; - - sprintf(barheight, "%d", f_ranged); - write(fp, barheight,sizeof(barheight)); - - write(fp, &bar_delim, sizeof(bar_delim)); + } else { // ascii + for (int i = 0; i < bars_count; i++) { + int f_ranged = (f[i] / 10000.0) * ascii_range; + if (f_ranged > ascii_range) + f_ranged = ascii_range; + + // finding size of number-string in byte + int bar_height_size = 2; // a number + \0 + if (f_ranged != 0) + bar_height_size += floor (log10 (f_ranged)); + + char bar_height[bar_height_size]; + snprintf(bar_height, bar_height_size, "%d", f_ranged); + + write(fd, bar_height, bar_height_size - 1); + write(fd, &bar_delim, sizeof(bar_delim)); } - - write(fp, &frame_delim, sizeof(frame_delim)); - + write(fd, &frame_delim, sizeof(frame_delim)); } - return 0; } diff --git a/output/raw.h b/output/raw.h index 02618c1..da6829c 100644 --- a/output/raw.h +++ b/output/raw.h @@ -1 +1,2 @@ -int print_raw_out(int bars, int fp, int is_bin, int bin_datafrom, int ascii_range, char bar_delim, char frame_delim, int f[200]); +int print_raw_out(int bars_count, int fd, int is_binary, int bit_format, + int ascii_range, char bar_delim, char frame_delim, const int const f[200]);