diff --git a/miscutils/spark.c b/miscutils/spark.c index 37e49b6..963fc72 100644 --- a/miscutils/spark.c +++ b/miscutils/spark.c @@ -4,75 +4,78 @@ #include #include -long parse_long(const char *str) { - long val; +int parse_long(const char *str, long *res) { char *ptr; - val = strtol(str, &ptr, 0); - if (*ptr || val == 0) - return 1; + *res = strtol(str, &ptr, 0); + if (*ptr) + return 0; - return val; + return 1; } -void print(long diff, long val, long min) { +void print(long diff, char *str, long min) { + long val = 0; + if (!parse_long(str, &val)) + return; + + val -= min; putchar('\xe2'); putchar('\x96'); - putchar('\x82' + round(val - min - 1) / diff * 7); + putchar('\x81' + round(val) / diff * 7); } int main(int argc, char **argv) { - unsigned int r_flag = 0; - char ret = '\n'; - - int opt; - while ((opt = getopt(argc, argv, "nr")) != -1) { - switch (opt) { - case 'r': - r_flag = 1; - break; - - case 'n': - ret = '\r'; - break; - - default: - printf("spark [val1 val2...]\n\t[-n Use \\r] [-r Reverse args]\n"); - return 0; - } - } - - argv += optind; - argc -= optind; - - if (argc == 0) { + if (argc == 1) { fprintf(stderr, "spark: missing operands\n"); return 1; } + unsigned int r_flag = 0; + char ret = '\n'; + long min = 0; long max = 0; for (int i = 1; i < argc; i++) { - long val = parse_long(argv[i]); - if (val > max) - max = val; + long val = 0; + if (parse_long(argv[i], &val)) { + if (val > max) + max = val; - else if (val < min) - min = val; + else if (val < min) + min = val; + } + + else if (!strcmp(argv[i], "-r")) { + r_flag = 1; + argv++; + argc--; + } + + else if (!strcmp(argv[i], "-n")) { + ret = '\r'; + argv++; + argc--; + } + + else { + printf("spark [num1 num2...]\n\t[-n Use \\r] [-r Reverse]\n"); + return 0; + } } - long diff = max - min - 1; + long diff = max - min; if (diff < 1) diff = 1; if (r_flag) - for (int i = argc - 1; i >= 0; i--) - print(diff, parse_long(argv[i]), min); + for (int i = argc - 1; i >= 1; i--) + print(diff, argv[i], min); else - for (int i = 0; i < argc; i++) - print(diff, parse_long(argv[i]), min); + for (int i = 1; i < argc; i++) + print(diff, argv[i], min); putchar(ret); return 0;