1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 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));
 }