common: arrays of basic types in native-types.
authorKrisztian Litkey <kli@iki.fi>
Mon, 25 Nov 2013 11:05:38 +0000 (13:05 +0200)
committerKrisztian Litkey <kli@iki.fi>
Mon, 25 Nov 2013 11:05:38 +0000 (13:05 +0200)
Hmm... looks like I've partially overlooked/forgotten about
arrays of basic types. Part of the code was there, part was
missing and part was simply broken. With this band-aid fix,
at least the basic cases should work. Let's see what else is
missing...

src/common/native-types.c
src/common/tests/native-test.c

index 31883a2..bf2efd0 100644 (file)
@@ -110,6 +110,7 @@ static int member_index(mrp_native_type_t *t, const char *name)
 static int copy_member(mrp_native_type_t *t, mrp_native_member_t *m)
 {
     mrp_native_member_t *tm;
+    size_t               size;
 
     if ((tm = native_member(t, member_index(t, m->any.name))) != NULL)
         return tm - t->members;
@@ -118,7 +119,16 @@ static int copy_member(mrp_native_type_t *t, mrp_native_member_t *m)
 
     *tm = *m;
 
-    if ((tm->any.name = mrp_strdup(m->any.name)) != 0) {
+    if (*m->any.name != '"')
+         tm->any.name = mrp_strdup(m->any.name);
+     else {
+         size = strlen(m->any.name) + 1 - 2;
+
+         if ((tm->any.name = mrp_allocz(size)) != NULL)
+             strncpy(tm->any.name, m->any.name + 1, size - 1);
+     }
+
+    if (tm->any.name != NULL) {
         t->nmember++;
         return tm - t->members;
     }
@@ -381,7 +391,7 @@ uint32_t mrp_register_native(mrp_native_type_t *type)
 
             if (m == NULL) {
                 m = native_member(type,
-                                      member_index(type, s->blob.size.name));
+                                  member_index(type, s->blob.size.name));
 
                 if (m == NULL)
                     goto fail;
@@ -408,8 +418,7 @@ uint32_t mrp_register_native(mrp_native_type_t *type)
 
                 if (m == NULL) {
                     m = native_member(type,
-                                          member_index(type,
-                                                       s->array.size.name));
+                                      member_index(type, s->array.size.name));
 
                     if (m == NULL)
                         goto fail;
@@ -448,12 +457,15 @@ uint32_t mrp_register_native(mrp_native_type_t *type)
                 if (elemt == NULL)
                     goto fail;
 
-                idx = member_index(elemt, s->array.size.name);
+                if (elemt->id < MRP_TYPE_ARRAY)
+                    idx = 0;
+                else {
+                    idx = member_index(elemt, s->array.size.name);
+                    d->array.size.idx = member_index(elemt, s->array.size.name);
 
-                d->array.size.idx = member_index(elemt, s->array.size.name);
-
-                if (d->array.size.idx == (uint32_t)-1)
-                    goto fail;
+                    if (d->array.size.idx == (uint32_t)-1)
+                        goto fail;
+                }
             }
 
             break;
@@ -722,6 +734,8 @@ static int encode_array(mrp_tlv_t *tlv, void *arrp, mrp_native_array_t *m,
         v = elem;
 
         switch (t->id) {
+        case MRP_TYPE_STRING:
+            v = *(void **)elem;
         case MRP_TYPE_INT8:
         case MRP_TYPE_UINT8:
         case MRP_TYPE_INT16:
@@ -733,7 +747,6 @@ static int encode_array(mrp_tlv_t *tlv, void *arrp, mrp_native_array_t *m,
         case MRP_TYPE_FLOAT:
         case MRP_TYPE_DOUBLE:
         case MRP_TYPE_BOOL:
-        case MRP_TYPE_STRING:
             if (encode_basic(tlv, t->id, v) < 0)
                 return -1;
             break;
@@ -1281,6 +1294,8 @@ static int print_array(char **bufp, size_t *sizep, int level,
         v = elem;
 
         switch (et->id) {
+        case MRP_TYPE_STRING:
+            v = *(void **)elem;
         case MRP_TYPE_INT8:
         case MRP_TYPE_UINT8:
         case MRP_TYPE_INT16:
@@ -1292,7 +1307,6 @@ static int print_array(char **bufp, size_t *sizep, int level,
         case MRP_TYPE_FLOAT:
         case MRP_TYPE_DOUBLE:
         case MRP_TYPE_BOOL:
-        case MRP_TYPE_STRING:
             if (print_basic(level, &p, &size, et->id, NULL, v) < 0)
                 return -1;
             break;
index 5b90e93..1f9b003 100644 (file)
@@ -42,16 +42,17 @@ typedef enum {
 
 
 typedef struct {
-    char     *name;
-    gender_t  gender;
-    uint16_t  age;
-    uint16_t  height;
-    float     weight;
-    char      nationality[32];
-    hand_t    hand;
-    bool      glasses;
-    art_t    *favourites;
-    uint32_t  nfavourite;
+    char      *name;
+    gender_t   gender;
+    uint16_t   age;
+    char     **languages;
+    uint16_t   height;
+    float      weight;
+    char       nationality[32];
+    hand_t     hand;
+    bool       glasses;
+    art_t     *favourites;
+    uint32_t   nfavourite;
 } person_t;
 
 
@@ -86,10 +87,15 @@ art_t paps_favourites[] = {
 };
 
 
+char *paps_languages[] = {
+    "english", "swedish", "finnish", NULL
+};
+
 person_t pap = {
     .name        = "Pap",
     .gender      = MALE,
     .age         = 30,
+    .languages   = paps_languages,
     .height      = 180,
     .weight      = 84.5,
     .nationality = "martian",
@@ -124,10 +130,15 @@ art_t moms_favourites[] = {
 };
 
 
+char *moms_languages[] = {
+    "finnish", "english", "swedish", "french", NULL
+};
+
 person_t mom = {
     .name        = "Mom",
     .gender      = FEMALE,
     .age         = 28,
+    .languages   = moms_languages,
     .height      = 165,
     .weight      = 57.8,
     .nationality = "venusian",
@@ -138,11 +149,16 @@ person_t mom = {
 };
 
 
+char *kids_languages[] = {
+    "english", "finnish", "swedish", NULL
+};
+
 person_t tom_dick_and_harry[] = {
     {
         .name        = "Tom",
         .gender      = MALE,
         .age         = 10,
+        .languages   = kids_languages + 1,
         .height      = 135,
         .weight      = 40.5,
         .nationality = "UFO",
@@ -155,6 +171,7 @@ person_t tom_dick_and_harry[] = {
         .name        = "Dick",
         .gender      = MALE,
         .age         = 12,
+        .languages   = kids_languages,
         .height      = 145,
         .weight      = 45.5,
         .nationality = "UFO",
@@ -167,6 +184,7 @@ person_t tom_dick_and_harry[] = {
         .name        = "Harry",
         .gender      = MALE,
         .age         = 14,
+        .languages   = kids_languages + 2,
         .height      = 165,
         .weight      = 60.5,
         .nationality = "UFO",
@@ -197,6 +215,8 @@ int main(int argc, char *argv[])
                     MRP_STRING(person_t, name       , DEFAULT),
                     MRP_UINT32(person_t, gender     , DEFAULT),
                     MRP_UINT16(person_t, age        , DEFAULT),
+                    MRP_ARRAY (person_t, languages  , DEFAULT, GUARDED,
+                               char *, "", .strp = NULL),
                     MRP_UINT16(person_t, height     , DEFAULT),
                     MRP_FLOAT (person_t, weight     , DEFAULT),
                     MRP_STRING(person_t, nationality, INLINED),