summaryrefslogtreecommitdiff
path: root/util.c
blob: 0e5825a2e9835d8a3313c6c30c13e6d275d762df (plain)
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;
}
© All Rights Reserved