commit 7d3531f6c7a304270489d67170110f439c60a7a8
parent a7f23a61c5defbd23d8231dcd3c41ab1c1c39dd3
Author: Plat <plat@stellar-nexus.ru>
Date: Wed, 5 Nov 2025 22:22:04 +0000
Attempt numero 3
Diffstat:
3 files changed, 28 insertions(+), 14 deletions(-)
diff --git a/libutil/estrtod.c b/libutil/estrtod.c
@@ -0,0 +1,18 @@
+/* See LICENSE file for copyright and license details. */
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "../util.h"
+
+double
+estrtod(const char *s)
+{
+ char *end;
+ double d;
+
+ d = strtod(s, &end);
+ if (end == s || *end != '\0')
+ eprintf("%s: not a real number\n", s);
+ return d;
+}
diff --git a/rb.c b/rb.c
@@ -91,18 +91,17 @@ search(Node *root, int val)
}
int
-main(void)
+main(int argc, char *argv)
{
+ argv0 = argv[0];
+ if (argc != 3)
+ usage();
+ unsigned int data_limit = estrtod(argv[1]);
+
Node *root = NULL;
- int data_limit;
- printf("Element count: ");
- if (!scanf("%d", &data_limit)) /* scanf sucks ass */
- eprintf("scanf:");
- if (data_limit <= 0)
- eprintf("scanf sucks ass");
- for (int k = 1; k <= data_limit; ++k) {
+ for (unsigned int k = 1; k <= data_limit; ++k) {
root = add(root, k);
SET_COLOR(root, BLACK);
}
@@ -111,12 +110,7 @@ main(void)
for (search_value = attempt = 0; search_value < 1 || search_value > data_limit; ++attempt) {
if (attempt)
printf("Impossible value\n");
- printf("Value: ");
- if (!scanf("%d", &search_value)) /* scanf sucks ass */
- eprintf("scanf:");
- if (search_value <= 0)
- eprintf("scanf sucks ass");
-
+ search_value = estrtod(argv[2]);
}
Node *s = search(root, search_value);
diff --git a/util.h b/util.h
@@ -20,3 +20,5 @@ char *estrdup(const char *);
void enprintf(int, const char *, ...);
void eprintf(const char *, ...);
void weprintf(const char *, ...);
+
+double estrtod(const char *);