1 #include <math.h>
2 #include <stdint.h>
3 #include <stdio.h>
4 #include <unistd.h>
5 
6 int16_t buf_16;
7 int8_t buf_8;
8 
print_raw_out(int bars_count,int fd,int is_binary,int bit_format,int ascii_range,char bar_delim,char frame_delim,int const f[200])9 int print_raw_out(int bars_count, int fd, int is_binary, int bit_format, int ascii_range,
10                   char bar_delim, char frame_delim, int const f[200]) {
11     if (is_binary) {
12         for (int i = 0; i < bars_count; i++) {
13             int f_limited = f[i];
14             if (f_limited > (pow(2, bit_format) - 1))
15                 f_limited = pow(2, bit_format) - 1;
16 
17             switch (bit_format) {
18             case 16:
19                 buf_16 = f_limited;
20                 write(fd, &buf_16, sizeof(int16_t));
21                 break;
22             case 8:
23                 buf_8 = f_limited;
24                 write(fd, &buf_8, sizeof(int8_t));
25                 break;
26             }
27         }
28     } else { // ascii
29         for (int i = 0; i < bars_count; i++) {
30             int f_ranged = f[i];
31             if (f_ranged > ascii_range)
32                 f_ranged = ascii_range;
33 
34             // finding size of number-string in byte
35             int bar_height_size = 2; // a number + \0
36             if (f_ranged != 0)
37                 bar_height_size += floor(log10(f_ranged));
38 
39             char bar_height[bar_height_size];
40             snprintf(bar_height, bar_height_size, "%d", f_ranged);
41 
42             write(fd, bar_height, bar_height_size - 1);
43             write(fd, &bar_delim, sizeof(bar_delim));
44         }
45         write(fd, &frame_delim, sizeof(frame_delim));
46     }
47     return 0;
48 }
49