connection, client: Avoid locale-dependent float printing
authorManuel Stoeckl <code@mstoeckl.com>
Sun, 17 Jan 2021 23:02:50 +0000 (18:02 -0500)
committerDaniel Stone <daniels@collabora.com>
Sat, 31 Jul 2021 16:49:54 +0000 (16:49 +0000)
Specifically, in the log formed when WAYLAND_DEBUG is set, this commit
ensures that floating point numbers are formatted using '.' instead of
the locale-specific decimal separator. As the debug logs are not
otherwise localized for end-users, and may be parsed by scripts, it is
better to have consistent output here.

The 24.8 fixed point numbers are now represented with 8 digits after
the decimal, since this is both exact and simpler to compute.

Signed-off-by: Manuel Stoeckl <code@mstoeckl.com>
src/connection.c
src/wayland-client.c

index 91d00c5..fc2c7c2 100644 (file)
@@ -1275,8 +1275,8 @@ wl_closure_print(struct wl_closure *closure, struct wl_object *target,
        clock_gettime(CLOCK_REALTIME, &tp);
        time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000);
 
-       fprintf(stderr, "[%10.3f] %s%s%s@%u.%s(",
-               time / 1000.0,
+       fprintf(stderr, "[%7u.%03u] %s%s%s@%u.%s(",
+               time / 1000, time % 1000,
                discarded ? "discarded " : "",
                send ? " -> " : "",
                target->interface->name, target->id,
@@ -1295,8 +1295,17 @@ wl_closure_print(struct wl_closure *closure, struct wl_object *target,
                        fprintf(stderr, "%d", closure->args[i].i);
                        break;
                case 'f':
-                       fprintf(stderr, "%f",
-                               wl_fixed_to_double(closure->args[i].f));
+                       /* The magic number 390625 is 1e8 / 256 */
+                       if (closure->args[i].f >= 0) {
+                               fprintf(stderr, "%d.%08d",
+                                       closure->args[i].f / 256,
+                                       390625 * (closure->args[i].f % 256));
+                       } else {
+
+                               fprintf(stderr, "-%d.%08d",
+                                       closure->args[i].f / -256,
+                                       -390625 * (closure->args[i].f % 256));
+                       }
                        break;
                case 's':
                        if (closure->args[i].s)
index 3bf659c..34814d4 100644 (file)
@@ -1381,9 +1381,9 @@ queue_event(struct wl_display *display, int len)
                        clock_gettime(CLOCK_REALTIME, &tp);
                        time = (tp.tv_sec * 1000000L) + (tp.tv_nsec / 1000);
 
-                       fprintf(stderr, "[%10.3f] discarded [%s]@%d.[event %d]"
+                       fprintf(stderr, "[%7u.%03u] discarded [%s]@%d.[event %d]"
                                "(%d fd, %d byte)\n",
-                               time / 1000.0,
+                               time / 1000, time % 1000,
                                zombie ? "zombie" : "unknown",
                                id, opcode,
                                num_zombie_fds, size);