X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=tickmarks.c;h=808de676e758120ca6531f9d1328871ef4d9b402;hp=7766acd29a6e13af8d795451518383e9aa709408;hb=5c94b00876437a27f1761e47437166780c3c3b93;hpb=af58ef32b7398d791168af54aa4aab0b23192f90 diff --git a/tickmarks.c b/tickmarks.c index 7766acd2..808de676 100644 --- a/tickmarks.c +++ b/tickmarks.c @@ -1,8 +1,9 @@ #include #include #include +#include -/* +/* * adapted from Paul Heckbert's algorithm on p 657-659 of * Andrew S. Glassner's book, "Graphics Gems" * ISBN 0-12-286166-3 @@ -38,7 +39,56 @@ static double nicenum(double x, int round) return 10.0 * pow(10.0, exp); } -int calc_tickmarks(double min, double max, int nticks, struct tickmark **tm) +static void shorten(struct tickmark *tm, int nticks, int *power_of_ten, + int use_KMG_symbols, int base_offset) +{ + const char shorten_chr[] = { 0, 'K', 'M', 'G', 'P', 'E', 0 }; + int i, l, minshorten, shorten_idx = 0; + char *str; + + minshorten = 100; + for (i = 0; i < nticks; i++) { + str = tm[i].string; + l = strlen(str); + + if (strcmp(str, "0") == 0) + continue; + if (l > 9 && strcmp(&str[l - 9], "000000000") == 0) { + *power_of_ten = 9; + shorten_idx = 3; + } else if (6 < minshorten && l > 6 && + strcmp(&str[l - 6], "000000") == 0) { + *power_of_ten = 6; + shorten_idx = 2; + } else if (l > 3 && strcmp(&str[l - 3], "000") == 0) { + *power_of_ten = 3; + shorten_idx = 1; + } else { + *power_of_ten = 0; + } + + if (*power_of_ten < minshorten) + minshorten = *power_of_ten; + } + + if (minshorten == 0) + return; + if (!use_KMG_symbols) + shorten_idx = 0; + else if (base_offset) + shorten_idx += base_offset; + + for (i = 0; i < nticks; i++) { + str = tm[i].string; + l = strlen(str); + str[l - minshorten] = shorten_chr[shorten_idx]; + if (shorten_idx) + str[l - minshorten + 1] = '\0'; + } +} + +int calc_tickmarks(double min, double max, int nticks, struct tickmark **tm, + int *power_of_ten, int use_KMG_symbols, int base_offset) { char str[100]; int nfrac; @@ -64,6 +114,7 @@ int calc_tickmarks(double min, double max, int nticks, struct tickmark **tm) sprintf((*tm)[i].string, str, x); i++; } + shorten(*tm, i, power_of_ten, use_KMG_symbols, base_offset); return i; } @@ -77,20 +128,20 @@ static void test_range(double x, double y) printf("Testing range %g - %g\n", x, y); nticks = calc_tickmarks(x, y, 10, &tm); - for (i = 0; i < nticks; i++) { + for (i = 0; i < nticks; i++) printf(" (%s) %g\n", tm[i].string, tm[i].value); - } + printf("\n\n"); free(tm); } int main(int argc, char *argv[]) { - test_range(0.0005, 0.008); - test_range(0.5, 0.8); - test_range(5.5, 8.8); - test_range(50.5, 80.8); - test_range(-20, 20.8); - test_range(-30, 700.8); + test_range(0.0005, 0.008); + test_range(0.5, 0.8); + test_range(5.5, 8.8); + test_range(50.5, 80.8); + test_range(-20, 20.8); + test_range(-30, 700.8); } #endif