Browse Source

qdevice: Add dynar prepend

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 9 years ago
parent
commit
2f85368bca
5 changed files with 59 additions and 0 deletions
  1. 7 0
      qdevices/dynar-str.c
  2. 2 0
      qdevices/dynar-str.h
  3. 15 0
      qdevices/dynar.c
  4. 2 0
      qdevices/dynar.h
  5. 33 0
      qdevices/test-dynar.c

+ 7 - 0
qdevices/dynar-str.c

@@ -58,6 +58,13 @@ dynar_str_cat(struct dynar *dest, const char *str)
 	return (dynar_cat(dest, str, strlen(str)));
 	return (dynar_cat(dest, str, strlen(str)));
 }
 }
 
 
+int
+dynar_str_prepend(struct dynar *dest, const char *str)
+{
+
+	return (dynar_prepend(dest, str, strlen(str)));
+}
+
 int
 int
 dynar_str_vcatf(struct dynar *dest, const char *format, va_list ap)
 dynar_str_vcatf(struct dynar *dest, const char *format, va_list ap)
 {
 {

+ 2 - 0
qdevices/dynar-str.h

@@ -51,6 +51,8 @@ extern int		dynar_str_catf(struct dynar *dest, const char *format, ...)
 extern int		dynar_str_vcatf(struct dynar *dest, const char *format, va_list ap)
 extern int		dynar_str_vcatf(struct dynar *dest, const char *format, va_list ap)
     __attribute__((__format__(__printf__, 2, 0)));
     __attribute__((__format__(__printf__, 2, 0)));
 
 
+extern int		dynar_str_prepend(struct dynar *dest, const char *str);
+
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }
 #endif
 #endif

+ 15 - 0
qdevices/dynar.c

@@ -147,3 +147,18 @@ dynar_cat(struct dynar *array, const void *src, size_t size)
 
 
 	return (0);
 	return (0);
 }
 }
+
+int
+dynar_prepend(struct dynar *array, const void *src, size_t size)
+{
+
+	if (dynar_prealloc(array, size) != 0) {
+		return (-1);
+	}
+
+	memmove(array->data + size, array->data, array->size);
+	memmove(array->data, src, size);
+	array->size += size;
+
+	return (0);
+}

+ 2 - 0
qdevices/dynar.h

@@ -70,6 +70,8 @@ extern int	 dynar_cat(struct dynar *array, const void *src, size_t size);
 
 
 extern int	 dynar_prealloc(struct dynar *array, size_t size);
 extern int	 dynar_prealloc(struct dynar *array, size_t size);
 
 
+extern int	 dynar_prepend(struct dynar *array, const void *src, size_t size);
+
 #ifdef __cplusplus
 #ifdef __cplusplus
 }
 }
 #endif
 #endif

+ 33 - 0
qdevices/test-dynar.c

@@ -123,5 +123,38 @@ main(void)
 	assert(memcmp(dynar_data(&str), "abcd", 4) == 0);
 	assert(memcmp(dynar_data(&str), "abcd", 4) == 0);
 	dynar_destroy(&str);
 	dynar_destroy(&str);
 
 
+	dynar_init(&str, 10);
+	assert(dynar_str_cat(&str, "abcd") == 0);
+	assert(memcmp(dynar_data(&str), "abcd", 4) == 0);
+	assert(dynar_str_prepend(&str, "e") == 0);
+	assert(dynar_size(&str) == 5);
+	assert(memcmp(dynar_data(&str), "eabcd", 5) == 0);
+	assert(dynar_str_prepend(&str, "fgh") == 0);
+	assert(dynar_size(&str) == 8);
+	assert(memcmp(dynar_data(&str), "fgheabcd", 8) == 0);
+	assert(dynar_str_prepend(&str, "ijk") != 0);
+	assert(dynar_size(&str) == 8);
+	assert(dynar_str_prepend(&str, "ij") == 0);
+	assert(dynar_size(&str) == 10);
+	assert(memcmp(dynar_data(&str), "ijfgheabcd", 10) == 0);
+	dynar_destroy(&str);
+
+	dynar_init(&str, 10);
+	assert(dynar_str_cat(&str, "abcd") == 0);
+	assert(memcmp(dynar_data(&str), "abcd", 4) == 0);
+	assert(dynar_str_prepend(&str, "ef") == 0);
+	assert(dynar_size(&str) == 6);
+	assert(memcmp(dynar_data(&str), "efabcd", 6) == 0);
+	assert(dynar_str_cat(&str, "ij") == 0);
+	assert(dynar_size(&str) == 8);
+	assert(memcmp(dynar_data(&str), "efabcdij", 8) == 0);
+	assert(dynar_str_prepend(&str, "k") == 0);
+	assert(dynar_size(&str) == 9);
+	assert(memcmp(dynar_data(&str), "kefabcdij", 9) == 0);
+	assert(dynar_str_cat(&str, "l") == 0);
+	assert(dynar_size(&str) == 10);
+	assert(memcmp(dynar_data(&str), "kefabcdijl", 10) == 0);
+	dynar_destroy(&str);
+
 	return (0);
 	return (0);
 }
 }