src/utils_array.[ch]: Implement "array_prepend{,_format}".
[collection4.git] / src / utils_array.c
index 5aaabbc..93e3568 100644 (file)
@@ -12,6 +12,14 @@ struct str_array_s
   size_t size;
 };
 
+static int sort_callback (const void *v0, const void *v1) /* {{{ */
+{
+  const char *c0 = v0;
+  const char *c1 = v1;
+
+  return (strcmp (c0, c1));
+} /* }}} int sort_callback */
+
 str_array_t *array_create (void) /* {{{ */
 {
   str_array_t *a;
@@ -76,6 +84,59 @@ int array_append_format (str_array_t *a, const char *format, ...) /* {{{ */
   return (array_append (a, buffer));
 } /* }}} int array_append_format */
 
+int array_prepend (str_array_t *a, const char *entry) /* {{{ */
+{
+  char **ptr;
+  char *cpy;
+
+  if ((entry == NULL) || (a == NULL))
+    return (EINVAL);
+
+  cpy = strdup (entry);
+  if (cpy == NULL)
+    return (ENOMEM);
+
+  ptr = realloc (a->ptr, sizeof (*a->ptr) * (a->size + 1));
+  if (ptr == NULL)
+  {
+    free (cpy);
+    return (ENOMEM);
+  }
+  a->ptr = ptr;
+
+  memmove (a->ptr, a->ptr + 1, sizeof (*a->ptr) * a->size);
+  a->ptr[0] = cpy;
+  a->size++;
+
+  return (0);
+} /* }}} int array_prepend */
+
+int array_prepend_format (str_array_t *a, const char *format, ...) /* {{{ */
+{
+  char buffer[1024];
+  va_list ap;
+  int status;
+
+  va_start (ap, format);
+  status = vsnprintf (buffer, sizeof (buffer), format, ap);
+  va_end(ap);
+
+  if ((status < 0) || (((size_t) status) >= sizeof (buffer)))
+    return (ENOMEM);
+
+  return (array_prepend (a, buffer));
+} /* }}} int array_prepend_format */
+
+int array_sort (str_array_t *a) /* {{{ */
+{
+  if (a == NULL)
+    return (EINVAL);
+
+  qsort (a->ptr, a->size, sizeof (*a->ptr), sort_callback);
+
+  return (0);
+} /* }}} int array_sort */
+
 int array_argc (str_array_t *a) /* {{{ */
 {
   if (a == NULL)