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
|
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "util.h"
#define SYSFS_CPU "/sys/devices/system/cpu/cpu"
#define MAXCPUS 1024
unsigned get_ncpus(void)
{
char path[cstrlen(SYSFS_CPU "1024") + 1];
unsigned n;
for (n = 0; n < MAXCPUS; n++) {
snprintf(path, sizeof(path), "%s%u", SYSFS_CPU, n);
if (access(path, F_OK) == -1)
break;
}
return n == 0 ? 1 : n;
}
static void query(const char *prompt, const char *def, char *buf, int len)
{
buf[0] = '\0';
printf("%s [%s]: ", prompt, def);
fflush(stdout);
fgets(buf, len, stdin);
if (buf[0] == '\0' || buf[0] == '\n') {
snprintf(buf, len, "%s", def);
} else if(strchr(buf, '\n')) {
*strchr(buf, '\n') = '\0';
}
}
void ask_string(char *buf, int len, const char *prompt, const char *def)
{
query(prompt, def, buf, len);
}
void ask_num(int *res, int max, const char *prompt, int def)
{
char buf[21], buf2[256];
int num;
snprintf(buf, sizeof(buf), "%i", def);
do {
query(prompt, buf, buf2, sizeof(buf2));
num = atoi(buf2); /* TODO: errors (strtol)*/
} while (num > max);
*res = num;
}
|