X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=tickmarks.c;h=808de676e758120ca6531f9d1328871ef4d9b402;hp=52fd556817a8102ef95d8d74a21a89db5d17a6a4;hb=e97412c38bedc4f365bdf4abe1ff8f6694587a86;hpb=1e1ffcc41c12011f665d8f962d0d387305e32522 diff --git a/tickmarks.c b/tickmarks.c index 52fd5568..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 @@ -39,47 +39,56 @@ static double nicenum(double x, int round) return 10.0 * pow(10.0, exp); } -static void shorten(struct tickmark *tm, int nticks) +static void shorten(struct tickmark *tm, int nticks, int *power_of_ten, + int use_KMG_symbols, int base_offset) { - int i, l, minshorten, can_shorten_by; + 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) { - can_shorten_by = 9; - shorten_char = 'G'; + *power_of_ten = 9; + shorten_idx = 3; } else if (6 < minshorten && l > 6 && strcmp(&str[l - 6], "000000") == 0) { - can_shorten_by = 6; - shorten_char = 'M'; + *power_of_ten = 6; + shorten_idx = 2; } else if (l > 3 && strcmp(&str[l - 3], "000") == 0) { - can_shorten_by = 3; - shorten_char = 'K'; + *power_of_ten = 3; + shorten_idx = 1; } else { - can_shorten_by = 0; + *power_of_ten = 0; } - if (can_shorten_by < minshorten) - minshorten = can_shorten_by; + 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_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 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; @@ -105,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); + shorten(*tm, i, power_of_ten, use_KMG_symbols, base_offset); return i; } @@ -119,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