about summary refs log tree commit diff
path: root/xe.c
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2017-07-03 11:48:06 +0200
committerLeah Neukirchen <leah@vuxu.org>2017-07-03 11:48:06 +0200
commit99c5a7c96e441f4d336740a2624de072a075c3ae (patch)
tree5477280e7de827157a2b06b06cbaba1f4502c61b /xe.c
parente28e002ebca7b7746cc6a65db84e902634027d40 (diff)
downloadxe-99c5a7c96e441f4d336740a2624de072a075c3ae.tar.gz
xe-99c5a7c96e441f4d336740a2624de072a075c3ae.tar.xz
xe-99c5a7c96e441f4d336740a2624de072a075c3ae.zip
parse_jobs: accept a multiplier on the CPU core number
Diffstat (limited to 'xe.c')
-rw-r--r--xe.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/xe.c b/xe.c
index 2825396..946ec5a 100644
--- a/xe.c
+++ b/xe.c
@@ -240,11 +240,28 @@ parse_jobs(char *s)
 	char *e;
 	int n;
 
-	errno = 0;
-	n = strtol(s, &e, 10);
-	if (errno != 0 || *e) {
-		fprintf(stderr, "xe: can't parse number '%s'.\n", s);
-		exit(1);
+#ifdef _SC_NPROCESSORS_ONLN
+	if (s[strlen(s) - 1] == 'x') {
+		n = (int)sysconf(_SC_NPROCESSORS_ONLN);
+		double d = 0.0;
+		errno = 0;
+		d = strtod(s, &e);
+		if (errno != 0 || *e != 'x' || d <= 0) {
+			fprintf(stderr, "xe: can't parse multiplier '%s'.\n", s);
+			exit(1);
+		}
+		n = (int)(d * n);
+		if (n < 1)
+			n = 1;
+	} else
+#endif
+	{
+		errno = 0;
+		n = strtol(s, &e, 10);
+		if (errno != 0 || *e) {
+			fprintf(stderr, "xe: can't parse number '%s'.\n", s);
+			exit(1);
+		}
 	}
 
 #ifdef _SC_NPROCESSORS_ONLN