*
* Enumeration mapping strings (quarks) from/to integers.
*
- * Copyright 2010 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright 2010, 2011 - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
#include <stdint.h>
#include <glib.h>
-GQuark ctf_enum_read(struct stream_pos *pos,
- const struct type_class_enum *src)
+/*
+ * The caller should unref the GArray.
+ */
+GArray *ctf_enum_read(struct stream_pos *pos,
+ const struct declaration_enum *src)
{
- const struct type_class_integer *int_class = &src->p;
+ const struct declaration_integer *integer_declaration = src->integer_declaration;
- if (!int_class->signedness) {
+ if (!integer_declaration->signedness) {
uint64_t v;
- v = ctf_uint_read(pos, int_class);
- return enum_uint_to_quark(src, v);
+ v = ctf_uint_read(pos, integer_declaration);
+ return enum_uint_to_quark_set(src, v);
} else {
int64_t v;
- v = ctf_int_read(pos, int_class);
- return enum_int_to_quark(src, v);
+ v = ctf_int_read(pos, integer_declaration);
+ return enum_int_to_quark_set(src, v);
}
}
+/*
+ * Arbitrarily choose the start of the first matching range.
+ */
void ctf_enum_write(struct stream_pos *pos,
- const struct type_class_enum *dest,
- GQuark q)
+ const struct declaration_enum *dest,
+ GQuark q)
{
- const struct type_class_integer *int_class = &dest->p;
+ const struct declaration_integer *integer_declaration = dest->integer_declaration;
+ GArray *array;
- if (!int_class->signedness) {
- uint64_t v;
+ array = enum_quark_to_range_set(dest, q);
+ assert(array);
- v = enum_quark_to_uint(dest, q);
- ctf_uint_write(pos, int_class, v);
+ if (!integer_declaration->signedness) {
+ uint64_t v = g_array_index(array, struct enum_range, 0).start._unsigned;
+ ctf_uint_write(pos, integer_declaration, v);
} else {
- int64_t v;
-
- v = enum_quark_to_int(dest, q);
- ctf_int_write(pos, int_class, v);
+ int64_t v = g_array_index(array, struct enum_range, 0).start._unsigned;
+ ctf_int_write(pos, integer_declaration, v);
}
}