X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=tickmarks.c;h=808de676e758120ca6531f9d1328871ef4d9b402;hp=2959f0267ccb6116f1f8726c51c37f93057b9a75;hb=84f1f8658b728955b9853712186b1851d5fe303c;hpb=7175d91deff20b1408450c231b2b445ea28f7f29 diff --git a/tickmarks.c b/tickmarks.c index 2959f026..808de676 100644 --- a/tickmarks.c +++ b/tickmarks.c @@ -3,7 +3,7 @@ #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 @@ -40,27 +40,29 @@ static double nicenum(double x, int round) } static void shorten(struct tickmark *tm, int nticks, int *power_of_ten, - int use_KMG_symbols) + int use_KMG_symbols, int base_offset) { - int i, l, minshorten; + const char shorten_chr[] = { 0, 'K', 'M', 'G', 'P', 'E', 0 }; + int i, l, minshorten, shorten_idx = 0; char *str; - char shorten_char = '?'; 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_char = use_KMG_symbols ? 'G' : '\0'; + shorten_idx = 3; } else if (6 < minshorten && l > 6 && strcmp(&str[l - 6], "000000") == 0) { *power_of_ten = 6; - shorten_char = use_KMG_symbols ? 'M' : '\0'; + shorten_idx = 2; } else if (l > 3 && strcmp(&str[l - 3], "000") == 0) { *power_of_ten = 3; - shorten_char = use_KMG_symbols ? 'K': '\0'; + shorten_idx = 1; } else { *power_of_ten = 0; } @@ -71,17 +73,22 @@ static void shorten(struct tickmark *tm, int nticks, int *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_char; - str[l - minshorten + 1] = '\0'; + 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 *power_of_ten, int use_KMG_symbols, int base_offset) { char str[100]; int nfrac; @@ -107,7 +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); + shorten(*tm, i, power_of_ten, use_KMG_symbols, base_offset); return i; } @@ -121,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