Avoid large times in chronyc sources / sourcestats overflowing lines

Main trouble was double values too large to be represented as ints being
converted to -INT_MAX and then passing the < 9999 cut.
This commit is contained in:
Håkan Johansson 2010-04-07 14:26:41 +02:00 committed by Miroslav Lichvar
parent 2ea87490f4
commit f9103531c4

View file

@ -1483,21 +1483,26 @@ print_seconds(unsigned long s)
static void
print_nanoseconds(double s)
{
unsigned long ms, ns;
s = fabs(s);
ns = s * 1e9 + 0.5;
ms = s * 1e3 + 0.5;
if (ns <= 9999) {
printf("%4ldns", ns);
} else if (ns <= 9999499) {
printf("%4ldus", (ns + 500) / 1000);
} else if (ms <= 9999) {
printf("%4ldms", ms);
} else if (ms <= 999949) {
printf("%3ld.%01lds", (ms + 50) / 1000, ((ms + 50) / 100) % 10);
if (s < 9999.5e-9) {
printf("%4.0fns", s * 1e9);
} else if (s < 9999.5e-6) {
printf("%4.0fus", s * 1e6);
} else if (s < 9999.5e-3) {
printf("%4.0fms", s * 1e3);
} else if (s < 999.5) {
printf("%5.1fs", s);
} else if (s < 99999.5) {
printf("%5.0fs", s);
} else if (s < 99999.5 * 60) {
printf("%5.0fm", s / 60);
} else if (s < 99999.5 * 3600) {
printf("%5.0fh", s / 3600);
} else if (s < 99999.5 * 3600 * 24) {
printf("%5.0fd", s / (3600 * 24));
} else {
printf("%5lds", (ms + 500) / 1000);
printf("%5.0fy", s / (3600 * 24 * 365));
}
}
@ -1506,26 +1511,40 @@ print_nanoseconds(double s)
static void
print_signed_nanoseconds(double s)
{
long ms, ns, sign;
double x;
if (s >= 0.0) {
ns = s * 1e9 + 0.5;
ms = s * 1e3 + 0.5;
sign = 1;
x = fabs(s);
if (x < 9999.5e-9) {
printf("%+5.0fns", s * 1e9);
} else if (x < 9999.5e-6) {
printf("%+5.0fus", s * 1e6);
} else if (x < 9999.5e-3) {
printf("%+5.0fms", s * 1e3);
} else if (x < 999.5) {
printf("%+6.1fs", s);
} else if (x < 99999.5) {
printf("%+6.0fs", s);
} else if (x < 99999.5 * 60) {
printf("%+6.0fm", s / 60);
} else if (x < 99999.5 * 3600) {
printf("%+6.0fh", s / 3600);
} else if (x < 99999.5 * 3600 * 24) {
printf("%+6.0fd", s / (3600 * 24));
} else {
ns = -s * 1e9 + 0.5;
ms = -s * 1e3 + 0.5;
sign = -1;
printf("%+6.0fy", s / (3600 * 24 * 365));
}
}
if (ns <= 9999) {
printf("%+5ldns", ns * sign);
} else if (ns <= 9999499) {
printf("%+5ldus", (ns + 500) / 1000 * sign);
} else if (ms <= 9999) {
printf("%+5ldms", ms * sign);
/* ================================================== */
static void
print_freq_ppm(double f)
{
if (fabs(f) < 99999.5) {
printf("%10.3f", f);
} else {
printf("%+6lds", (ms + 500) / 1000 * sign);
printf("%10.0f", f);
}
}
@ -1713,7 +1732,11 @@ process_cmd_sourcestats(char *line)
printf("%-25s %2lu %2lu ", hostname_buf, n_samples, n_runs);
print_seconds(span_seconds);
printf(" %10.3f %10.3f ", resid_freq_ppm, skew_ppm);
printf(" ");
print_freq_ppm(resid_freq_ppm);
printf(" ");
print_freq_ppm(skew_ppm);
printf(" ");
print_signed_nanoseconds(est_offset);
printf(" ");
print_nanoseconds(sd);