libcollectdclient: Added `lcc_sort_identifiers()'.
authorSebastian Harl <sh@tokkee.org>
Mon, 16 May 2011 13:07:18 +0000 (15:07 +0200)
committerSebastian Harl <sh@tokkee.org>
Mon, 16 May 2011 13:07:18 +0000 (15:07 +0200)
This function may be used to sort an array of lcc_identifier_t objects.

src/libcollectdclient/client.c
src/libcollectdclient/client.h

index 3eb0d05..d13decd 100644 (file)
@@ -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 : */
index 9900353..36b1d4d 100644 (file)
@@ -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 : */