in c/src/core/codec.c [2144:2301]
int pn_data_appendn(pn_data_t *data, pn_data_t *src, int limit)
{
int err = 0;
int level = 0, count = 0;
bool stop = false;
pn_handle_t point = pn_data_point(src);
pn_data_rewind(src);
while (true) {
while (!pn_data_next(src)) {
if (level > 0) {
pn_data_exit(data);
pn_data_exit(src);
level--;
continue;
}
if (!pn_data_next(src)) {
stop = true;
}
break;
}
if (stop) break;
if (level == 0 && count == limit)
break;
pn_type_t type = pn_data_type(src);
switch (type) {
case PN_NULL:
err = pn_data_put_null(data);
if (level == 0) count++;
break;
case PN_BOOL:
err = pn_data_put_bool(data, pn_data_get_bool(src));
if (level == 0) count++;
break;
case PN_UBYTE:
err = pn_data_put_ubyte(data, pn_data_get_ubyte(src));
if (level == 0) count++;
break;
case PN_BYTE:
err = pn_data_put_byte(data, pn_data_get_byte(src));
if (level == 0) count++;
break;
case PN_USHORT:
err = pn_data_put_ushort(data, pn_data_get_ushort(src));
if (level == 0) count++;
break;
case PN_SHORT:
err = pn_data_put_short(data, pn_data_get_short(src));
if (level == 0) count++;
break;
case PN_UINT:
err = pn_data_put_uint(data, pn_data_get_uint(src));
if (level == 0) count++;
break;
case PN_INT:
err = pn_data_put_int(data, pn_data_get_int(src));
if (level == 0) count++;
break;
case PN_CHAR:
err = pn_data_put_char(data, pn_data_get_char(src));
if (level == 0) count++;
break;
case PN_ULONG:
err = pn_data_put_ulong(data, pn_data_get_ulong(src));
if (level == 0) count++;
break;
case PN_LONG:
err = pn_data_put_long(data, pn_data_get_long(src));
if (level == 0) count++;
break;
case PN_TIMESTAMP:
err = pn_data_put_timestamp(data, pn_data_get_timestamp(src));
if (level == 0) count++;
break;
case PN_FLOAT:
err = pn_data_put_float(data, pn_data_get_float(src));
if (level == 0) count++;
break;
case PN_DOUBLE:
err = pn_data_put_double(data, pn_data_get_double(src));
if (level == 0) count++;
break;
case PN_DECIMAL32:
err = pn_data_put_decimal32(data, pn_data_get_decimal32(src));
if (level == 0) count++;
break;
case PN_DECIMAL64:
err = pn_data_put_decimal64(data, pn_data_get_decimal64(src));
if (level == 0) count++;
break;
case PN_DECIMAL128:
err = pn_data_put_decimal128(data, pn_data_get_decimal128(src));
if (level == 0) count++;
break;
case PN_UUID:
err = pn_data_put_uuid(data, pn_data_get_uuid(src));
if (level == 0) count++;
break;
case PN_BINARY:
err = pn_data_put_binary(data, pn_data_get_binary(src));
if (level == 0) count++;
break;
case PN_STRING:
err = pn_data_put_string(data, pn_data_get_string(src));
if (level == 0) count++;
break;
case PN_SYMBOL:
err = pn_data_put_symbol(data, pn_data_get_symbol(src));
if (level == 0) count++;
break;
case PN_DESCRIBED:
err = pn_data_put_described(data);
if (level == 0) count++;
if (err) { pn_data_restore(src, point); return err; }
pn_data_enter(data);
pn_data_enter(src);
level++;
break;
case PN_ARRAY:
err = pn_data_put_array(data, pn_data_is_array_described(src),
pn_data_get_array_type(src));
if (level == 0) count++;
if (err) { pn_data_restore(src, point); return err; }
pn_data_enter(data);
pn_data_enter(src);
level++;
break;
case PN_LIST:
err = pn_data_put_list(data);
if (level == 0) count++;
if (err) { pn_data_restore(src, point); return err; }
pn_data_enter(data);
pn_data_enter(src);
level++;
break;
case PN_MAP:
err = pn_data_put_map(data);
if (level == 0) count++;
if (err) { pn_data_restore(src, point); return err; }
pn_data_enter(data);
pn_data_enter(src);
level++;
break;
default:
break;
}
if (err) { pn_data_restore(src, point); return err; }
}
pn_data_restore(src, point);
return 0;
}