Skip to content

Commit ada77b7

Browse files
committed
lyb CHANGE learing lyb data length refactored
1 parent bd7b314 commit ada77b7

File tree

3 files changed

+98
-70
lines changed

3 files changed

+98
-70
lines changed

src/parser_lyb.c

Lines changed: 96 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -247,17 +247,15 @@ lyb_parse_model(const char *data, const struct lys_module **mod, struct lyb_stat
247247
{
248248
int r, ret = 0;
249249
char *mod_name = NULL, mod_rev[11];
250-
uint16_t rev = 0;
251-
uint8_t tmp_buf[2];
250+
uint16_t rev;
252251

253252
/* model name */
254253
ret += (r = lyb_read_string(data, &mod_name, 1, lybs));
255254
LYB_HAVE_READ_GOTO(r, data, error);
256255

257256
/* revision */
258-
ret += (r = lyb_read(data, tmp_buf, sizeof tmp_buf, lybs));
257+
ret += (r = lyb_read(data, (uint8_t *)&rev, 2, lybs));
259258
LYB_HAVE_READ_GOTO(r, data, error);
260-
rev = tmp_buf[0] | (tmp_buf[1] << 8);
261259

262260
if (rev) {
263261
sprintf(mod_rev, "%04u-%02u-%02u", ((rev & 0xFE00) >> 9) + 2000, (rev & 0x01E0) >> 5, (rev & 0x001F));
@@ -991,6 +989,24 @@ lyb_parse_schema_hash(const struct lys_node *sparent, const struct lys_module *m
991989
return ret;
992990
}
993991

992+
static int
993+
lyb_skip_subtree(const char *data, struct lyb_state *lybs)
994+
{
995+
int r, ret = 0;
996+
997+
do {
998+
ret += (r = lyb_read(data, NULL, lybs->written[lybs->used - 1], lybs));
999+
LYB_HAVE_READ_RETURN(r, data, -1);
1000+
1001+
/* also skip the meta information inside */
1002+
r = lybs->inner_chunks[lybs->used - 1] * LYB_META_BYTES;
1003+
data += r;
1004+
ret += r;
1005+
} while (lybs->written[lybs->used - 1]);
1006+
1007+
return ret;
1008+
}
1009+
9941010
static int
9951011
lyb_parse_subtree(const char *data, struct lyd_node *parent, struct lyd_node **first_sibling, const char *yang_data_name,
9961012
int options, struct unres_data *unres, struct lyb_state *lybs)
@@ -1026,13 +1042,8 @@ lyb_parse_subtree(const char *data, struct lyd_node *parent, struct lyd_node **f
10261042

10271043
if (!mod || !snode) {
10281044
/* unknown data subtree, skip it whole */
1029-
do {
1030-
ret += (r = lyb_read(data, NULL, lybs->written[lybs->used - 1], lybs));
1031-
/* also skip the meta information inside */
1032-
r = lybs->inner_chunks[lybs->used - 1] * LYB_META_BYTES;
1033-
data += r;
1034-
ret += r;
1035-
} while (lybs->written[lybs->used - 1]);
1045+
ret += (r = lyb_skip_subtree(data, lybs));
1046+
LYB_HAVE_READ_GOTO(r, data, error);
10361047
goto stop_subtree;
10371048
}
10381049

@@ -1293,3 +1304,77 @@ lyd_parse_lyb(struct ly_ctx *ctx, const char *data, int options, const struct ly
12931304
}
12941305
return node;
12951306
}
1307+
1308+
API int
1309+
lyd_lyb_data_length(const char *data)
1310+
{
1311+
struct lyb_state lybs;
1312+
int r = 0, ret = 0, i;
1313+
size_t len;
1314+
uint8_t buf[LYB_SIZE_MAX];
1315+
1316+
if (!data) {
1317+
return -1;
1318+
}
1319+
1320+
lybs.written = malloc(LYB_STATE_STEP * sizeof *lybs.written);
1321+
lybs.position = malloc(LYB_STATE_STEP * sizeof *lybs.position);
1322+
lybs.inner_chunks = malloc(LYB_STATE_STEP * sizeof *lybs.inner_chunks);
1323+
LY_CHECK_ERR_GOTO(!lybs.written || !lybs.position || !lybs.inner_chunks, LOGMEM(NULL), finish);
1324+
lybs.used = 0;
1325+
lybs.size = LYB_STATE_STEP;
1326+
lybs.models = NULL;
1327+
lybs.mod_count = 0;
1328+
lybs.ctx = NULL;
1329+
1330+
/* read magic number */
1331+
ret += (r = lyb_parse_magic_number(data, &lybs));
1332+
LYB_HAVE_READ_GOTO(r, data, finish);
1333+
1334+
/* read header */
1335+
ret += (r = lyb_parse_header(data, &lybs));
1336+
LYB_HAVE_READ_GOTO(r, data, finish);
1337+
1338+
/* read model count */
1339+
ret += (r = lyb_read_number((uint64_t *)&lybs.mod_count, 2, data, &lybs));
1340+
LYB_HAVE_READ_GOTO(r, data, finish);
1341+
1342+
/* read all models */
1343+
for (i = 0; i < lybs.mod_count; ++i) {
1344+
/* module name length */
1345+
len = 0;
1346+
ret += (r = lyb_read_number(&len, 2, data, &lybs));
1347+
LYB_HAVE_READ_GOTO(r, data, finish);
1348+
1349+
/* model name */
1350+
ret += (r = lyb_read(data, buf, len, &lybs));
1351+
LYB_HAVE_READ_GOTO(r, data, finish);
1352+
1353+
/* revision */
1354+
ret += (r = lyb_read(data, buf, 2, &lybs));
1355+
LYB_HAVE_READ_GOTO(r, data, finish);
1356+
}
1357+
1358+
while (data[0]) {
1359+
/* register a new subtree */
1360+
ret += (r = lyb_read_start_subtree(data, &lybs));
1361+
LYB_HAVE_READ_GOTO(r, data, finish);
1362+
1363+
/* skip it */
1364+
ret += (r = lyb_skip_subtree(data, &lybs));
1365+
LYB_HAVE_READ_GOTO(r, data, finish);
1366+
1367+
/* subtree finished */
1368+
lyb_read_stop_subtree(&lybs);
1369+
}
1370+
1371+
/* read the last zero, parsing finished */
1372+
++ret;
1373+
1374+
finish:
1375+
free(lybs.written);
1376+
free(lybs.position);
1377+
free(lybs.inner_chunks);
1378+
free(lybs.models);
1379+
return ret;
1380+
}

src/printer_lyb.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,8 @@ lyb_print_anydata(struct lyd_node_anydata *anydata, struct lyout *out, struct ly
739739
len = lyd_lyb_data_length(anydata->value.mem);
740740
if (len > -1) {
741741
ret += lyb_write_string(anydata->value.str, (size_t)len, 0, out, lybs);
742+
} else {
743+
ret = len;
742744
}
743745
} else {
744746
ret += lyb_write_string(anydata->value.str, 0, 0, out, lybs);

src/tree_data.c

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -7767,65 +7767,6 @@ lyd_leaf_type(const struct lyd_node_leaf_list *leaf)
77677767
return type;
77687768
}
77697769

7770-
API int
7771-
lyd_lyb_data_length(const char *data)
7772-
{
7773-
const char *ptr;
7774-
uint16_t i, mod_count, str_len;
7775-
uint8_t tmp_buf[2];
7776-
LYB_META meta;
7777-
7778-
if (!data) {
7779-
return -1;
7780-
}
7781-
7782-
ptr = data;
7783-
7784-
/* magic number */
7785-
if ((ptr[0] != 'l') || (ptr[1] != 'y') || (ptr[2] != 'b')) {
7786-
return -1;
7787-
}
7788-
ptr += 3;
7789-
7790-
/* header */
7791-
++ptr;
7792-
7793-
/* models */
7794-
memcpy(tmp_buf, ptr, 2);
7795-
ptr += 2;
7796-
mod_count = tmp_buf[0] | (tmp_buf[1] << 8);
7797-
7798-
for (i = 0; i < mod_count; ++i) {
7799-
/* model name */
7800-
memcpy(tmp_buf, ptr, 2);
7801-
ptr += 2;
7802-
str_len = tmp_buf[0] | (tmp_buf[1] << 8);
7803-
7804-
ptr += str_len;
7805-
7806-
/* revision */
7807-
ptr += 2;
7808-
}
7809-
7810-
if (ptr[0]) {
7811-
/* subtrees */
7812-
do {
7813-
memcpy(&meta, ptr, LYB_META_BYTES);
7814-
ptr += LYB_META_BYTES;
7815-
7816-
/* read whole subtree (chunk size) */
7817-
ptr += *((uint8_t *)&meta);
7818-
/* skip inner chunks (inner chunk count) */
7819-
ptr += *(((uint8_t *)&meta) + LYB_SIZE_BYTES) * LYB_META_BYTES;
7820-
} while ((*((uint8_t *)&meta) == LYB_SIZE_MAX) || ptr[0]);
7821-
}
7822-
7823-
/* ending zero */
7824-
++ptr;
7825-
7826-
return ptr - data;
7827-
}
7828-
78297770
#ifdef LY_ENABLED_LYD_PRIV
78307771

78317772
API void *

0 commit comments

Comments
 (0)