changeset 80:820426789f17

Fix array in pack.c
author David Demelier <markand@malikania.fr>
date Thu, 12 Jan 2012 15:42:08 +0100
parents fd817a7dbf2f
children cb5d3d66ea04
files pack.c
diffstat 1 files changed, 17 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/pack.c	Tue Nov 15 20:12:48 2011 +0100
+++ b/pack.c	Thu Jan 12 15:42:08 2012 +0100
@@ -19,6 +19,7 @@
 #include <stdlib.h>
 #include <stdint.h>
 #include <stdarg.h>
+#include <string.h>
 #include <ctype.h>
 
 #include "pack.h"
@@ -154,12 +155,11 @@
 	const char *p;
 	char tok;
 	struct item item;
+	int nelem;
 
 	STAILQ_INIT(list);
 
 	for (p = fmt; *p != '\0'; ++p) {
-		int i, nelem = 1;
-
 		if (isspace(*p))
 			continue;
 
@@ -174,12 +174,25 @@
 		if (nelem == 0)
 			continue;
 
-		for (i = 0; i < nelem; ++i) {
+		/*
+		 * If i is 1, then we only have one integer, if it's more
+		 * than one, user may have given an array of something else.
+		 */
+		if (nelem == 1) {
 			PACK_GETARG(item.i, ap, tok);
-			item.conv	= pack_getconvert(tok);
+			item.conv = pack_getconvert(tok);
 
 			if (pack_item_add(list, &item) < 0)
 				return pack_fatal(list);
+		} else {
+			uint8_t *arr = va_arg(ap, void *);
+			int i;
+
+			for (i = 0; i < nelem; ++i) {
+				memcpy(&item.i, &arr[i * item.size], item.size);
+				if (pack_item_add(list, &item) < 0)
+					return pack_fatal(list);
+			}
 		}
 	}