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;
*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;
}
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;
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;
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;
v = elem;
switch (t->id) {
+ case MRP_TYPE_STRING:
+ v = *(void **)elem;
case MRP_TYPE_INT8:
case MRP_TYPE_UINT8:
case MRP_TYPE_INT16:
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;
v = elem;
switch (et->id) {
+ case MRP_TYPE_STRING:
+ v = *(void **)elem;
case MRP_TYPE_INT8:
case MRP_TYPE_UINT8:
case MRP_TYPE_INT16:
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;
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;
};
+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",
};
+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",
};
+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",
.name = "Dick",
.gender = MALE,
.age = 12,
+ .languages = kids_languages,
.height = 145,
.weight = 45.5,
.nationality = "UFO",
.name = "Harry",
.gender = MALE,
.age = 14,
+ .languages = kids_languages + 2,
.height = 165,
.weight = 60.5,
.nationality = "UFO",
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),