-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.c
76 lines (62 loc) · 1.45 KB
/
util.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "util.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open_file_readonly(const char *filename)
{
return open(filename, O_RDONLY);
}
int read_fd_to_string(int fd, char *out, int maxbytes)
{
int bytes_read = 0;
int bytes;
while ((bytes = read(fd, out + bytes_read,
maxbytes - bytes_read)) > 0)
bytes_read += bytes;
return bytes_read;
}
int read_file_to_string(const char *filename, char *out, int maxbytes)
{
int fd = open_file_readonly(filename);
int bytes = read_fd_to_string(fd, out, maxbytes);
close(fd);
return bytes;
}
int read_int_from_fd(int fd)
{
char buf[16];
int l = read_fd_to_string(fd, buf, 15);
buf[l] = '\0';
return atoi(buf);
}
unsigned long long read_ull_from_fd(int fd)
{
char buf[24];
int l = read_fd_to_string(fd, buf, 23);
buf[l] = '\0';
return strtoull(buf, NULL, 10);
}
int read_int_from_file(const char *filename)
{
char buf[16];
int l = read_file_to_string(filename, buf, 15);
buf[l] = '\0';
return atoi(buf);
}
void bytes_to_human_readable(unsigned long long bytes, char *out)
{
static const char * const units[] = {
" B", "KiB", "MiB", "GiB", "TiB",
"PiB", "EiB", "ZiB", "YiB"
};
static int units_count = sizeof(units) / sizeof(char *);
int u, d = 0;
for (u = 0; u < units_count && bytes >= 1000; ++u) {
d = ((bytes % 1024) / 1024.0f) * 10;
bytes /= 1024;
}
sprintf(out, "%llu.%d%s", bytes, d, units[u]);
}