From 59e3b2dd5837c850db73ead1e7215f0738124f68 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Mon, 16 May 2011 15:07:18 +0200 Subject: [PATCH] libcollectdclient: Added `lcc_sort_identifiers()'. This function may be used to sort an array of lcc_identifier_t objects. --- src/libcollectdclient/client.c | 60 ++++++++++++++++++++++++++++++++++ src/libcollectdclient/client.h | 3 ++ 2 files changed, 63 insertions(+) diff --git a/src/libcollectdclient/client.c b/src/libcollectdclient/client.c index 3eb0d055..d13decdb 100644 --- a/src/libcollectdclient/client.c +++ b/src/libcollectdclient/client.c @@ -228,6 +228,53 @@ static void lcc_chomp (char *str) /* {{{ */ } } /* }}} void lcc_chomp */ +static int lcc_identifier_cmp (const void *a, const void *b) +{ + const lcc_identifier_t *ident_a, *ident_b; + + int status; + + ident_a = a; + ident_b = b; + + status = strcasecmp (ident_a->host, ident_b->host); + if (status != 0) + return (status); + + status = strcmp (ident_a->plugin, ident_b->plugin); + if (status != 0) + return (status); + + if ((*ident_a->plugin_instance != '\0') || (*ident_b->plugin_instance != '\0')) + { + if (*ident_a->plugin_instance == '\0') + return (-1); + else if (*ident_b->plugin_instance == '\0') + return (1); + + status = strcmp (ident_a->plugin_instance, ident_b->plugin_instance); + if (status != 0) + return (status); + } + + status = strcmp (ident_a->type, ident_b->type); + if (status != 0) + return (status); + + if ((*ident_a->type_instance != '\0') || (*ident_b->type_instance != '\0')) + { + if (*ident_a->type_instance == '\0') + return (-1); + else if (*ident_b->type_instance == '\0') + return (1); + + status = strcmp (ident_a->type_instance, ident_b->type_instance); + if (status != 0) + return (status); + } + return (0); +} /* }}} int lcc_identifier_cmp */ + static void lcc_response_free (lcc_response_t *res) /* {{{ */ { size_t i; @@ -1056,4 +1103,17 @@ int lcc_string_to_identifier (lcc_connection_t *c, /* {{{ */ return (0); } /* }}} int lcc_string_to_identifier */ +int lcc_sort_identifiers (lcc_connection_t *c, /* {{{ */ + lcc_identifier_t *idents, size_t idents_num) +{ + if (idents == NULL) + { + lcc_set_errno (c, EINVAL); + return (-1); + } + + qsort (idents, idents_num, sizeof (*idents), lcc_identifier_cmp); + return (0); +} /* }}} int lcc_sort_identifiers */ + /* vim: set sw=2 sts=2 et fdm=marker : */ diff --git a/src/libcollectdclient/client.h b/src/libcollectdclient/client.h index 99003538..36b1d4d2 100644 --- a/src/libcollectdclient/client.h +++ b/src/libcollectdclient/client.h @@ -116,6 +116,9 @@ int lcc_identifier_to_string (lcc_connection_t *c, int lcc_string_to_identifier (lcc_connection_t *c, lcc_identifier_t *ident, const char *string); +int lcc_sort_identifiers (lcc_connection_t *c, + lcc_identifier_t *idents, size_t idents_num); + LCC_END_DECLS /* vim: set sw=2 sts=2 et : */ -- 2.30.2