size_t
ss_pers_decode_cb(void *buffer, /* Array of objects into which to decode SERBUF. */
const char *serbuf, /* Encoded information to be decoded. */
size_t size, /* Size of each element in BUFFER array. */
size_t nelmts /* Number of elements in BUFFER array. */
)
{
SS_ENTER(ss_pers_decode_cb, size_t);
size_t i, serial, scope_idx, item_idx, gfile_idx;
ss_pers_t *pers = (ss_pers_t*)buffer;
ss_gfile_t *gfile=NULL; /*used only for sizeof*/
unsigned table_idx;
const char *serbuf_orig=serbuf;
SS_ASSERT(sizeof(ss_pers_t)==size);
for (i=0; i<nelmts; i++, pers++) {
memset(pers, 0, sizeof(*pers));
SS_H5_DECODE(serbuf, 1, table_idx);
if (0xff!=table_idx) {
SS_H5_DECODE(serbuf, sizeof(gfile->serial), serial);
SS_H5_DECODE(serbuf, 4, scope_idx);
SS_H5_DECODE(serbuf, 4, item_idx);
if (SS_NOSIZE==(gfile_idx=ss_gfile_find_serial(serial))) SS_ERROR(NOTFOUND);
if (NULL==ss_obj_new((ss_obj_t*)pers, SS_MAGIC_CONS(SS_MAGIC(ss_pers_t), table_idx), sizeof(*pers), pers))
SS_ERROR(FAILED);
ss_pers_link_setstate(pers, SS_PERS_LINK_CLOSED);
ss_pers_link_setgfileidx(pers, gfile_idx);
ss_pers_link_setscopeidx(pers, scope_idx);
ss_pers_link_setobjidx(pers, item_idx);
}
}
SS_CLEANUP:
memset(buffer, 0, size*nelmts); /*make them all null links on failure*/
SS_LEAVE((size_t)(serbuf-serbuf_orig));
}