#include <assert.h>
#include <stdio.h>
+#include <time.h>
#include "xkbcommon/xkbcommon.h"
+#define BENCHMARK_ITERATIONS 1000
+
static int
-test_rmlvo(const char *rules, const char *model, const char *layout,
- const char *variant, const char *options)
+do_test_rmlvo(const char *rules, const char *model, const char *layout,
+ const char *variant, const char *options, int silent)
{
struct xkb_context *context;
struct xkb_keymap *keymap;
context = xkb_context_new(0);
assert(context);
- fprintf(stderr, "\nCompiling %s %s %s %s %s\n", rmlvo.rules, rmlvo.model,
- rmlvo.layout, rmlvo.variant, rmlvo.options);
+ if (!silent)
+ fprintf(stderr, "Compiling %s %s %s %s %s\n", rules, model, layout,
+ variant, options);
keymap = xkb_map_new_from_names(context, &rmlvo, 0);
if (!keymap) {
return 1;
}
-int
-main(void)
+static int
+test_rmlvo(const char *rules, const char *model, const char *layout,
+ const char *variant, const char *options)
+{
+ return do_test_rmlvo(rules, model, layout, variant, options, 0);
+}
+
+static int
+test_rmlvo_silent(const char *rules, const char *model, const char *layout,
+ const char *variant, const char *options)
+{
+ return do_test_rmlvo(rules, model, layout, variant, options, 1);
+}
+
+static void
+benchmark(void)
+{
+ struct timespec start, stop, elapsed;
+ int i;
+
+ clock_gettime(CLOCK_MONOTONIC, &start);
+ for (i = 0; i < BENCHMARK_ITERATIONS; i++)
+ assert(test_rmlvo_silent("base", "", "us", "", ""));
+ clock_gettime(CLOCK_MONOTONIC, &stop);
+
+ elapsed.tv_sec = stop.tv_sec - start.tv_sec;
+ elapsed.tv_nsec = stop.tv_nsec - start.tv_nsec;
+ if (elapsed.tv_nsec < 0) {
+ elapsed.tv_nsec += 1000000000;
+ elapsed.tv_sec--;
+ }
+
+ fprintf(stderr, "compiled %d keymaps in %ld.%09lds\n",
+ BENCHMARK_ITERATIONS, elapsed.tv_sec, elapsed.tv_nsec);
+}
+
+int main(int argc, char *argv[])
{
assert(test_rmlvo("base", "pc105", "us,il,ru,ca", ",,,multix", "grp:alts_toggle,ctrl:nocaps,compose:rwin"));
assert(test_rmlvo("base", "", "us", "", ""));
assert(!test_rmlvo("base", "pc105", "", "", ""));
assert(!test_rmlvo("badrules", "", "us", "", ""));
- return 0;
+ benchmark();
}