spark fix: negative num supp add

This commit is contained in:
Your Name 2023-11-30 14:40:09 +03:00
parent ccd5c7a3f9
commit 257cadf091

View File

@ -4,75 +4,78 @@
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
long parse_long(const char *str) { int parse_long(const char *str, long *res) {
long val;
char *ptr; char *ptr;
val = strtol(str, &ptr, 0); *res = strtol(str, &ptr, 0);
if (*ptr || val == 0) if (*ptr)
return 1; 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('\xe2');
putchar('\x96'); putchar('\x96');
putchar('\x82' + round(val - min - 1) / diff * 7); putchar('\x81' + round(val) / diff * 7);
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
unsigned int r_flag = 0; if (argc == 1) {
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) {
fprintf(stderr, "spark: missing operands\n"); fprintf(stderr, "spark: missing operands\n");
return 1; return 1;
} }
unsigned int r_flag = 0;
char ret = '\n';
long min = 0; long min = 0;
long max = 0; long max = 0;
for (int i = 1; i < argc; i++) { for (int i = 1; i < argc; i++) {
long val = parse_long(argv[i]); long val = 0;
if (val > max) if (parse_long(argv[i], &val)) {
max = val; if (val > max)
max = val;
else if (val < min) else if (val < min)
min = val; 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) if (diff < 1)
diff = 1; diff = 1;
if (r_flag) if (r_flag)
for (int i = argc - 1; i >= 0; i--) for (int i = argc - 1; i >= 1; i--)
print(diff, parse_long(argv[i]), min); print(diff, argv[i], min);
else else
for (int i = 0; i < argc; i++) for (int i = 1; i < argc; i++)
print(diff, parse_long(argv[i]), min); print(diff, argv[i], min);
putchar(ret); putchar(ret);
return 0; return 0;