81 lines
1.3 KiB
C
81 lines
1.3 KiB
C
#include <stdio.h>
|
|
#include <float.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <math.h>
|
|
|
|
int parse_double(const char *str, double *res) {
|
|
char *ptr;
|
|
|
|
*res = strtod(str, &ptr);
|
|
if (*ptr)
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
void print(double diff, char *str, double min) {
|
|
double val = 0;
|
|
if (!parse_double(str, &val))
|
|
return;
|
|
|
|
putchar('\xe2');
|
|
putchar('\x96');
|
|
putchar('\x81' + (int)round((val - min + 1) / diff * 7));
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
if (argc == 1) {
|
|
fprintf(stderr, "spark: missing operands\n");
|
|
return 1;
|
|
}
|
|
|
|
unsigned int r_flag = 0;
|
|
char ret = '\n';
|
|
|
|
double min = DBL_MAX;
|
|
double max = DBL_MIN;
|
|
|
|
/* Remove programm name */
|
|
argv++;
|
|
argc--;
|
|
|
|
for (int i = 0; i < argc; i++) {
|
|
double val = 0;
|
|
if (strstr(argv[i], "r"))
|
|
r_flag = 1;
|
|
|
|
else if (strstr(argv[i], "n"))
|
|
ret = '\r';
|
|
|
|
else if (parse_double(argv[i], &val)) {
|
|
if (val > max)
|
|
max = val;
|
|
|
|
if (val < min)
|
|
min = val;
|
|
}
|
|
|
|
else {
|
|
printf("spark [num1 num2...]\n\t[-n Use \\r] [-r Reverse]\n");
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
double diff = max - min + 1;
|
|
if (diff < 1)
|
|
diff = 1;
|
|
|
|
if (r_flag)
|
|
for (int i = argc - 1; i >= 0; i--)
|
|
print(diff, argv[i], min);
|
|
|
|
else
|
|
for (int i = 0; i < argc; i++)
|
|
print(diff, argv[i], min);
|
|
|
|
putchar(ret);
|
|
return 0;
|
|
}
|