diff --git a/common/include/ivy/selector.h b/common/include/ivy/selector.h index e5e0651..f3fecae 100644 --- a/common/include/ivy/selector.h +++ b/common/include/ivy/selector.h @@ -1,8 +1,8 @@ #ifndef IVY_SELECTOR_H_ #define IVY_SELECTOR_H_ -#include #include +#include enum ivy_selector_recipient { IVY_SEL_NONE = 0, @@ -27,8 +27,12 @@ IVY_API void ivy_selector_destroy(struct ivy_selector *sel); IVY_API void ivy_selector_set_recipient( struct ivy_selector *sel, enum ivy_selector_recipient r); -IVY_API enum ivy_status ivy_selector_set_name(struct ivy_selector *sel, const char *name); +IVY_API enum ivy_status ivy_selector_set_name( + struct ivy_selector *sel, const char *name); IVY_API enum ivy_status ivy_selector_add_arg( struct ivy_selector *sel, const char *label, const char *name); +IVY_API size_t ivy_selector_to_string( + const struct ivy_selector *sel, char *out, size_t max); + #endif diff --git a/common/selector.c b/common/selector.c index 79ee256..1e8d8ff 100644 --- a/common/selector.c +++ b/common/selector.c @@ -1,6 +1,7 @@ -#include #include +#include #include +#include #include #include @@ -27,13 +28,14 @@ void ivy_selector_destroy(struct ivy_selector *sel) b_queue_iterator it = {0}; b_queue_iterator_begin(&sel->sel_args, &it); while (b_queue_iterator_is_valid(&it)) { - struct ivy_selector_arg *arg = b_unbox(struct ivy_selector_arg, it.entry, arg_entry); + struct ivy_selector_arg *arg + = b_unbox(struct ivy_selector_arg, it.entry, arg_entry); b_queue_iterator_erase(&it); if (arg->arg_label) { free(arg->arg_label); } - + if (arg->arg_name) { free(arg->arg_name); } @@ -87,4 +89,43 @@ enum ivy_status ivy_selector_add_arg( b_queue_push_back(&sel->sel_args, &arg->arg_entry); return IVY_OK; -} \ No newline at end of file +} + +size_t ivy_selector_to_string(const struct ivy_selector *sel, char *out, size_t max) +{ + b_stringstream str; + b_stringstream_begin(&str, out, max); + + switch (sel->sel_recipient) { + case IVY_SEL_OBJECT: + b_stringstream_add(&str, "-"); + break; + case IVY_SEL_CLASS: + b_stringstream_add(&str, "+"); + break; + default: + break; + } + + if (sel->sel_name) { + b_stringstream_add(&str, sel->sel_name); + } + + if (sel->sel_name && !b_queue_empty(&sel->sel_args)) { + b_stringstream_add(&str, "("); + } + + b_queue_iterator it; + b_queue_foreach (&it, &sel->sel_args) { + struct ivy_selector_arg *arg + = b_unbox(struct ivy_selector_arg, it.entry, arg_entry); + b_stringstream_addf( + &str, "%s:", arg->arg_label ? arg->arg_label : "_"); + } + + if (sel->sel_name && !b_queue_empty(&sel->sel_args)) { + b_stringstream_add(&str, ")"); + } + + return b_stringstream_get_length(&str); +}