From: Florian Forster Date: Fri, 2 Jul 2010 17:31:37 +0000 (+0200) Subject: src/utils_array.[ch]: Implement "array_prepend{,_format}". X-Git-Tag: v4.0.0~166 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=425fad0d0ed5df28fa6876086cab68eb6b4036ff;p=collection4.git src/utils_array.[ch]: Implement "array_prepend{,_format}". --- diff --git a/src/utils_array.c b/src/utils_array.c index e7ac51e..93e3568 100644 --- a/src/utils_array.c +++ b/src/utils_array.c @@ -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) diff --git a/src/utils_array.h b/src/utils_array.h index 141dbaa..53670c5 100644 --- a/src/utils_array.h +++ b/src/utils_array.h @@ -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 *);