#include "lib.h"
#include "str.h"
+#include "hash.h"
#include "ioloop.h"
#include "event-exporter.h"
tm->tm_hour, tm->tm_min, tm->tm_sec,
time->tv_usec);
}
+
+HASH_TABLE_DEFINE_TYPE(category_set, void *, const struct event_category *);
+
+static void insert_category(HASH_TABLE_TYPE(category_set) hash,
+ const struct event_category * const cat)
+{
+ /* insert this category (key == the unique internal pointer) */
+ hash_table_update(hash, cat->internal, cat);
+
+ /* insert parent's categories */
+ if (cat->parent != NULL)
+ insert_category(hash, cat->parent);
+}
+
+void event_export_helper_fmt_categories(string_t *dest,
+ struct event_category * const *cats,
+ unsigned int count,
+ void (*append)(string_t *, const char *),
+ const char *separator)
+{
+ HASH_TABLE_TYPE(category_set) hash;
+ struct hash_iterate_context *iter;
+ const struct event_category *cat;
+ void *key ATTR_UNUSED;
+ unsigned int i;
+ bool first = TRUE;
+
+ if (count == 0)
+ return;
+
+ hash_table_create_direct(&hash, pool_datastack_create(),
+ 3 * count /* estimate */);
+
+ /* insert all the categories into the hash table */
+ for (i = 0; i < count; i++)
+ insert_category(hash, cats[i]);
+
+ /* output each category from hash table */
+ iter = hash_table_iterate_init(hash);
+ while (hash_table_iterate(iter, hash, &key, &cat)) {
+ if (!first)
+ str_append(dest, separator);
+
+ append(dest, cat->name);
+
+ first = FALSE;
+ }
+ hash_table_iterate_deinit(&iter);
+
+ hash_table_destroy(&hash);
+}
void event_export_helper_fmt_rfc3339_time(string_t *dest, const struct timeval *time);
/* append a microsecond resolution unix timestamp in seconds (i.e., %u.%06u) */
void event_export_helper_fmt_unix_time(string_t *dest, const struct timeval *time);
+/* append category names using 'append' function pointer, separated by 'separator' arg
+
+ The result has no duplicates regardless of if the array has any or if any
+ of the categories' ancestors are implictly or explicitly duplicated. */
+void event_export_helper_fmt_categories(string_t *dest,
+ struct event_category *const *cats,
+ unsigned int count,
+ void (*append)(string_t *, const char *),
+ const char *separator);
#endif