src/utils_array.[ch]: Implement "array_prepend{,_format}".
authorFlorian Forster <ff@octo.it>
Fri, 2 Jul 2010 17:31:37 +0000 (19:31 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Fri, 2 Jul 2010 17:31:37 +0000 (19:31 +0200)
src/utils_array.c
src/utils_array.h

index e7ac51e..93e3568 100644 (file)
@@ -84,6 +84,49 @@ 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)
index 141dbaa..53670c5 100644 (file)
@@ -6,10 +6,15 @@ typedef struct str_array_s str_array_t;
 
 str_array_t *array_create (void);
 void array_destroy (str_array_t *a);
+
 int array_append (str_array_t *a, const char *entry);
 int array_append_format (str_array_t *a, const char *format, ...)
   __attribute__((format(printf,2,3)));
 
+int array_prepend (str_array_t *a, const char *entry);
+int array_prepend_format (str_array_t *a, const char *format, ...)
+  __attribute__((format(printf,2,3)));
+
 int array_sort (str_array_t *a);
 
 int array_argc (str_array_t *);