netSerial

serializer producing compact bitstreams
git clone https://noulin.net/git/netSerial.git
Log | Files | Refs | README | LICENSE

netSerial.c.gcov (297007B)


      1         -:    0:Source:/home/remy/git/sw/publicGits/netSerial/netSerial.c
      2         -:    0:Graph:netSerial.gcno
      3         -:    0:Data:netSerial.gcda
      4         -:    0:Runs:7
      5         -:    0:Programs:1
      6         -:    1:
      7         -:    2:#include "libsheepyObject.h"
      8         -:    3:#include "netSerial.h"
      9         -:    4:#include "netSerialInternal.h"
     10         -:    5:
     11         -:    6:#include <stdlib.h>
     12         -:    7:#include <string.h>
     13         -:    8:#include <stdio.h>
     14         -:    9:
     15         -:   10:#define lv logVarG
     16         -:   11:
     17         -:   12:void initiateNetSerialLevel0(smallJsont *self);
     18         -:   13:void initiateNetSerialLevel1(smallJsont *self);
     19         -:   14:void initiateNetSerialLevel2(smallJsont *self);
     20         -:   15:void initiateNetSerial(smallJsont *self);
     21         -:   16:void registerMethodsNetSerialLevel0(smallJsonFunctionst *f);
     22         -:   17:void registerMethodsNetSerialLevel1(smallJsonFunctionst *f);
     23         -:   18:void registerMethodsNetSerialLevel2(smallJsonFunctionst *f);
     24         -:   19:void registerMethodsNetSerial(smallJsonFunctionst *f);
     25         -:   20:void initiateAllocateNetSerialLevel0(smallJsont **self);
     26         -:   21:void initiateAllocateNetSerialLevel1(smallJsont **self);
     27         -:   22:void initiateAllocateNetSerialLevel2(smallJsont **self);
     28         -:   23:void initiateAllocateNetSerial(smallJsont **self);
     29         -:   24:void finalizeNetSerial(void);
     30         -:   25:smallJsont* allocNetSerialLevel0(void);
     31         -:   26:smallJsont* allocNetSerialLevel1(void);
     32         -:   27:smallJsont* allocNetSerialLevel2(void);
     33         -:   28:smallJsont* allocNetSerial(void);
     34         -:   29:internal const char* helpNetSerial(smallJsont *self);
     35         -:   30:internal smallBytest* serialNetSerialLevel0(smallJsont *self);
     36         -:   31:internal smallBytest* serialNetSerialLevel1(smallJsont *self);
     37         -:   32:internal smallBytest* serialNetSerialLevel2(smallJsont *self);
     38         -:   33:internal smallBytest* serialNetSerial(smallJsont *self);
     39         -:   34:internal smallJsont* deserialNetSerialLevel0(smallJsont *self, smallBytest *data);
     40         -:   35:internal smallJsont* deserialNetSerialLevel1(smallJsont *self, smallBytest *data);
     41         -:   36:internal smallJsont* deserialNetSerialLevel2(smallJsont *self, smallBytest *data);
     42         -:   37:internal smallJsont* deserialNetSerial(smallJsont *self, smallBytest *data);
     43         -:   38:
     44         -:   39:internal void uintToNetTypeVarint(sBytest **buf, u8 type, u64 value);
     45         -:   40:internal void uintToVarint(sBytest **buf, u64 value);
     46         -:   41:internal u64 netTypeVarintToUint(u8 **buf);
     47         -:   42:internal u64 varintToUint(u8 **buf);
     48         -:   43:
     49         -:   44:internal sBytest* netSerialLevel0(smallt *o);
     50         -:   45:internal void dictNetSerialLevel0(sBytest **r, sDictt *dict);
     51         -:   46:internal void arrayNetSerialLevel0(sBytest **r, sArrayt *array);
     52         -:   47:internal sBytest* netSerialLevel1(smallt *o);
     53         -:   48:internal void dictNetSerialLevel1(sBytest **r, sDictt *dict, contextt *ctx);
     54         -:   49:internal void arrayNetSerialLevel1(sBytest **r, sArrayt *array, contextt *ctx);
     55         -:   50:internal sBytest* netSerialLevel2(smallt *o);
     56         -:   51:internal void dictNetSerialLevel2(sBytest **r, sDictt *dict, contextt *ctx, bool packed);
     57         -:   52:internal void arrayNetSerialLevel2(sBytest **r, sArrayt *array, contextt *ctx, bool packed);
     58         -:   53:internal sBytest* netSerial(smallt *o);
     59         -:   54:internal void dictNetSerial(sBytest **r, sDictt *dict, contextt *ctx, packingT packing);
     60         -:   55:internal void arrayNetSerial(sBytest **r, sArrayt *array, contextt *ctx, packingT packing);
     61         -:   56:
     62         -:   57:internal smallt* netDeserialLevel0(sBytest *obj);
     63         -:   58:internal void dictNetDeserialLevel0(sDictt **dict, char **data);
     64         -:   59:internal void arrayNetDeserialLevel0(sArrayt **array, char **data);
     65         -:   60:internal smallt* netDeserialLevel1(sBytest *obj);
     66         -:   61:internal void dictNetDeserialLevel1(sDictt **dict, u8 **data, contextt *ctx);
     67         -:   62:internal void arrayNetDeserialLevel1(sArrayt **array, u8 **data, contextt *ctx);
     68         -:   63:internal smallt* netDeserialLevel2(sBytest *obj);
     69         -:   64:internal void dictNetDeserialLevel2(sDictt **dict, u8 **data, contextt *ctx, bool packed);
     70         -:   65:internal u8 isDictUniform(sDictt *dict);
     71         -:   66:internal u8 isArrayUniform(sArrayt *array);
     72         -:   67:internal void uniformDictNetDeserialLevel2(sDictt **dict, u8 **data, contextt *ctx, bool packed);
     73         -:   68:internal void arrayNetDeserialLevel2(sArrayt **array, u8 **data, contextt *ctx, bool packed);
     74         -:   69:internal void uniformArrayNetDeserialLevel2(sArrayt **array, u8 **data, contextt *ctx, bool packed);
     75         -:   70:internal smallt* netDeserial(sBytest *obj);
     76         -:   71:internal void dictNetDeserial(sDictt **dict, u8 **data, contextt *ctx, bool packed);
     77         -:   72:internal void uniformDictNetDeserial(sDictt **dict, u8 **data, contextt *ctx, bool packed);
     78         -:   73:internal void arrayNetDeserial(sArrayt **array, u8 **data, contextt *ctx, bool packed);
     79         -:   74:internal void uniformArrayNetDeserial(sArrayt **array, u8 **data, contextt *ctx, bool packed);
     80         -:   75:
     81         -:   76:/* enable/disable logging */
     82         -:   77:/* #undef pLog */
     83         -:   78:/* #define pLog(...) */
     84         -:   79:
     85 function initiateNetSerialLevel0 called 0 returned 0% blocks executed 0%
     86     #####:   80:void initiateNetSerialLevel0(smallJsont *self) {
     87         -:   81:
     88     #####:   82:  initiateSmallJson(self);
     89 call    0 never executed
     90         -:   83:
     91     #####:   84:  self->type = "netSerial";
     92     #####:   85:  if (!netSerialF) {
     93 branch  0 never executed
     94 branch  1 never executed
     95     #####:   86:    netSerialF            = malloc(sizeof(smallJsonFunctionst));
     96     #####:   87:    registerMethodsNetSerialLevel0(netSerialF);
     97 call    0 never executed
     98     #####:   88:    pErrorNot0(atexit(finalizeNetSerial));
     99 call    0 never executed
    100 branch  1 never executed
    101 branch  2 never executed
    102 branch  3 never executed
    103 branch  4 never executed
    104 call    5 never executed
    105 branch  6 never executed
    106 branch  7 never executed
    107 call    8 never executed
    108 branch  9 never executed
    109 branch 10 never executed
    110 call   11 never executed
    111 call   12 never executed
    112 call   13 never executed
    113 call   14 never executed
    114         -:   89:  }
    115     #####:   90:  self->f = netSerialF;
    116     #####:   91:}
    117         -:   92:
    118 function initiateNetSerialLevel1 called 0 returned 0% blocks executed 0%
    119     #####:   93:void initiateNetSerialLevel1(smallJsont *self) {
    120         -:   94:
    121     #####:   95:  initiateSmallJson(self);
    122 call    0 never executed
    123         -:   96:
    124     #####:   97:  self->type = "netSerial";
    125     #####:   98:  if (!netSerialF) {
    126 branch  0 never executed
    127 branch  1 never executed
    128     #####:   99:    netSerialF            = malloc(sizeof(smallJsonFunctionst));
    129     #####:  100:    registerMethodsNetSerialLevel1(netSerialF);
    130 call    0 never executed
    131     #####:  101:    pErrorNot0(atexit(finalizeNetSerial));
    132 call    0 never executed
    133 branch  1 never executed
    134 branch  2 never executed
    135 branch  3 never executed
    136 branch  4 never executed
    137 call    5 never executed
    138 branch  6 never executed
    139 branch  7 never executed
    140 call    8 never executed
    141 branch  9 never executed
    142 branch 10 never executed
    143 call   11 never executed
    144 call   12 never executed
    145 call   13 never executed
    146 call   14 never executed
    147         -:  102:  }
    148     #####:  103:  self->f = netSerialF;
    149     #####:  104:}
    150         -:  105:
    151 function initiateNetSerialLevel2 called 0 returned 0% blocks executed 0%
    152     #####:  106:void initiateNetSerialLevel2(smallJsont *self) {
    153         -:  107:
    154     #####:  108:  initiateSmallJson(self);
    155 call    0 never executed
    156         -:  109:
    157     #####:  110:  self->type = "netSerial";
    158     #####:  111:  if (!netSerialF) {
    159 branch  0 never executed
    160 branch  1 never executed
    161     #####:  112:    netSerialF            = malloc(sizeof(smallJsonFunctionst));
    162     #####:  113:    registerMethodsNetSerialLevel2(netSerialF);
    163 call    0 never executed
    164     #####:  114:    pErrorNot0(atexit(finalizeNetSerial));
    165 call    0 never executed
    166 branch  1 never executed
    167 branch  2 never executed
    168 branch  3 never executed
    169 branch  4 never executed
    170 call    5 never executed
    171 branch  6 never executed
    172 branch  7 never executed
    173 call    8 never executed
    174 branch  9 never executed
    175 branch 10 never executed
    176 call   11 never executed
    177 call   12 never executed
    178 call   13 never executed
    179 call   14 never executed
    180         -:  115:  }
    181     #####:  116:  self->f = netSerialF;
    182     #####:  117:}
    183         -:  118:
    184 function initiateNetSerial called 12 returned 100% blocks executed 40%
    185        12:  119:void initiateNetSerial(smallJsont *self) {
    186         -:  120:
    187        12:  121:  initiateSmallJson(self);
    188 call    0 returned 100%
    189         -:  122:
    190        12:  123:  self->type = "netSerial";
    191        12:  124:  if (!netSerialF) {
    192 branch  0 taken 50% (fallthrough)
    193 branch  1 taken 50%
    194         6:  125:    netSerialF            = malloc(sizeof(smallJsonFunctionst));
    195         6:  126:    registerMethodsNetSerial(netSerialF);
    196 call    0 returned 100%
    197         6:  127:    pErrorNot0(atexit(finalizeNetSerial));
    198 call    0 returned 100%
    199 branch  1 taken 0% (fallthrough)
    200 branch  2 taken 100%
    201 branch  3 never executed
    202 branch  4 never executed
    203 call    5 never executed
    204 branch  6 never executed
    205 branch  7 never executed
    206 call    8 never executed
    207 branch  9 never executed
    208 branch 10 never executed
    209 call   11 never executed
    210 call   12 never executed
    211 call   13 never executed
    212 call   14 never executed
    213         -:  128:  }
    214        12:  129:  self->f = netSerialF;
    215        12:  130:}
    216         -:  131:
    217 function registerMethodsNetSerialLevel0 called 0 returned 0% blocks executed 0%
    218     #####:  132:void registerMethodsNetSerialLevel0(smallJsonFunctionst *f) {
    219         -:  133:
    220     #####:  134:  registerMethodsSmallJson(f);
    221 call    0 never executed
    222     #####:  135:  f->help      = helpNetSerial;
    223     #####:  136:  f->serial    = serialNetSerialLevel0;
    224     #####:  137:  f->deserial  = deserialNetSerialLevel0;
    225     #####:  138:}
    226         -:  139:
    227 function registerMethodsNetSerialLevel1 called 0 returned 0% blocks executed 0%
    228     #####:  140:void registerMethodsNetSerialLevel1(smallJsonFunctionst *f) {
    229         -:  141:
    230     #####:  142:  registerMethodsSmallJson(f);
    231 call    0 never executed
    232     #####:  143:  f->help      = helpNetSerial;
    233     #####:  144:  f->serial    = serialNetSerialLevel1;
    234     #####:  145:  f->deserial  = deserialNetSerialLevel1;
    235     #####:  146:}
    236         -:  147:
    237 function registerMethodsNetSerialLevel2 called 0 returned 0% blocks executed 0%
    238     #####:  148:void registerMethodsNetSerialLevel2(smallJsonFunctionst *f) {
    239         -:  149:
    240     #####:  150:  registerMethodsSmallJson(f);
    241 call    0 never executed
    242     #####:  151:  f->help      = helpNetSerial;
    243     #####:  152:  f->serial    = serialNetSerialLevel2;
    244     #####:  153:  f->deserial  = deserialNetSerialLevel2;
    245     #####:  154:}
    246         -:  155:
    247 function registerMethodsNetSerial called 6 returned 100% blocks executed 100%
    248         6:  156:void registerMethodsNetSerial(smallJsonFunctionst *f) {
    249         -:  157:
    250         6:  158:  registerMethodsSmallJson(f);
    251 call    0 returned 100%
    252         6:  159:  f->help      = helpNetSerial;
    253         6:  160:  f->serial    = serialNetSerial;
    254         6:  161:  f->deserial  = deserialNetSerial;
    255         6:  162:}
    256         -:  163:
    257 function initiateAllocateNetSerialLevel0 called 0 returned 0% blocks executed 0%
    258     #####:  164:void initiateAllocateNetSerialLevel0(smallJsont **self) {
    259         -:  165:
    260     #####:  166:  if (self) {
    261 branch  0 never executed
    262 branch  1 never executed
    263     #####:  167:    initiateG(self); // call initiateAllocateSmallJson to initialize the container recycling system
    264 call    0 never executed
    265     #####:  168:    if (*self) {
    266 branch  0 never executed
    267 branch  1 never executed
    268     #####:  169:      initiateNetSerialLevel0(*self);
    269 call    0 never executed
    270         -:  170:    }
    271         -:  171:  }
    272     #####:  172:}
    273         -:  173:
    274 function initiateAllocateNetSerialLevel1 called 0 returned 0% blocks executed 0%
    275     #####:  174:void initiateAllocateNetSerialLevel1(smallJsont **self) {
    276         -:  175:
    277     #####:  176:  if (self) {
    278 branch  0 never executed
    279 branch  1 never executed
    280     #####:  177:    initiateG(self); // call initiateAllocateSmallJson to initialize the container recycling system
    281 call    0 never executed
    282     #####:  178:    if (*self) {
    283 branch  0 never executed
    284 branch  1 never executed
    285     #####:  179:      initiateNetSerialLevel1(*self);
    286 call    0 never executed
    287         -:  180:    }
    288         -:  181:  }
    289     #####:  182:}
    290         -:  183:
    291 function initiateAllocateNetSerialLevel2 called 0 returned 0% blocks executed 0%
    292     #####:  184:void initiateAllocateNetSerialLevel2(smallJsont **self) {
    293         -:  185:
    294     #####:  186:  if (self) {
    295 branch  0 never executed
    296 branch  1 never executed
    297     #####:  187:    initiateG(self); // call initiateAllocateSmallJson to initialize the container recycling system
    298 call    0 never executed
    299     #####:  188:    if (*self) {
    300 branch  0 never executed
    301 branch  1 never executed
    302     #####:  189:      initiateNetSerialLevel2(*self);
    303 call    0 never executed
    304         -:  190:    }
    305         -:  191:  }
    306     #####:  192:}
    307         -:  193:
    308 function initiateAllocateNetSerial called 0 returned 0% blocks executed 0%
    309     #####:  194:void initiateAllocateNetSerial(smallJsont **self) {
    310         -:  195:
    311     #####:  196:  if (self) {
    312 branch  0 never executed
    313 branch  1 never executed
    314     #####:  197:    initiateG(self); // call initiateAllocateSmallJson to initialize the container recycling system
    315 call    0 never executed
    316     #####:  198:    if (*self) {
    317 branch  0 never executed
    318 branch  1 never executed
    319     #####:  199:      initiateNetSerial(*self);
    320 call    0 never executed
    321         -:  200:    }
    322         -:  201:  }
    323     #####:  202:}
    324         -:  203:
    325 function finalizeNetSerial called 6 returned 100% blocks executed 100%
    326         6:  204:void finalizeNetSerial(void) {
    327         -:  205:
    328         6:  206:  if (netSerialF) {
    329 branch  0 taken 100% (fallthrough)
    330 branch  1 taken 0%
    331         6:  207:    free(netSerialF);
    332         6:  208:    netSerialF = NULL;
    333         -:  209:  }
    334         6:  210:}
    335         -:  211:
    336 function allocNetSerialLevel0 called 0 returned 0% blocks executed 0%
    337     #####:  212:smallJsont* allocNetSerialLevel0(void) {
    338     #####:  213:  smallJsont *r = NULL;
    339         -:  214:
    340     #####:  215:  initiateAllocateNetSerialLevel0(&r);
    341 call    0 never executed
    342     #####:  216:  ret r;
    343         -:  217:}
    344         -:  218:
    345 function allocNetSerialLevel1 called 0 returned 0% blocks executed 0%
    346     #####:  219:smallJsont* allocNetSerialLevel1(void) {
    347     #####:  220:  smallJsont *r = NULL;
    348         -:  221:
    349     #####:  222:  initiateAllocateNetSerialLevel1(&r);
    350 call    0 never executed
    351     #####:  223:  ret r;
    352         -:  224:}
    353         -:  225:
    354 function allocNetSerialLevel2 called 0 returned 0% blocks executed 0%
    355     #####:  226:smallJsont* allocNetSerialLevel2(void) {
    356     #####:  227:  smallJsont *r = NULL;
    357         -:  228:
    358     #####:  229:  initiateAllocateNetSerialLevel2(&r);
    359 call    0 never executed
    360     #####:  230:  ret r;
    361         -:  231:}
    362         -:  232:
    363 function allocNetSerial called 0 returned 0% blocks executed 0%
    364     #####:  233:smallJsont* allocNetSerial(void) {
    365     #####:  234:  smallJsont *r = NULL;
    366         -:  235:
    367     #####:  236:  initiateAllocateNetSerial(&r);
    368 call    0 never executed
    369     #####:  237:  ret r;
    370         -:  238:}
    371         -:  239:
    372         -:  240:
    373 function helpNetSerial called 0 returned 0% blocks executed 0%
    374     #####:  241:internal const char* helpNetSerial(smallJsont UNUSED *self) {
    375     #####:  242:  ret "TODO helpNetSerial \n" helpTextSmallJson;
    376         -:  243:}
    377         -:  244:
    378         -:  245:/**
    379         -:  246: * encode type in lower nibble, uint value in high nibble and next bytes as varuint
    380         -:  247: */
    381 function uintToNetTypeVarint called 120 returned 100% blocks executed 100%
    382       120:  248:internal void uintToNetTypeVarint(sBytest **buf, u8 type, u64 value) {
    383       120:  249:  u64 c = value;
    384         -:  250:  /* encode b0..2 */
    385       120:  251:  u8  b = type + ((c & 0x7) << 4);
    386       120:  252:  if (c & 0xFFFFFFFFFFFFFFF8) {
    387 branch  0 taken 10% (fallthrough)
    388 branch  1 taken 90%
    389        12:  253:    b |= 0x80;
    390        12:  254:    sBytesPush(buf, b);
    391 call    0 returned 100%
    392        12:  255:    c >>=3;
    393         -:  256:    /* encode b3..9 ...*/
    394        49:  257:    while(c) {
    395 branch  0 taken 68%
    396 branch  1 taken 32%
    397        25:  258:      b = c & 0x7F;
    398        25:  259:      if (c & 0xFFFFFFFFFFFFFF80)
    399 branch  0 taken 52% (fallthrough)
    400 branch  1 taken 48%
    401        13:  260:        b |= 0x80;
    402        25:  261:      sBytesPush(buf, b);
    403 call    0 returned 100%
    404        25:  262:      c >>=7;
    405         -:  263:    }
    406         -:  264:  }
    407         -:  265:  else
    408       108:  266:    sBytesPush(buf, b);
    409 call    0 returned 100%
    410       120:  267:}
    411         -:  268:
    412         -:  269:/**
    413         -:  270: * encode uint as varuint
    414         -:  271: */
    415 function uintToVarint called 191 returned 100% blocks executed 90%
    416       191:  272:internal void uintToVarint(sBytest **buf, u64 value) {
    417       191:  273:  u64 c = value;
    418       191:  274:  u8  b = c & 0x7F;
    419       191:  275:  if (c & 0xFFFFFFFFFFFFFF80) {
    420 branch  0 taken 2% (fallthrough)
    421 branch  1 taken 98%
    422         3:  276:    b |= 0x80;
    423         3:  277:    sBytesPush(buf, b);
    424 call    0 returned 100%
    425         3:  278:    c >>=7;
    426         -:  279:    /* encode b7..14 ...*/
    427         9:  280:    while(c) {
    428 branch  0 taken 50%
    429 branch  1 taken 50%
    430         3:  281:      b = c & 0x7F;
    431         3:  282:      if (c & 0xFFFFFFFFFFFFFF80)
    432 branch  0 taken 0% (fallthrough)
    433 branch  1 taken 100%
    434     #####:  283:        b |= 0x80;
    435         3:  284:      sBytesPush(buf, b);
    436 call    0 returned 100%
    437         3:  285:      c >>=7;
    438         -:  286:    }
    439         -:  287:  }
    440         -:  288:  else
    441       188:  289:    sBytesPush(buf, b);
    442 call    0 returned 100%
    443       191:  290:}
    444         -:  291:
    445         -:  292:/**
    446         -:  293: * decode type and varuint to uint
    447         -:  294: */
    448 function netTypeVarintToUint called 120 returned 100% blocks executed 100%
    449       120:  295:internal u64 netTypeVarintToUint(u8 **buf) {
    450       120:  296:  u64 r = 0;
    451         -:  297:
    452       120:  298:  r = (**buf >> 4) & 0x7;
    453         -:  299:
    454       120:  300:  u8 c = 0;
    455       265:  301:  while (**buf & 0x80) {
    456 branch  0 taken 17%
    457 branch  1 taken 83% (fallthrough)
    458        25:  302:    (*buf)++;
    459         -:  303:    // note: keep 0x7FUL to use 64 bit shift operation, without UL a 32 bit shift operation is use and then casted to 64 bit
    460        25:  304:    r |= (**buf & 0x7FUL) << (7*c+3);
    461        25:  305:    c++;
    462         -:  306:  }
    463       120:  307:  (*buf)++;
    464       120:  308:  ret r;
    465         -:  309:}
    466         -:  310:
    467         -:  311:/**
    468         -:  312: * decode varuint to uint
    469         -:  313: */
    470 function varintToUint called 191 returned 100% blocks executed 100%
    471       191:  314:internal u64 varintToUint(u8 **buf) {
    472       191:  315:  u64 r = 0;
    473         -:  316:
    474       191:  317:  r = (**buf) & 0x7F;
    475       191:  318:  u8 c = 1;
    476       385:  319:  while (**buf & 0x80) {
    477 branch  0 taken 2%
    478 branch  1 taken 98% (fallthrough)
    479         3:  320:    (*buf)++;
    480         -:  321:    // note: keep 0x7FUL to use 64 bit shift operation, without UL a 32 bit shift operation is use and then casted to 64 bit
    481         3:  322:    r |= (**buf & 0x7FUL) << (7*c);
    482         3:  323:    c++;
    483         -:  324:  }
    484       191:  325:  (*buf)++;
    485       191:  326:  ret r;
    486         -:  327:}
    487         -:  328:
    488         -:  329:// -------------------------------------
    489         -:  330:// Serializers
    490         -:  331:
    491         -:  332:// level 0
    492         -:  333:// like smallJson with ints and length encoded as varints
    493         -:  334:
    494         -:  335:/**
    495         -:  336: * serializer top function
    496         -:  337: */
    497 function netSerialLevel0 called 0 returned 0% blocks executed 0%
    498     #####:  338:internal sBytest* netSerialLevel0(smallt *o) {
    499     #####:  339:  sBytest *r = NULL;
    500     #####:  340:  sBytest *B = NULL;
    501         -:  341:
    502     #####:  342:  switch(o->type) {
    503 branch  0 never executed
    504 branch  1 never executed
    505 branch  2 never executed
    506 branch  3 never executed
    507 branch  4 never executed
    508 branch  5 never executed
    509 branch  6 never executed
    510 branch  7 never executed
    511 branch  8 never executed
    512 branch  9 never executed
    513         -:  343:    case UNDEFINED:
    514     #####:  344:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
    515 call    0 never executed
    516     #####:  345:      break;
    517         -:  346:    case BOOL: {
    518     #####:  347:      u8 c = NET_SERIAL_TYPES[(u8)o->type];
    519         -:  348:      // set bit 4 when true
    520     #####:  349:      if (((sBoolt *)&(o->type))->value)
    521 branch  0 never executed
    522 branch  1 never executed
    523     #####:  350:        c |= (1<<4);
    524     #####:  351:      sBytesPush(&r, c);
    525 call    0 never executed
    526         -:  352:      }
    527     #####:  353:      break;
    528         -:  354:    case CONTAINER:
    529         -:  355:      // undefined
    530     #####:  356:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
    531 call    0 never executed
    532     #####:  357:      break;
    533         -:  358:    case DICT:
    534     #####:  359:      dictNetSerialLevel0(&r, (sDictt *)&(o->type));
    535 call    0 never executed
    536     #####:  360:      break;
    537         -:  361:    case DOUBLE:
    538     #####:  362:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
    539 call    0 never executed
    540     #####:  363:      sBytesPushBuffer(&r, &((sDoublet *)&(o->type))->value, sizeof(double));
    541 call    0 never executed
    542     #####:  364:      break;
    543         -:  365:    case INT: {
    544         -:  366:      // encode int to varint
    545         -:  367:      // v is int64_t to convert to varint
    546     #####:  368:      i64 v = ((sIntt *)&(o->type))->value;
    547         -:  369:      // encode v with arithmetic shifts
    548     #####:  370:      uintToNetTypeVarint(&r, NET_SERIAL_TYPES[(u8)o->type], (v << 1) ^ (v >> 63));
    549 call    0 never executed
    550         -:  371:      }
    551     #####:  372:      break;
    552         -:  373:    case STRING:
    553     #####:  374:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
    554 call    0 never executed
    555     #####:  375:      sBytesPushBuffer(&r, &((sStringt *)&(o->type))->data, sizeof(sStringt) + strlen(&(((sStringt *)&(o->type))->data)) -1);
    556 call    0 never executed
    557     #####:  376:      break;
    558         -:  377:    case ARRAY:
    559     #####:  378:      arrayNetSerialLevel0(&r, (sArrayt *)&(o->type));
    560 call    0 never executed
    561     #####:  379:      break;
    562         -:  380:    case BYTES:
    563     #####:  381:      B = (sBytest *)&(o->type);
    564     #####:  382:      uintToNetTypeVarint(&r, NET_SERIAL_TYPES[(u8)o->type], B->count);
    565 call    0 never executed
    566     #####:  383:      sBytesPushBuffer(&r, &(B->data), B->count);
    567 call    0 never executed
    568     #####:  384:      break;
    569         -:  385:  }
    570     #####:  386:  ret r;
    571         -:  387:}
    572         -:  388:
    573         -:  389:/**
    574         -:  390: * serialize dictionary
    575         -:  391: *
    576         -:  392: * the serialized dict is pushed to r.
    577         -:  393: * All elements are serialized recursively
    578         -:  394: *
    579         -:  395: * the data in containers is not serialized
    580         -:  396: *
    581         -:  397: * \param
    582         -:  398: *   r small bytes object
    583         -:  399: *   dict dictionary to serialize
    584         -:  400: */
    585 function dictNetSerialLevel0 called 0 returned 0% blocks executed 0%
    586     #####:  401:internal void dictNetSerialLevel0(sBytest **r, sDictt *dict) {
    587     #####:  402:  sBytest *B = NULL;
    588         -:  403:
    589     #####:  404:  uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)dict->type], dict->count);
    590 call    0 never executed
    591         -:  405:
    592     #####:  406:  forEachSDict(dict, e) {
    593 branch  0 never executed
    594 branch  1 never executed
    595     #####:  407:    if (e->key) {
    596 branch  0 never executed
    597 branch  1 never executed
    598     #####:  408:      sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
    599 call    0 never executed
    600         -:  409:
    601     #####:  410:      switch(e->data->type) {
    602 branch  0 never executed
    603 branch  1 never executed
    604 branch  2 never executed
    605 branch  3 never executed
    606 branch  4 never executed
    607 branch  5 never executed
    608 branch  6 never executed
    609 branch  7 never executed
    610 branch  8 never executed
    611 branch  9 never executed
    612         -:  411:        case UNDEFINED:
    613     #####:  412:          sBytesPush(r, NET_SERIAL_TYPES[(u8)e->data->type]);
    614 call    0 never executed
    615     #####:  413:          break;
    616         -:  414:        case BOOL: {
    617     #####:  415:            u8 c = NET_SERIAL_TYPES[(u8)e->data->type];
    618         -:  416:            // set bit 4 when true
    619     #####:  417:            if (((sBoolt *)(e->data))->value)
    620 branch  0 never executed
    621 branch  1 never executed
    622     #####:  418:              c |= (1<<4);
    623     #####:  419:            sBytesPush(r, c);
    624 call    0 never executed
    625         -:  420:           }
    626     #####:  421:          break;
    627         -:  422:        case CONTAINER:
    628         -:  423:          // undefined
    629     #####:  424:          sBytesPush(r, NET_SERIAL_TYPES[(u8)e->data->type]);
    630 call    0 never executed
    631     #####:  425:          break;
    632         -:  426:        case DICT:
    633     #####:  427:          dictNetSerialLevel0(r, (sDictt *)(e->data));
    634 call    0 never executed
    635     #####:  428:          break;
    636         -:  429:        case DOUBLE:
    637     #####:  430:          sBytesPush(r, NET_SERIAL_TYPES[(u8)e->data->type]);
    638 call    0 never executed
    639     #####:  431:          sBytesPushBuffer(r, &((sDoublet *)(e->data))->value, sizeof(double));
    640 call    0 never executed
    641     #####:  432:          break;
    642         -:  433:        case INT: {
    643         -:  434:            // encode int to varint
    644         -:  435:            // v is int64_t to convert to varint
    645     #####:  436:            i64 v = ((sIntt *)(e->data))->value;
    646         -:  437:            // encode v with arithmetic shifts
    647     #####:  438:            uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->data->type], (v << 1) ^ (v >> 63));
    648 call    0 never executed
    649         -:  439:           }
    650     #####:  440:          break;
    651         -:  441:        case STRING:
    652     #####:  442:          sBytesPush(r, NET_SERIAL_TYPES[(u8)e->data->type]);
    653 call    0 never executed
    654     #####:  443:          sBytesPushBuffer(r, &((sStringt *)(e->data))->data, sizeof(sStringt) + strlen(&(((sStringt *)(e->data))->data)) -1);
    655 call    0 never executed
    656     #####:  444:          break;
    657         -:  445:        case ARRAY:
    658     #####:  446:          arrayNetSerialLevel0(r, (sArrayt *)(e->data));
    659 call    0 never executed
    660     #####:  447:          break;
    661         -:  448:        case BYTES:
    662     #####:  449:          B = (sBytest *)(e->data);
    663     #####:  450:          uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->data->type], B->count);
    664 call    0 never executed
    665     #####:  451:          sBytesPushBuffer(r, &(B->data), B->count);
    666 call    0 never executed
    667     #####:  452:          break;
    668         -:  453:       }
    669         -:  454:     }
    670         -:  455:  }
    671     #####:  456:  ret;
    672         -:  457:}
    673         -:  458:
    674         -:  459:/**
    675         -:  460: * serialize array
    676         -:  461: *
    677         -:  462: * the serialized array is pushed to r.
    678         -:  463: * All elements are serialized recursively
    679         -:  464: *
    680         -:  465: * the data in containers is not serialized
    681         -:  466: *
    682         -:  467: * \param
    683         -:  468: *   r small bytes object
    684         -:  469: *   array to serialize
    685         -:  470: */
    686 function arrayNetSerialLevel0 called 0 returned 0% blocks executed 0%
    687     #####:  471:internal void arrayNetSerialLevel0(sBytest **r, sArrayt *array) {
    688     #####:  472:  sBytest *B = NULL;
    689         -:  473:
    690     #####:  474:  uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)array->type], array->count);
    691 call    0 never executed
    692         -:  475:
    693     #####:  476:  forEachSArray(array, e) {
    694 branch  0 never executed
    695 branch  1 never executed
    696     #####:  477:    if (!e) {
    697 branch  0 never executed
    698 branch  1 never executed
    699         -:  478:      // empty slots are represented as undefined elements
    700     #####:  479:      sBytesPush(r, NET_SERIAL_TYPES[UNDEFINED]);
    701 call    0 never executed
    702         -:  480:    }
    703         -:  481:    else {
    704     #####:  482:      switch(e->type) {
    705 branch  0 never executed
    706 branch  1 never executed
    707 branch  2 never executed
    708 branch  3 never executed
    709 branch  4 never executed
    710 branch  5 never executed
    711 branch  6 never executed
    712 branch  7 never executed
    713 branch  8 never executed
    714 branch  9 never executed
    715         -:  483:        case UNDEFINED:
    716     #####:  484:          sBytesPush(r, NET_SERIAL_TYPES[(u8)e->type]);
    717 call    0 never executed
    718     #####:  485:          break;
    719         -:  486:        case BOOL: {
    720     #####:  487:            u8 c = NET_SERIAL_TYPES[(u8)e->type];
    721         -:  488:            // set bit 4 when true
    722     #####:  489:            if (((sBoolt *)&(e->type))->value)
    723 branch  0 never executed
    724 branch  1 never executed
    725     #####:  490:              c |= (1<<4);
    726     #####:  491:            sBytesPush(r, c);
    727 call    0 never executed
    728         -:  492:          }
    729     #####:  493:          break;
    730         -:  494:        case CONTAINER:
    731         -:  495:          // undefined
    732     #####:  496:          sBytesPush(r, NET_SERIAL_TYPES[(u8)e->type]);
    733 call    0 never executed
    734     #####:  497:          break;
    735         -:  498:        case DICT:
    736     #####:  499:          dictNetSerialLevel0(r, (sDictt *)e);
    737 call    0 never executed
    738     #####:  500:          break;
    739         -:  501:        case DOUBLE:
    740     #####:  502:          sBytesPush(r, NET_SERIAL_TYPES[(u8)e->type]);
    741 call    0 never executed
    742     #####:  503:          sBytesPushBuffer(r, &((sDoublet *)e)->value, sizeof(double));
    743 call    0 never executed
    744     #####:  504:          break;
    745         -:  505:        case INT: {
    746         -:  506:            // encode int to varint
    747         -:  507:            // v is int64_t to convert to varint
    748     #####:  508:            i64 v = ((sIntt *)&(e->type))->value;
    749         -:  509:            // encode v with arithmetic shifts
    750     #####:  510:            uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->type], (v << 1) ^ (v >> 63));
    751 call    0 never executed
    752         -:  511:          }
    753     #####:  512:          break;
    754         -:  513:        case STRING:
    755     #####:  514:          sBytesPush(r, NET_SERIAL_TYPES[(u8)e->type]);
    756 call    0 never executed
    757     #####:  515:          sBytesPushBuffer(r, &((sStringt *)e)->data, sizeof(sStringt) + strlen(&(((sStringt *)e)->data)) -1);
    758 call    0 never executed
    759     #####:  516:          break;
    760         -:  517:        case ARRAY:
    761     #####:  518:          arrayNetSerialLevel0(r, (sArrayt *)e);
    762 call    0 never executed
    763     #####:  519:          break;
    764         -:  520:        case BYTES:
    765     #####:  521:          B = (sBytest *)e;
    766     #####:  522:          uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->type], B->count);
    767 call    0 never executed
    768     #####:  523:          sBytesPushBuffer(r, &(B->data), B->count);
    769 call    0 never executed
    770     #####:  524:          break;
    771         -:  525:      }
    772         -:  526:    }
    773         -:  527:  }
    774     #####:  528:  ret;
    775         -:  529:}
    776         -:  530:
    777 function serialNetSerialLevel0 called 0 returned 0% blocks executed 0%
    778     #####:  531:internal smallBytest* serialNetSerialLevel0(smallJsont *self) {
    779         -:  532:
    780     #####:  533:  smallt *o = getsoG(self);
    781 call    0 never executed
    782         -:  534:
    783     #####:  535:  if (o == NULL)
    784 branch  0 never executed
    785 branch  1 never executed
    786     #####:  536:    ret NULL;
    787         -:  537:
    788     #####:  538:  sBytest *B = netSerialLevel0(o);
    789 call    0 never executed
    790         -:  539:
    791     #####:  540:  if (!B) {
    792 branch  0 never executed
    793 branch  1 never executed
    794     #####:  541:    ret NULL;
    795         -:  542:  }
    796         -:  543:
    797     #####:  544:  createAllocateSmallBytes(r);
    798 call    0 never executed
    799     #####:  545:  r->B = B;
    800     #####:  546:  ret r;
    801         -:  547:}
    802         -:  548:
    803         -:  549:// level 1
    804         -:  550:// like level 0 with type encoded in nibbles and bools are packed
    805         -:  551:
    806         -:  552:/**
    807         -:  553: * serializer top function
    808         -:  554: */
    809 function netSerialLevel1 called 0 returned 0% blocks executed 0%
    810     #####:  555:internal sBytest* netSerialLevel1(smallt *o) {
    811     #####:  556:  sBytest *r = NULL;
    812     #####:  557:  sBytest *B = NULL;
    813     #####:  558:  contextt ctx = {.nibble=lowNbl, .nblOffset=0, .boolShift = 0, .boolOffset=0};
    814         -:  559:
    815     #####:  560:  switch(o->type) {
    816 branch  0 never executed
    817 branch  1 never executed
    818 branch  2 never executed
    819 branch  3 never executed
    820 branch  4 never executed
    821 branch  5 never executed
    822 branch  6 never executed
    823 branch  7 never executed
    824 branch  8 never executed
    825         -:  561:    case UNDEFINED:
    826         -:  562:    case CONTAINER:
    827     #####:  563:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
    828 call    0 never executed
    829     #####:  564:      break;
    830         -:  565:    case BOOL: {
    831     #####:  566:      u8 c = NET_SERIAL_TYPES[(u8)o->type];
    832         -:  567:      // set bit 4 when true
    833     #####:  568:      if (((sBoolt *)&(o->type))->value)
    834 branch  0 never executed
    835 branch  1 never executed
    836     #####:  569:        c |= (1<<4);
    837     #####:  570:      sBytesPush(&r, c);
    838 call    0 never executed
    839         -:  571:      }
    840     #####:  572:      break;
    841         -:  573:    case DICT:
    842     #####:  574:      dictNetSerialLevel1(&r, (sDictt *)&(o->type), &ctx);
    843 call    0 never executed
    844     #####:  575:      break;
    845         -:  576:    case DOUBLE:
    846     #####:  577:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
    847 call    0 never executed
    848     #####:  578:      sBytesPushBuffer(&r, &((sDoublet *)&(o->type))->value, sizeof(double));
    849 call    0 never executed
    850     #####:  579:      break;
    851         -:  580:    case INT: {
    852         -:  581:      // encode int to varint
    853         -:  582:      // v is int64_t to convert to varint
    854     #####:  583:      i64 v = ((sIntt *)&(o->type))->value;
    855         -:  584:      // encode v with arithmetic shifts
    856     #####:  585:      uintToNetTypeVarint(&r, NET_SERIAL_TYPES[(u8)o->type], (v << 1) ^ (v >> 63));
    857 call    0 never executed
    858         -:  586:      }
    859     #####:  587:      break;
    860         -:  588:    case STRING:
    861     #####:  589:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
    862 call    0 never executed
    863     #####:  590:      sBytesPushBuffer(&r, &((sStringt *)&(o->type))->data, sizeof(sStringt) + strlen(&(((sStringt *)&(o->type))->data)) -1);
    864 call    0 never executed
    865     #####:  591:      break;
    866         -:  592:    case ARRAY:
    867     #####:  593:      arrayNetSerialLevel1(&r, (sArrayt *)&(o->type), &ctx);
    868 call    0 never executed
    869     #####:  594:      break;
    870         -:  595:    case BYTES:
    871     #####:  596:      B = (sBytest *)&(o->type);
    872     #####:  597:      uintToNetTypeVarint(&r, NET_SERIAL_TYPES[(u8)o->type], B->count);
    873 call    0 never executed
    874     #####:  598:      sBytesPushBuffer(&r, &(B->data), B->count);
    875 call    0 never executed
    876     #####:  599:      break;
    877         -:  600:  }
    878     #####:  601:  ret r;
    879         -:  602:}
    880         -:  603:
    881         -:  604:/**
    882         -:  605: * serialize dictionary
    883         -:  606: *
    884         -:  607: * the serialized dict is pushed to r.
    885         -:  608: * All elements are serialized recursively
    886         -:  609: *
    887         -:  610: * the data in containers is not serialized
    888         -:  611: *
    889         -:  612: * \param
    890         -:  613: *   r small bytes object
    891         -:  614: *   dict dictionary to serialize
    892         -:  615: */
    893 function dictNetSerialLevel1 called 0 returned 0% blocks executed 0%
    894     #####:  616:internal void dictNetSerialLevel1(sBytest **r, sDictt *dict, contextt *ctx) {
    895     #####:  617:  sBytest *B     = NULL;
    896     #####:  618:  char    *data  = NULL;
    897         -:  619:
    898     #####:  620:  if (ctx->nibble == lowNbl) {
    899 branch  0 never executed
    900 branch  1 never executed
    901     #####:  621:    uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)dict->type], dict->count);
    902 call    0 never executed
    903         -:  622:  }
    904         -:  623:  else {
    905         -:  624:    // high nibble
    906         -:  625:    #define storeTypeInHighNbl(o)\
    907         -:  626:    ctx->nibble  = lowNbl;\
    908         -:  627:    data         = (char *)&((*r)->data) + ctx->nblOffset;\
    909         -:  628:    *data       |= NET_SERIAL_TYPES[(u8)o->type] << 4
    910     #####:  629:    storeTypeInHighNbl(dict);
    911     #####:  630:    uintToVarint(r, dict->count);
    912 call    0 never executed
    913         -:  631:  }
    914         -:  632:
    915     #####:  633:  forEachSDict(dict, e) {
    916 branch  0 never executed
    917 branch  1 never executed
    918     #####:  634:    if (e->key) {
    919 branch  0 never executed
    920 branch  1 never executed
    921     #####:  635:      sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
    922 call    0 never executed
    923         -:  636:
    924     #####:  637:      switch(e->data->type) {
    925 branch  0 never executed
    926 branch  1 never executed
    927 branch  2 never executed
    928 branch  3 never executed
    929 branch  4 never executed
    930 branch  5 never executed
    931 branch  6 never executed
    932 branch  7 never executed
    933 branch  8 never executed
    934         -:  638:        case UNDEFINED:
    935         -:  639:        case CONTAINER:
    936     #####:  640:          if (ctx->nibble == lowNbl) {
    937 branch  0 never executed
    938 branch  1 never executed
    939         -:  641:            #define storeTypeOnly(o)\
    940         -:  642:            sBytesPush(r, NET_SERIAL_TYPES[(u8)o->type]);\
    941         -:  643:            ctx->nibble    = highNbl;\
    942         -:  644:            ctx->nblOffset = (*r)->count -1
    943     #####:  645:            storeTypeOnly(e->data);
    944 call    0 never executed
    945         -:  646:          }
    946         -:  647:          else {
    947     #####:  648:            storeTypeInHighNbl(e->data);
    948         -:  649:          }
    949     #####:  650:          break;
    950         -:  651:        case BOOL:
    951     #####:  652:          if (!ctx->boolOffset) {
    952 branch  0 never executed
    953 branch  1 never executed
    954         -:  653:            // new packed bools
    955     #####:  654:            if (ctx->nibble == lowNbl) {
    956 branch  0 never executed
    957 branch  1 never executed
    958         -:  655:              #define storeNew4bPackedBool(o)\
    959         -:  656:              u8 c = NET_SERIAL_TYPES[(u8)o->type];\
    960         -:  657:              /* set bit 4 when true */\
    961         -:  658:              if (((sBoolt *)(o))->value)\
    962         -:  659:                c |= (1<<4);\
    963         -:  660:              sBytesPush(r, c);\
    964         -:  661:              ctx->boolShift  = 5;\
    965         -:  662:              ctx->boolOffset = (*r)->count -1
    966     #####:  663:              storeNew4bPackedBool(e->data);
    967 branch  0 never executed
    968 branch  1 never executed
    969 call    2 never executed
    970         -:  664:            }
    971         -:  665:            else {
    972         -:  666:              // high nibble, next byte is packed bools
    973     #####:  667:              storeTypeInHighNbl(e->data);
    974         -:  668:              #define storeNew8bPackedBool(o)\
    975         -:  669:              u8 c         = 0;\
    976         -:  670:              if (((sBoolt *)(o))->value)\
    977         -:  671:                c = 1;\
    978         -:  672:              sBytesPush(r, c);\
    979         -:  673:              ctx->boolShift  = 1;\
    980         -:  674:              ctx->boolOffset = (*r)->count -1
    981     #####:  675:              storeNew8bPackedBool(e->data);
    982 branch  0 never executed
    983 branch  1 never executed
    984 call    2 never executed
    985         -:  676:            }
    986         -:  677:          }
    987         -:  678:          else {
    988         -:  679:            // there was a bool before this one, fill bits in nibbles
    989     #####:  680:            if (ctx->nibble == lowNbl) {
    990 branch  0 never executed
    991 branch  1 never executed
    992     #####:  681:              if (ctx->boolShift == 8) {
    993 branch  0 never executed
    994 branch  1 never executed
    995         -:  682:                // previous packed bool is full
    996         -:  683:                // this byte is the new packed bools
    997     #####:  684:                storeNew4bPackedBool(e->data);
    998 branch  0 never executed
    999 branch  1 never executed
   1000 call    2 never executed
   1001         -:  685:              }
   1002         -:  686:              else {
   1003     #####:  687:                storeTypeOnly(e->data);
   1004 call    0 never executed
   1005         -:  688:                #define storeBool(o)\
   1006         -:  689:                data           = (char *)&((*r)->data) + ctx->boolOffset;\
   1007         -:  690:                if (((sBoolt *)(o))->value)\
   1008         -:  691:                  *data |= 1 << ctx->boolShift;\
   1009         -:  692:                ctx->boolShift++
   1010     #####:  693:                storeBool(e->data);
   1011 branch  0 never executed
   1012 branch  1 never executed
   1013         -:  694:              }
   1014         -:  695:            }
   1015         -:  696:            else {
   1016         -:  697:              // high nibble
   1017     #####:  698:              storeTypeInHighNbl(e->data);
   1018     #####:  699:              if (ctx->boolShift == 8) {
   1019 branch  0 never executed
   1020 branch  1 never executed
   1021         -:  700:                // previous packed bool is full
   1022         -:  701:                // next byte is the new packed bools
   1023     #####:  702:                storeNew8bPackedBool(e->data);
   1024 branch  0 never executed
   1025 branch  1 never executed
   1026 call    2 never executed
   1027         -:  703:              }
   1028         -:  704:              else {
   1029     #####:  705:                storeBool(e->data);
   1030 branch  0 never executed
   1031 branch  1 never executed
   1032         -:  706:              }
   1033         -:  707:            }
   1034         -:  708:          }
   1035     #####:  709:          break;
   1036         -:  710:        case DICT:
   1037     #####:  711:          dictNetSerialLevel1(r, (sDictt *)(e->data), ctx);
   1038 call    0 never executed
   1039     #####:  712:          break;
   1040         -:  713:        case DOUBLE:
   1041     #####:  714:          if (ctx->nibble == lowNbl) {
   1042 branch  0 never executed
   1043 branch  1 never executed
   1044     #####:  715:            storeTypeOnly(e->data);
   1045 call    0 never executed
   1046         -:  716:          }
   1047         -:  717:          else {
   1048         -:  718:            // high nibble
   1049     #####:  719:            storeTypeInHighNbl(e->data);
   1050         -:  720:          }
   1051     #####:  721:          sBytesPushBuffer(r, &((sDoublet *)(e->data))->value, sizeof(double));
   1052 call    0 never executed
   1053     #####:  722:          break;
   1054         -:  723:        case INT: {
   1055         -:  724:            // encode int to varint
   1056         -:  725:            // v is int64_t to convert to varint
   1057     #####:  726:            i64 v = ((sIntt *)(e->data))->value;
   1058     #####:  727:            if (ctx->nibble == lowNbl) {
   1059 branch  0 never executed
   1060 branch  1 never executed
   1061         -:  728:              // encode v with arithmetic shifts
   1062     #####:  729:              uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->data->type], (v << 1) ^ (v >> 63));
   1063 call    0 never executed
   1064         -:  730:            }
   1065         -:  731:            else {
   1066         -:  732:              // high nibble
   1067     #####:  733:              storeTypeInHighNbl(e->data);
   1068     #####:  734:              uintToVarint(r, (v << 1) ^ (v >> 63));
   1069 call    0 never executed
   1070         -:  735:            }
   1071         -:  736:          }
   1072     #####:  737:          break;
   1073         -:  738:        case STRING:
   1074     #####:  739:          if (ctx->nibble == lowNbl) {
   1075 branch  0 never executed
   1076 branch  1 never executed
   1077     #####:  740:            storeTypeOnly(e->data);
   1078 call    0 never executed
   1079         -:  741:          }
   1080         -:  742:          else {
   1081         -:  743:            // high nibble
   1082     #####:  744:            storeTypeInHighNbl(e->data);
   1083         -:  745:          }
   1084     #####:  746:          sBytesPushBuffer(r, &((sStringt *)(e->data))->data, sizeof(sStringt) + strlen(&(((sStringt *)(e->data))->data)) -1);
   1085 call    0 never executed
   1086     #####:  747:          break;
   1087         -:  748:        case ARRAY:
   1088     #####:  749:          arrayNetSerialLevel1(r, (sArrayt *)(e->data), ctx);
   1089 call    0 never executed
   1090     #####:  750:          break;
   1091         -:  751:        case BYTES:
   1092     #####:  752:          B = (sBytest *)(e->data);
   1093     #####:  753:          if (ctx->nibble == lowNbl) {
   1094 branch  0 never executed
   1095 branch  1 never executed
   1096     #####:  754:            uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->data->type], B->count);
   1097 call    0 never executed
   1098         -:  755:          }
   1099         -:  756:          else {
   1100         -:  757:            // high nibble
   1101     #####:  758:            storeTypeInHighNbl(e->data);
   1102     #####:  759:            uintToVarint(r, B->count);
   1103 call    0 never executed
   1104         -:  760:          }
   1105     #####:  761:          sBytesPushBuffer(r, &(B->data), B->count);
   1106 call    0 never executed
   1107     #####:  762:          break;
   1108         -:  763:      }
   1109         -:  764:    }
   1110         -:  765:  }
   1111     #####:  766:  ret;
   1112         -:  767:}
   1113         -:  768:
   1114         -:  769:/**
   1115         -:  770: * serialize array
   1116         -:  771: *
   1117         -:  772: * the serialized array is pushed to r.
   1118         -:  773: * All elements are serialized recursively
   1119         -:  774: *
   1120         -:  775: * the data in containers is not serialized
   1121         -:  776: *
   1122         -:  777: * \param
   1123         -:  778: *   r small bytes object
   1124         -:  779: *   array to serialize
   1125         -:  780: */
   1126 function arrayNetSerialLevel1 called 0 returned 0% blocks executed 0%
   1127     #####:  781:internal void arrayNetSerialLevel1(sBytest **r, sArrayt *array, contextt *ctx) {
   1128     #####:  782:  sBytest *B     = NULL;
   1129     #####:  783:  char    *data  = NULL;
   1130         -:  784:
   1131     #####:  785:  if (ctx->nibble == lowNbl) {
   1132 branch  0 never executed
   1133 branch  1 never executed
   1134     #####:  786:    uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)array->type], array->count);
   1135 call    0 never executed
   1136         -:  787:  }
   1137         -:  788:  else {
   1138         -:  789:    // high nibble
   1139     #####:  790:    storeTypeInHighNbl(array);
   1140     #####:  791:    uintToVarint(r, array->count);
   1141 call    0 never executed
   1142         -:  792:  }
   1143         -:  793:
   1144     #####:  794:  forEachSArray(array, e) {
   1145 branch  0 never executed
   1146 branch  1 never executed
   1147     #####:  795:    if (!e) {
   1148 branch  0 never executed
   1149 branch  1 never executed
   1150         -:  796:      // empty slots are represented as undefined elements
   1151     #####:  797:      if (ctx->nibble == lowNbl) {
   1152 branch  0 never executed
   1153 branch  1 never executed
   1154     #####:  798:        sBytesPush(r, NET_SERIAL_TYPES[UNDEFINED]);
   1155 call    0 never executed
   1156     #####:  799:        ctx->nibble    = highNbl;
   1157     #####:  800:        ctx->nblOffset = (*r)->count -1;
   1158         -:  801:      }
   1159         -:  802:      else {
   1160         -:  803:        // high nibble
   1161     #####:  804:        ctx->nibble  = lowNbl;
   1162     #####:  805:        data         = (char *)&((*r)->data) + ctx->nblOffset;
   1163     #####:  806:        *data       |= NET_SERIAL_TYPES[UNDEFINED] << 4;
   1164         -:  807:      }
   1165         -:  808:    }
   1166         -:  809:    else {
   1167     #####:  810:      switch(e->type) {
   1168 branch  0 never executed
   1169 branch  1 never executed
   1170 branch  2 never executed
   1171 branch  3 never executed
   1172 branch  4 never executed
   1173 branch  5 never executed
   1174 branch  6 never executed
   1175 branch  7 never executed
   1176 branch  8 never executed
   1177         -:  811:        case UNDEFINED:
   1178         -:  812:        case CONTAINER:
   1179     #####:  813:          if (ctx->nibble == lowNbl) {
   1180 branch  0 never executed
   1181 branch  1 never executed
   1182     #####:  814:            storeTypeOnly(e);
   1183 call    0 never executed
   1184         -:  815:          }
   1185         -:  816:          else {
   1186         -:  817:            // high nibble
   1187     #####:  818:            storeTypeInHighNbl(e);
   1188         -:  819:          }
   1189     #####:  820:          break;
   1190         -:  821:        case BOOL:
   1191     #####:  822:          if (!ctx->boolOffset) {
   1192 branch  0 never executed
   1193 branch  1 never executed
   1194         -:  823:            // new packed bools
   1195     #####:  824:            if (ctx->nibble == lowNbl) {
   1196 branch  0 never executed
   1197 branch  1 never executed
   1198     #####:  825:              storeNew4bPackedBool(e);
   1199 branch  0 never executed
   1200 branch  1 never executed
   1201 call    2 never executed
   1202         -:  826:            }
   1203         -:  827:            else {
   1204         -:  828:              // high nibble, next byte is packed bools
   1205     #####:  829:              storeTypeInHighNbl(e);
   1206     #####:  830:              storeNew8bPackedBool(e);
   1207 branch  0 never executed
   1208 branch  1 never executed
   1209 call    2 never executed
   1210         -:  831:            }
   1211         -:  832:          }
   1212         -:  833:          else {
   1213         -:  834:            // there was a bool before this one, fill bits in nibbles
   1214     #####:  835:            if (ctx->nibble == lowNbl) {
   1215 branch  0 never executed
   1216 branch  1 never executed
   1217     #####:  836:              if (ctx->boolShift == 8) {
   1218 branch  0 never executed
   1219 branch  1 never executed
   1220         -:  837:                // previous packed bool is full
   1221         -:  838:                // this byte is the new packed bools
   1222     #####:  839:                storeNew4bPackedBool(e);
   1223 branch  0 never executed
   1224 branch  1 never executed
   1225 call    2 never executed
   1226         -:  840:              }
   1227         -:  841:              else {
   1228     #####:  842:                storeTypeOnly(e);
   1229 call    0 never executed
   1230     #####:  843:                storeBool(e);
   1231 branch  0 never executed
   1232 branch  1 never executed
   1233         -:  844:              }
   1234         -:  845:            }
   1235         -:  846:            else {
   1236         -:  847:              // high nibble
   1237     #####:  848:              storeTypeInHighNbl(e);
   1238     #####:  849:              if (ctx->boolShift == 8) {
   1239 branch  0 never executed
   1240 branch  1 never executed
   1241         -:  850:                // previous packed bool is full
   1242         -:  851:                // next byte is the new packed bools
   1243     #####:  852:                storeNew8bPackedBool(e);
   1244 branch  0 never executed
   1245 branch  1 never executed
   1246 call    2 never executed
   1247         -:  853:              }
   1248         -:  854:              else {
   1249     #####:  855:                storeBool(e);
   1250 branch  0 never executed
   1251 branch  1 never executed
   1252         -:  856:              }
   1253         -:  857:            }
   1254         -:  858:          }
   1255     #####:  859:          break;
   1256         -:  860:        case DICT:
   1257     #####:  861:          dictNetSerialLevel1(r, (sDictt *)e, ctx);
   1258 call    0 never executed
   1259     #####:  862:          break;
   1260         -:  863:        case DOUBLE:
   1261     #####:  864:          if (ctx->nibble == lowNbl) {
   1262 branch  0 never executed
   1263 branch  1 never executed
   1264     #####:  865:            storeTypeOnly(e);
   1265 call    0 never executed
   1266         -:  866:          }
   1267         -:  867:          else {
   1268         -:  868:            // high nibble
   1269     #####:  869:            storeTypeInHighNbl(e);
   1270         -:  870:          }
   1271     #####:  871:          sBytesPushBuffer(r, &((sDoublet *)e)->value, sizeof(double));
   1272 call    0 never executed
   1273     #####:  872:          break;
   1274         -:  873:        case INT: {
   1275         -:  874:            // encode int to varint
   1276         -:  875:            // v is int64_t to convert to varint
   1277     #####:  876:            i64 v = ((sIntt *)&(e->type))->value;
   1278     #####:  877:            if (ctx->nibble == lowNbl) {
   1279 branch  0 never executed
   1280 branch  1 never executed
   1281         -:  878:              // encode v with arithmetic shifts
   1282     #####:  879:              uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->type], (v << 1) ^ (v >> 63));
   1283 call    0 never executed
   1284         -:  880:            }
   1285         -:  881:            else {
   1286         -:  882:              // high nibble
   1287     #####:  883:              storeTypeInHighNbl(e);
   1288     #####:  884:              uintToVarint(r, (v << 1) ^ (v >> 63));
   1289 call    0 never executed
   1290         -:  885:            }
   1291         -:  886:          }
   1292     #####:  887:          break;
   1293         -:  888:        case STRING:
   1294     #####:  889:          if (ctx->nibble == lowNbl) {
   1295 branch  0 never executed
   1296 branch  1 never executed
   1297     #####:  890:            storeTypeOnly(e);
   1298 call    0 never executed
   1299         -:  891:          }
   1300         -:  892:          else {
   1301         -:  893:            // high nibble
   1302     #####:  894:            storeTypeInHighNbl(e);
   1303         -:  895:          }
   1304     #####:  896:          sBytesPushBuffer(r, &((sStringt *)e)->data, sizeof(sStringt) + strlen(&(((sStringt *)e)->data)) -1);
   1305 call    0 never executed
   1306     #####:  897:          break;
   1307         -:  898:        case ARRAY:
   1308     #####:  899:          arrayNetSerialLevel1(r, (sArrayt *)e, ctx);
   1309 call    0 never executed
   1310     #####:  900:          break;
   1311         -:  901:        case BYTES:
   1312     #####:  902:          B = (sBytest *)e;
   1313     #####:  903:          if (ctx->nibble == lowNbl) {
   1314 branch  0 never executed
   1315 branch  1 never executed
   1316     #####:  904:            uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->type], B->count);
   1317 call    0 never executed
   1318         -:  905:          }
   1319         -:  906:          else {
   1320         -:  907:            // high nibble
   1321     #####:  908:            storeTypeInHighNbl(e);
   1322     #####:  909:            uintToVarint(r, B->count);
   1323 call    0 never executed
   1324         -:  910:          }
   1325     #####:  911:          sBytesPushBuffer(r, &(B->data), B->count);
   1326 call    0 never executed
   1327     #####:  912:          break;
   1328         -:  913:      }
   1329         -:  914:    }
   1330         -:  915:  }
   1331     #####:  916:  ret;
   1332         -:  917:}
   1333         -:  918:
   1334 function serialNetSerialLevel1 called 0 returned 0% blocks executed 0%
   1335     #####:  919:internal smallBytest* serialNetSerialLevel1(smallJsont *self) {
   1336         -:  920:
   1337     #####:  921:  smallt *o = getsoG(self);
   1338 call    0 never executed
   1339         -:  922:
   1340     #####:  923:  if (o == NULL)
   1341 branch  0 never executed
   1342 branch  1 never executed
   1343     #####:  924:    ret NULL;
   1344         -:  925:
   1345     #####:  926:  sBytest *B = netSerialLevel1(o);
   1346 call    0 never executed
   1347         -:  927:
   1348     #####:  928:  if (!B) {
   1349 branch  0 never executed
   1350 branch  1 never executed
   1351     #####:  929:    ret NULL;
   1352         -:  930:  }
   1353         -:  931:
   1354     #####:  932:  createAllocateSmallBytes(r);
   1355 call    0 never executed
   1356     #####:  933:  r->B = B;
   1357     #####:  934:  ret r;
   1358         -:  935:}
   1359         -:  936:
   1360         -:  937:// level 2
   1361         -:  938:// like level 1, arrays are set to uniform when all elements are same type
   1362         -:  939:
   1363         -:  940:/**
   1364         -:  941: * serializer top function
   1365         -:  942: */
   1366 function netSerialLevel2 called 0 returned 0% blocks executed 0%
   1367     #####:  943:internal sBytest* netSerialLevel2(smallt *o) {
   1368     #####:  944:  sBytest *r = NULL;
   1369     #####:  945:  sBytest *B = NULL;
   1370     #####:  946:  contextt ctx = {.nibble=lowNbl, .nblOffset=0, .boolShift = 0, .boolOffset=0};
   1371         -:  947:
   1372     #####:  948:  switch(o->type) {
   1373 branch  0 never executed
   1374 branch  1 never executed
   1375 branch  2 never executed
   1376 branch  3 never executed
   1377 branch  4 never executed
   1378 branch  5 never executed
   1379 branch  6 never executed
   1380 branch  7 never executed
   1381 branch  8 never executed
   1382         -:  949:    case UNDEFINED:
   1383         -:  950:    case CONTAINER:
   1384     #####:  951:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
   1385 call    0 never executed
   1386     #####:  952:      break;
   1387         -:  953:    case BOOL: {
   1388     #####:  954:      u8 c = NET_SERIAL_TYPES[(u8)o->type];
   1389         -:  955:      // set bit 4 when true
   1390     #####:  956:      if (((sBoolt *)&(o->type))->value)
   1391 branch  0 never executed
   1392 branch  1 never executed
   1393     #####:  957:        c |= (1<<4);
   1394     #####:  958:      sBytesPush(&r, c);
   1395 call    0 never executed
   1396         -:  959:      }
   1397     #####:  960:      break;
   1398         -:  961:    case DICT:
   1399     #####:  962:      dictNetSerialLevel2(&r, (sDictt *)&(o->type), &ctx, /*packed=*/false);
   1400 call    0 never executed
   1401     #####:  963:      break;
   1402         -:  964:    case DOUBLE:
   1403     #####:  965:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
   1404 call    0 never executed
   1405     #####:  966:      sBytesPushBuffer(&r, &((sDoublet *)&(o->type))->value, sizeof(double));
   1406 call    0 never executed
   1407     #####:  967:      break;
   1408         -:  968:    case INT: {
   1409         -:  969:      // encode int to varint
   1410         -:  970:      // v is int64_t to convert to varint
   1411     #####:  971:      i64 v = ((sIntt *)&(o->type))->value;
   1412         -:  972:      // encode v with arithmetic shifts
   1413     #####:  973:      uintToNetTypeVarint(&r, NET_SERIAL_TYPES[(u8)o->type], (v << 1) ^ (v >> 63));
   1414 call    0 never executed
   1415         -:  974:      }
   1416     #####:  975:      break;
   1417         -:  976:    case STRING:
   1418     #####:  977:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
   1419 call    0 never executed
   1420     #####:  978:      sBytesPushBuffer(&r, &((sStringt *)&(o->type))->data, sizeof(sStringt) + strlen(&(((sStringt *)&(o->type))->data)) -1);
   1421 call    0 never executed
   1422     #####:  979:      break;
   1423         -:  980:    case ARRAY:
   1424     #####:  981:      arrayNetSerialLevel2(&r, (sArrayt *)&(o->type), &ctx, /*packed=*/false);
   1425 call    0 never executed
   1426     #####:  982:      break;
   1427         -:  983:    case BYTES:
   1428     #####:  984:      B = (sBytest *)&(o->type);
   1429     #####:  985:      uintToNetTypeVarint(&r, NET_SERIAL_TYPES[(u8)o->type], B->count);
   1430 call    0 never executed
   1431     #####:  986:      sBytesPushBuffer(&r, &(B->data), B->count);
   1432 call    0 never executed
   1433     #####:  987:      break;
   1434         -:  988:  }
   1435     #####:  989:  ret r;
   1436         -:  990:}
   1437         -:  991:
   1438 function isDictUniform called 33 returned 100% blocks executed 69%
   1439        33:  992:internal u8 isDictUniform(sDictt *dict) {
   1440        33:  993:  bool allElementsHaveSameType = true;
   1441        33:  994:  bool foundFirstType          = false;
   1442        33:  995:  u8 type                      = 0;
   1443        66:  996:  forEachSDict(dict, e) {
   1444 branch  0 taken 67%
   1445 branch  1 taken 33% (fallthrough)
   1446        44:  997:    if (e->key) {
   1447 branch  0 taken 100% (fallthrough)
   1448 branch  1 taken 0%
   1449        44:  998:      if (foundFirstType) {
   1450 branch  0 taken 39% (fallthrough)
   1451 branch  1 taken 61%
   1452         -:  999:        u8 nextType;
   1453        17: 1000:        switch(e->data->type) {
   1454 branch  0 taken 0%
   1455 branch  1 taken 0%
   1456 branch  2 taken 100%
   1457         -: 1001:          case DICT:
   1458     #####: 1002:            nextType = isDictUniform((sDictt*)e->data);
   1459 call    0 never executed
   1460     #####: 1003:            break;
   1461         -: 1004:          case ARRAY:
   1462     #####: 1005:            nextType = isArrayUniform((sArrayt*)e->data);
   1463 call    0 never executed
   1464     #####: 1006:            break;
   1465         -: 1007:          default:
   1466        17: 1008:            nextType = NET_SERIAL_TYPES[(u8)e->data->type];
   1467         -: 1009:        }
   1468        17: 1010:        if (nextType != type) {
   1469 branch  0 taken 65% (fallthrough)
   1470 branch  1 taken 35%
   1471        11: 1011:          allElementsHaveSameType = false;
   1472        11: 1012:          break;
   1473         -: 1013:        }
   1474         -: 1014:      }
   1475         -: 1015:      else {
   1476        27: 1016:        switch(e->data->type) {
   1477 branch  0 taken 0%
   1478 branch  1 taken 0%
   1479 branch  2 taken 100%
   1480         -: 1017:          case DICT:
   1481     #####: 1018:            type = isDictUniform((sDictt*)e->data);
   1482 call    0 never executed
   1483     #####: 1019:            break;
   1484         -: 1020:          case ARRAY:
   1485     #####: 1021:            type = isArrayUniform((sArrayt*)e->data);
   1486 call    0 never executed
   1487     #####: 1022:            break;
   1488         -: 1023:          default:
   1489        27: 1024:            type = NET_SERIAL_TYPES[(u8)e->data->type];
   1490         -: 1025:        }
   1491        27: 1026:        foundFirstType = true;
   1492         -: 1027:      }
   1493         -: 1028:    }
   1494         -: 1029:  }
   1495        33: 1030:  if (allElementsHaveSameType)
   1496 branch  0 taken 67% (fallthrough)
   1497 branch  1 taken 33%
   1498        22: 1031:    type = UNIFORM_DICT;
   1499         -: 1032:  else
   1500        11: 1033:    type = S_DICT;
   1501        33: 1034:  ret type;
   1502         -: 1035:}
   1503         -: 1036:
   1504 function isArrayUniform called 30 returned 100% blocks executed 65%
   1505        30: 1037:internal u8 isArrayUniform(sArrayt *array) {
   1506        30: 1038:  bool allElementsHaveSameType = true;
   1507        30: 1039:  bool foundFirstType          = false;
   1508        30: 1040:  char type                    = 0;
   1509        83: 1041:  forEachSArray(array, e) {
   1510 branch  0 taken 75%
   1511 branch  1 taken 25% (fallthrough)
   1512        62: 1042:    if (!e) {
   1513 branch  0 taken 0% (fallthrough)
   1514 branch  1 taken 100%
   1515     #####: 1043:      if (foundFirstType) {
   1516 branch  0 never executed
   1517 branch  1 never executed
   1518     #####: 1044:        if (type != S_UNDEFINED) {
   1519 branch  0 never executed
   1520 branch  1 never executed
   1521     #####: 1045:          allElementsHaveSameType = false;
   1522     #####: 1046:          break;
   1523         -: 1047:        }
   1524         -: 1048:      }
   1525         -: 1049:      else {
   1526     #####: 1050:        type = S_UNDEFINED;
   1527     #####: 1051:        foundFirstType = true;
   1528         -: 1052:      }
   1529         -: 1053:    }
   1530         -: 1054:    else {
   1531        62: 1055:      if (foundFirstType) {
   1532 branch  0 taken 56% (fallthrough)
   1533 branch  1 taken 44%
   1534         -: 1056:        u8 nextType;
   1535        35: 1057:        switch(e->type) {
   1536 branch  0 taken 0%
   1537 branch  1 taken 0%
   1538 branch  2 taken 100%
   1539         -: 1058:          case DICT:
   1540     #####: 1059:            nextType = isDictUniform((sDictt*)e);
   1541 call    0 never executed
   1542     #####: 1060:            break;
   1543         -: 1061:          case ARRAY:
   1544     #####: 1062:            nextType = isArrayUniform((sArrayt*)e);
   1545 call    0 never executed
   1546     #####: 1063:            break;
   1547         -: 1064:          default:
   1548        35: 1065:            nextType = NET_SERIAL_TYPES[(u8)e->type];
   1549         -: 1066:        }
   1550        35: 1067:        if (nextType != type) {
   1551 branch  0 taken 26% (fallthrough)
   1552 branch  1 taken 74%
   1553         9: 1068:          allElementsHaveSameType = false;
   1554         9: 1069:          break;
   1555         -: 1070:        }
   1556         -: 1071:      }
   1557         -: 1072:      else {
   1558        27: 1073:        switch(e->type) {
   1559 branch  0 taken 4%
   1560 branch  1 taken 0%
   1561 branch  2 taken 96%
   1562         -: 1074:          case DICT:
   1563         1: 1075:            type = isDictUniform((sDictt*)e);
   1564 call    0 returned 100%
   1565         1: 1076:            break;
   1566         -: 1077:          case ARRAY:
   1567     #####: 1078:            type = isArrayUniform((sArrayt*)e);
   1568 call    0 never executed
   1569     #####: 1079:            break;
   1570         -: 1080:          default:
   1571        26: 1081:            type = NET_SERIAL_TYPES[(u8)e->type];
   1572         -: 1082:        }
   1573        27: 1083:        foundFirstType = true;
   1574         -: 1084:      }
   1575         -: 1085:    }
   1576         -: 1086:  }
   1577        30: 1087:  if (allElementsHaveSameType)
   1578 branch  0 taken 70% (fallthrough)
   1579 branch  1 taken 30%
   1580        21: 1088:    type = UNIFORM_ARRAY;
   1581         -: 1089:  else
   1582         9: 1090:    type = S_ARRAY;
   1583        30: 1091:  ret type;
   1584         -: 1092:}
   1585         -: 1093:
   1586         -: 1094:/**
   1587         -: 1095: * serialize dictionary
   1588         -: 1096: *
   1589         -: 1097: * the serialized dict is pushed to r.
   1590         -: 1098: * All elements are serialized recursively
   1591         -: 1099: *
   1592         -: 1100: * the data in containers is not serialized
   1593         -: 1101: *
   1594         -: 1102: * \param
   1595         -: 1103: *   r small bytes object
   1596         -: 1104: *   dict dictionary to serialize
   1597         -: 1105: */
   1598 function dictNetSerialLevel2 called 0 returned 0% blocks executed 0%
   1599     #####: 1106:internal void dictNetSerialLevel2(sBytest **r, sDictt *dict, contextt *ctx, bool packed) {
   1600     #####: 1107:  sBytest *B     = NULL;
   1601     #####: 1108:  char    *data  = NULL;
   1602         -: 1109:
   1603         -: 1110:  // check if all elements have same type
   1604     #####: 1111:  bool allElementsHaveSameType = true;
   1605     #####: 1112:  bool foundFirstType          = false;
   1606     #####: 1113:  char type                    = 0;
   1607     #####: 1114:  {forEachSDict(dict, e) {
   1608 branch  0 never executed
   1609 branch  1 never executed
   1610     #####: 1115:    if (e->key) {
   1611 branch  0 never executed
   1612 branch  1 never executed
   1613     #####: 1116:      if (foundFirstType) {
   1614 branch  0 never executed
   1615 branch  1 never executed
   1616         -: 1117:        u8 nextType;
   1617     #####: 1118:        switch(e->data->type) {
   1618 branch  0 never executed
   1619 branch  1 never executed
   1620 branch  2 never executed
   1621         -: 1119:          case DICT:
   1622     #####: 1120:            nextType = isDictUniform((sDictt*)e->data);
   1623 call    0 never executed
   1624     #####: 1121:            break;
   1625         -: 1122:          case ARRAY:
   1626     #####: 1123:            nextType = isArrayUniform((sArrayt*)e->data);
   1627 call    0 never executed
   1628     #####: 1124:            break;
   1629         -: 1125:          default:
   1630     #####: 1126:            nextType = NET_SERIAL_TYPES[(u8)e->data->type];
   1631         -: 1127:        }
   1632     #####: 1128:        if (nextType != type) {
   1633 branch  0 never executed
   1634 branch  1 never executed
   1635     #####: 1129:          allElementsHaveSameType = false;
   1636     #####: 1130:          break;
   1637         -: 1131:        }
   1638         -: 1132:      }
   1639         -: 1133:      else {
   1640     #####: 1134:        switch(e->data->type) {
   1641 branch  0 never executed
   1642 branch  1 never executed
   1643 branch  2 never executed
   1644         -: 1135:          case DICT:
   1645     #####: 1136:            type = isDictUniform((sDictt*)e->data);
   1646 call    0 never executed
   1647     #####: 1137:            break;
   1648         -: 1138:          case ARRAY:
   1649     #####: 1139:            type = isArrayUniform((sArrayt*)e->data);
   1650 call    0 never executed
   1651     #####: 1140:            break;
   1652         -: 1141:          default:
   1653     #####: 1142:            type = NET_SERIAL_TYPES[(u8)e->data->type];
   1654         -: 1143:        }
   1655     #####: 1144:        foundFirstType = true;
   1656         -: 1145:      }
   1657         -: 1146:    }
   1658         -: 1147:  }}
   1659         -: 1148:
   1660     #####: 1149:  if (allElementsHaveSameType) {
   1661 branch  0 never executed
   1662 branch  1 never executed
   1663         -: 1150:    // pack dictionary
   1664     #####: 1151:    if (packed) {
   1665 branch  0 never executed
   1666 branch  1 never executed
   1667     #####: 1152:      uintToNetTypeVarint(r, type, dict->count);
   1668 call    0 never executed
   1669         -: 1153:    }
   1670         -: 1154:    else {
   1671     #####: 1155:      if (ctx->nibble == lowNbl) {
   1672 branch  0 never executed
   1673 branch  1 never executed
   1674     #####: 1156:        sBytesPush(r, (type << 4) + UNIFORM_DICT);
   1675 call    0 never executed
   1676     #####: 1157:        uintToVarint(r, dict->count);
   1677 call    0 never executed
   1678         -: 1158:      }
   1679         -: 1159:      else {
   1680         -: 1160:        // high nibble
   1681     #####: 1161:        ctx->nibble  = lowNbl;
   1682     #####: 1162:        data         = (char *)&((*r)->data) + ctx->nblOffset;
   1683     #####: 1163:        *data       |= UNIFORM_DICT << 4;
   1684     #####: 1164:        uintToNetTypeVarint(r, type, dict->count);
   1685 call    0 never executed
   1686         -: 1165:      }
   1687         -: 1166:    }
   1688         -: 1167:
   1689     #####: 1168:    switch(type) {
   1690 branch  0 never executed
   1691 branch  1 never executed
   1692 branch  2 never executed
   1693 branch  3 never executed
   1694 branch  4 never executed
   1695 branch  5 never executed
   1696 branch  6 never executed
   1697 branch  7 never executed
   1698 branch  8 never executed
   1699         -: 1169:      case S_UNDEFINED:
   1700     #####: 1170:        {forEachSDict(dict, e) {
   1701 branch  0 never executed
   1702 branch  1 never executed
   1703     #####: 1171:          if (e->key) {
   1704 branch  0 never executed
   1705 branch  1 never executed
   1706     #####: 1172:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   1707 call    0 never executed
   1708         -: 1173:          }
   1709         -: 1174:        }}
   1710         -: 1175:
   1711     #####: 1176:        break;
   1712         -: 1177:      case S_BOOL:
   1713     #####: 1178:        {forEachSDict(dict, e) {
   1714 branch  0 never executed
   1715 branch  1 never executed
   1716     #####: 1179:          if (e->key) {
   1717 branch  0 never executed
   1718 branch  1 never executed
   1719     #####: 1180:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   1720 call    0 never executed
   1721         -: 1181:
   1722     #####: 1182:            if (!ctx->boolOffset) {
   1723 branch  0 never executed
   1724 branch  1 never executed
   1725         -: 1183:              // new packed bools
   1726     #####: 1184:              storeNew8bPackedBool(e->data);
   1727 branch  0 never executed
   1728 branch  1 never executed
   1729 call    2 never executed
   1730         -: 1185:            }
   1731         -: 1186:            else {
   1732         -: 1187:              // there was a bool before this one, fill bits in nibbles
   1733     #####: 1188:              if (ctx->boolShift == 8) {
   1734 branch  0 never executed
   1735 branch  1 never executed
   1736         -: 1189:                // previous packed bool is full
   1737         -: 1190:                // next byte is the new packed bools
   1738     #####: 1191:                storeNew8bPackedBool(e->data);
   1739 branch  0 never executed
   1740 branch  1 never executed
   1741 call    2 never executed
   1742         -: 1192:              }
   1743         -: 1193:              else {
   1744     #####: 1194:                storeBool(e->data);
   1745 branch  0 never executed
   1746 branch  1 never executed
   1747         -: 1195:              }
   1748         -: 1196:            }
   1749         -: 1197:          }
   1750         -: 1198:        }}
   1751     #####: 1199:        break;
   1752         -: 1200:      case S_DICT:
   1753         -: 1201:      case UNIFORM_DICT:
   1754     #####: 1202:        {forEachSDict(dict, e) {
   1755 branch  0 never executed
   1756 branch  1 never executed
   1757     #####: 1203:          if (e->key) {
   1758 branch  0 never executed
   1759 branch  1 never executed
   1760     #####: 1204:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   1761 call    0 never executed
   1762     #####: 1205:            dictNetSerialLevel2(r, (sDictt *)(e->data), ctx, /*packed=*/true);
   1763 call    0 never executed
   1764         -: 1206:          }
   1765         -: 1207:        }}
   1766     #####: 1208:        break;
   1767         -: 1209:      case S_DOUBLE:
   1768     #####: 1210:        {forEachSDict(dict, e) {
   1769 branch  0 never executed
   1770 branch  1 never executed
   1771     #####: 1211:          if (e->key) {
   1772 branch  0 never executed
   1773 branch  1 never executed
   1774     #####: 1212:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   1775 call    0 never executed
   1776     #####: 1213:            sBytesPushBuffer(r, &((sDoublet *)(e->data))->value, sizeof(double));
   1777 call    0 never executed
   1778         -: 1214:          }
   1779         -: 1215:        }}
   1780     #####: 1216:        break;
   1781         -: 1217:      case S_INT:
   1782     #####: 1218:        {forEachSDict(dict, e) {
   1783 branch  0 never executed
   1784 branch  1 never executed
   1785     #####: 1219:          if (e->key) {
   1786 branch  0 never executed
   1787 branch  1 never executed
   1788     #####: 1220:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   1789 call    0 never executed
   1790     #####: 1221:            i64 v = ((sIntt *)(e->data))->value;
   1791     #####: 1222:            uintToVarint(r, (v << 1) ^ (v >> 63));
   1792 call    0 never executed
   1793         -: 1223:          }
   1794         -: 1224:        }}
   1795     #####: 1225:        break;
   1796         -: 1226:      case S_STRING:
   1797     #####: 1227:        {forEachSDict(dict, e) {
   1798 branch  0 never executed
   1799 branch  1 never executed
   1800     #####: 1228:          if (e->key) {
   1801 branch  0 never executed
   1802 branch  1 never executed
   1803     #####: 1229:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   1804 call    0 never executed
   1805     #####: 1230:            sBytesPushBuffer(r, &((sStringt *)(e->data))->data, sizeof(sStringt) + strlen(&(((sStringt *)(e->data))->data)) -1);
   1806 call    0 never executed
   1807         -: 1231:          }
   1808         -: 1232:        }}
   1809     #####: 1233:        break;
   1810         -: 1234:      case S_ARRAY:
   1811         -: 1235:      case UNIFORM_ARRAY:
   1812     #####: 1236:        {forEachSDict(dict, e) {
   1813 branch  0 never executed
   1814 branch  1 never executed
   1815     #####: 1237:          if (e->key) {
   1816 branch  0 never executed
   1817 branch  1 never executed
   1818     #####: 1238:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   1819 call    0 never executed
   1820     #####: 1239:            arrayNetSerialLevel2(r, (sArrayt *)(e->data), ctx, /*packed=*/true);
   1821 call    0 never executed
   1822         -: 1240:          }
   1823         -: 1241:        }}
   1824     #####: 1242:        break;
   1825         -: 1243:      case S_BYTES:
   1826     #####: 1244:        {forEachSDict(dict, e) {
   1827 branch  0 never executed
   1828 branch  1 never executed
   1829     #####: 1245:          if (e->key) {
   1830 branch  0 never executed
   1831 branch  1 never executed
   1832     #####: 1246:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   1833 call    0 never executed
   1834     #####: 1247:            B = (sBytest *)(e->data);
   1835     #####: 1248:            uintToVarint(r, B->count);
   1836 call    0 never executed
   1837     #####: 1249:            sBytesPushBuffer(r, &(B->data), B->count);
   1838 call    0 never executed
   1839         -: 1250:          }
   1840         -: 1251:        }}
   1841     #####: 1252:        break;
   1842         -: 1253:    }
   1843     #####: 1254:    ret;
   1844         -: 1255:  }
   1845         -: 1256:
   1846     #####: 1257:  if (packed) {
   1847 branch  0 never executed
   1848 branch  1 never executed
   1849     #####: 1258:    uintToVarint(r, dict->count);
   1850 call    0 never executed
   1851         -: 1259:  }
   1852         -: 1260:  else {
   1853     #####: 1261:    if (ctx->nibble == lowNbl) {
   1854 branch  0 never executed
   1855 branch  1 never executed
   1856     #####: 1262:      uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)dict->type], dict->count);
   1857 call    0 never executed
   1858         -: 1263:    }
   1859         -: 1264:    else {
   1860         -: 1265:      // high nibble
   1861         -: 1266:#define storeTypeInHighNbl(o)\
   1862         -: 1267:      ctx->nibble  = lowNbl;\
   1863         -: 1268:      data         = (char *)&((*r)->data) + ctx->nblOffset;\
   1864         -: 1269:      *data       |= NET_SERIAL_TYPES[(u8)o->type] << 4
   1865     #####: 1270:      storeTypeInHighNbl(dict);
   1866     #####: 1271:      uintToVarint(r, dict->count);
   1867 call    0 never executed
   1868         -: 1272:    }
   1869         -: 1273:  }
   1870         -: 1274:
   1871     #####: 1275:  forEachSDict(dict, e) {
   1872 branch  0 never executed
   1873 branch  1 never executed
   1874     #####: 1276:    if (e->key) {
   1875 branch  0 never executed
   1876 branch  1 never executed
   1877     #####: 1277:      sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   1878 call    0 never executed
   1879         -: 1278:
   1880     #####: 1279:      switch(e->data->type) {
   1881 branch  0 never executed
   1882 branch  1 never executed
   1883 branch  2 never executed
   1884 branch  3 never executed
   1885 branch  4 never executed
   1886 branch  5 never executed
   1887 branch  6 never executed
   1888 branch  7 never executed
   1889 branch  8 never executed
   1890         -: 1280:        case UNDEFINED:
   1891         -: 1281:        case CONTAINER:
   1892     #####: 1282:          if (ctx->nibble == lowNbl) {
   1893 branch  0 never executed
   1894 branch  1 never executed
   1895         -: 1283:            #define storeTypeOnly(o)\
   1896         -: 1284:            sBytesPush(r, NET_SERIAL_TYPES[(u8)o->type]);\
   1897         -: 1285:            ctx->nibble    = highNbl;\
   1898         -: 1286:            ctx->nblOffset = (*r)->count -1
   1899     #####: 1287:            storeTypeOnly(e->data);
   1900 call    0 never executed
   1901         -: 1288:          }
   1902         -: 1289:          else {
   1903     #####: 1290:            storeTypeInHighNbl(e->data);
   1904         -: 1291:          }
   1905     #####: 1292:          break;
   1906         -: 1293:        case BOOL:
   1907     #####: 1294:          if (!ctx->boolOffset) {
   1908 branch  0 never executed
   1909 branch  1 never executed
   1910         -: 1295:            // new packed bools
   1911     #####: 1296:            if (ctx->nibble == lowNbl) {
   1912 branch  0 never executed
   1913 branch  1 never executed
   1914         -: 1297:              #define storeNew4bPackedBool(o)\
   1915         -: 1298:              u8 c = NET_SERIAL_TYPES[(u8)o->type];\
   1916         -: 1299:              /* set bit 4 when true */\
   1917         -: 1300:              if (((sBoolt *)(o))->value)\
   1918         -: 1301:                c |= (1<<4);\
   1919         -: 1302:              sBytesPush(r, c);\
   1920         -: 1303:              ctx->boolShift  = 5;\
   1921         -: 1304:              ctx->boolOffset = (*r)->count -1
   1922     #####: 1305:              storeNew4bPackedBool(e->data);
   1923 branch  0 never executed
   1924 branch  1 never executed
   1925 call    2 never executed
   1926         -: 1306:            }
   1927         -: 1307:            else {
   1928         -: 1308:              // high nibble, next byte is packed bools
   1929     #####: 1309:              storeTypeInHighNbl(e->data);
   1930         -: 1310:              #define storeNew8bPackedBool(o)\
   1931         -: 1311:              u8 c         = 0;\
   1932         -: 1312:              if (((sBoolt *)(o))->value)\
   1933         -: 1313:                c = 1;\
   1934         -: 1314:              sBytesPush(r, c);\
   1935         -: 1315:              ctx->boolShift  = 1;\
   1936         -: 1316:              ctx->boolOffset = (*r)->count -1
   1937     #####: 1317:              storeNew8bPackedBool(e->data);
   1938 branch  0 never executed
   1939 branch  1 never executed
   1940 call    2 never executed
   1941         -: 1318:            }
   1942         -: 1319:          }
   1943         -: 1320:          else {
   1944         -: 1321:            // there was a bool before this one, fill bits in nibbles
   1945     #####: 1322:            if (ctx->nibble == lowNbl) {
   1946 branch  0 never executed
   1947 branch  1 never executed
   1948     #####: 1323:              if (ctx->boolShift == 8) {
   1949 branch  0 never executed
   1950 branch  1 never executed
   1951         -: 1324:                // previous packed bool is full
   1952         -: 1325:                // this byte is the new packed bools
   1953     #####: 1326:                storeNew4bPackedBool(e->data);
   1954 branch  0 never executed
   1955 branch  1 never executed
   1956 call    2 never executed
   1957         -: 1327:              }
   1958         -: 1328:              else {
   1959     #####: 1329:                storeTypeOnly(e->data);
   1960 call    0 never executed
   1961         -: 1330:                #define storeBool(o)\
   1962         -: 1331:                data           = (char *)&((*r)->data) + ctx->boolOffset;\
   1963         -: 1332:                if (((sBoolt *)(o))->value)\
   1964         -: 1333:                  *data |= 1 << ctx->boolShift;\
   1965         -: 1334:                ctx->boolShift++
   1966     #####: 1335:                storeBool(e->data);
   1967 branch  0 never executed
   1968 branch  1 never executed
   1969         -: 1336:              }
   1970         -: 1337:            }
   1971         -: 1338:            else {
   1972         -: 1339:              // high nibble
   1973     #####: 1340:              storeTypeInHighNbl(e->data);
   1974     #####: 1341:              if (ctx->boolShift == 8) {
   1975 branch  0 never executed
   1976 branch  1 never executed
   1977         -: 1342:                // previous packed bool is full
   1978         -: 1343:                // next byte is the new packed bools
   1979     #####: 1344:                storeNew8bPackedBool(e->data);
   1980 branch  0 never executed
   1981 branch  1 never executed
   1982 call    2 never executed
   1983         -: 1345:              }
   1984         -: 1346:              else {
   1985     #####: 1347:                storeBool(e->data);
   1986 branch  0 never executed
   1987 branch  1 never executed
   1988         -: 1348:              }
   1989         -: 1349:            }
   1990         -: 1350:          }
   1991     #####: 1351:          break;
   1992         -: 1352:        case DICT:
   1993     #####: 1353:          dictNetSerialLevel2(r, (sDictt *)(e->data), ctx, /*packed=*/false);
   1994 call    0 never executed
   1995     #####: 1354:          break;
   1996         -: 1355:        case DOUBLE:
   1997     #####: 1356:          if (ctx->nibble == lowNbl) {
   1998 branch  0 never executed
   1999 branch  1 never executed
   2000     #####: 1357:            storeTypeOnly(e->data);
   2001 call    0 never executed
   2002         -: 1358:          }
   2003         -: 1359:          else {
   2004         -: 1360:            // high nibble
   2005     #####: 1361:            storeTypeInHighNbl(e->data);
   2006         -: 1362:          }
   2007     #####: 1363:          sBytesPushBuffer(r, &((sDoublet *)(e->data))->value, sizeof(double));
   2008 call    0 never executed
   2009     #####: 1364:          break;
   2010         -: 1365:        case INT: {
   2011         -: 1366:            // encode int to varint
   2012         -: 1367:            // v is int64_t to convert to varint
   2013     #####: 1368:            i64 v = ((sIntt *)(e->data))->value;
   2014     #####: 1369:            if (ctx->nibble == lowNbl) {
   2015 branch  0 never executed
   2016 branch  1 never executed
   2017         -: 1370:              // encode v with arithmetic shifts
   2018     #####: 1371:              uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->data->type], (v << 1) ^ (v >> 63));
   2019 call    0 never executed
   2020         -: 1372:            }
   2021         -: 1373:            else {
   2022         -: 1374:              // high nibble
   2023     #####: 1375:              storeTypeInHighNbl(e->data);
   2024     #####: 1376:              uintToVarint(r, (v << 1) ^ (v >> 63));
   2025 call    0 never executed
   2026         -: 1377:            }
   2027         -: 1378:          }
   2028     #####: 1379:          break;
   2029         -: 1380:        case STRING:
   2030     #####: 1381:          if (ctx->nibble == lowNbl) {
   2031 branch  0 never executed
   2032 branch  1 never executed
   2033     #####: 1382:            storeTypeOnly(e->data);
   2034 call    0 never executed
   2035         -: 1383:          }
   2036         -: 1384:          else {
   2037         -: 1385:            // high nibble
   2038     #####: 1386:            storeTypeInHighNbl(e->data);
   2039         -: 1387:          }
   2040     #####: 1388:          sBytesPushBuffer(r, &((sStringt *)(e->data))->data, sizeof(sStringt) + strlen(&(((sStringt *)(e->data))->data)) -1);
   2041 call    0 never executed
   2042     #####: 1389:          break;
   2043         -: 1390:        case ARRAY:
   2044     #####: 1391:          arrayNetSerialLevel2(r, (sArrayt *)(e->data), ctx, /*packed=*/false);
   2045 call    0 never executed
   2046     #####: 1392:          break;
   2047         -: 1393:        case BYTES:
   2048     #####: 1394:          B = (sBytest *)(e->data);
   2049     #####: 1395:          if (ctx->nibble == lowNbl) {
   2050 branch  0 never executed
   2051 branch  1 never executed
   2052     #####: 1396:            uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->data->type], B->count);
   2053 call    0 never executed
   2054         -: 1397:          }
   2055         -: 1398:          else {
   2056         -: 1399:            // high nibble
   2057     #####: 1400:            storeTypeInHighNbl(e->data);
   2058     #####: 1401:            uintToVarint(r, B->count);
   2059 call    0 never executed
   2060         -: 1402:          }
   2061     #####: 1403:          sBytesPushBuffer(r, &(B->data), B->count);
   2062 call    0 never executed
   2063     #####: 1404:          break;
   2064         -: 1405:      }
   2065         -: 1406:    }
   2066         -: 1407:  }
   2067     #####: 1408:  ret;
   2068         -: 1409:}
   2069         -: 1410:
   2070         -: 1411:/**
   2071         -: 1412: * serialize array
   2072         -: 1413: *
   2073         -: 1414: * the serialized array is pushed to r.
   2074         -: 1415: * All elements are serialized recursively
   2075         -: 1416: *
   2076         -: 1417: * the data in containers is not serialized
   2077         -: 1418: *
   2078         -: 1419: * \param
   2079         -: 1420: *   r small bytes object
   2080         -: 1421: *   array to serialize
   2081         -: 1422: */
   2082 function arrayNetSerialLevel2 called 0 returned 0% blocks executed 0%
   2083     #####: 1423:internal void arrayNetSerialLevel2(sBytest **r, sArrayt *array, contextt *ctx, bool packed) {
   2084     #####: 1424:  sBytest *B     = NULL;
   2085     #####: 1425:  char    *data  = NULL;
   2086         -: 1426:
   2087         -: 1427:  // check if all elements have same type
   2088     #####: 1428:  bool allElementsHaveSameType = true;
   2089     #####: 1429:  bool foundFirstType          = false;
   2090     #####: 1430:  char type                    = 0;
   2091         -: 1431:
   2092     #####: 1432:  {forEachSArray(array, e) {
   2093 branch  0 never executed
   2094 branch  1 never executed
   2095     #####: 1433:    if (!e) {
   2096 branch  0 never executed
   2097 branch  1 never executed
   2098     #####: 1434:      if (foundFirstType) {
   2099 branch  0 never executed
   2100 branch  1 never executed
   2101     #####: 1435:        if (type != S_UNDEFINED) {
   2102 branch  0 never executed
   2103 branch  1 never executed
   2104     #####: 1436:          allElementsHaveSameType = false;
   2105     #####: 1437:          break;
   2106         -: 1438:        }
   2107         -: 1439:      }
   2108         -: 1440:      else {
   2109     #####: 1441:        type = S_UNDEFINED;
   2110     #####: 1442:        foundFirstType = true;
   2111         -: 1443:      }
   2112         -: 1444:    }
   2113         -: 1445:    else {
   2114     #####: 1446:      if (foundFirstType) {
   2115 branch  0 never executed
   2116 branch  1 never executed
   2117         -: 1447:        u8 nextType;
   2118     #####: 1448:        switch(e->type) {
   2119 branch  0 never executed
   2120 branch  1 never executed
   2121 branch  2 never executed
   2122         -: 1449:          case DICT:
   2123     #####: 1450:            nextType = isDictUniform((sDictt*)e);
   2124 call    0 never executed
   2125     #####: 1451:            break;
   2126         -: 1452:          case ARRAY:
   2127     #####: 1453:            nextType = isArrayUniform((sArrayt*)e);
   2128 call    0 never executed
   2129     #####: 1454:            break;
   2130         -: 1455:          default:
   2131     #####: 1456:            nextType = NET_SERIAL_TYPES[(u8)e->type];
   2132         -: 1457:        }
   2133     #####: 1458:        if (nextType != type) {
   2134 branch  0 never executed
   2135 branch  1 never executed
   2136     #####: 1459:          allElementsHaveSameType = false;
   2137     #####: 1460:          break;
   2138         -: 1461:        }
   2139         -: 1462:      }
   2140         -: 1463:      else {
   2141     #####: 1464:        switch(e->type) {
   2142 branch  0 never executed
   2143 branch  1 never executed
   2144 branch  2 never executed
   2145         -: 1465:          case DICT:
   2146     #####: 1466:            type = isDictUniform((sDictt*)e);
   2147 call    0 never executed
   2148     #####: 1467:            break;
   2149         -: 1468:          case ARRAY:
   2150     #####: 1469:            type = isArrayUniform((sArrayt*)e);
   2151 call    0 never executed
   2152     #####: 1470:            break;
   2153         -: 1471:          default:
   2154     #####: 1472:            type = NET_SERIAL_TYPES[(u8)e->type];
   2155         -: 1473:        }
   2156     #####: 1474:        foundFirstType = true;
   2157         -: 1475:      }
   2158         -: 1476:    }
   2159         -: 1477:  }}
   2160         -: 1478:
   2161     #####: 1479:  if (allElementsHaveSameType) {
   2162 branch  0 never executed
   2163 branch  1 never executed
   2164         -: 1480:    // pack array
   2165     #####: 1481:    if (packed) {
   2166 branch  0 never executed
   2167 branch  1 never executed
   2168     #####: 1482:      uintToNetTypeVarint(r, type, array->count);
   2169 call    0 never executed
   2170         -: 1483:    }
   2171         -: 1484:    else {
   2172     #####: 1485:      if (ctx->nibble == lowNbl) {
   2173 branch  0 never executed
   2174 branch  1 never executed
   2175     #####: 1486:        sBytesPush(r, (type << 4) + UNIFORM_ARRAY);
   2176 call    0 never executed
   2177     #####: 1487:        uintToVarint(r, array->count);
   2178 call    0 never executed
   2179         -: 1488:      }
   2180         -: 1489:      else {
   2181         -: 1490:        // high nibble
   2182     #####: 1491:        ctx->nibble  = lowNbl;
   2183     #####: 1492:        data         = (char *)&((*r)->data) + ctx->nblOffset;
   2184     #####: 1493:        *data       |= UNIFORM_ARRAY << 4;
   2185     #####: 1494:        uintToNetTypeVarint(r, type, array->count);
   2186 call    0 never executed
   2187         -: 1495:      }
   2188         -: 1496:    }
   2189         -: 1497:
   2190     #####: 1498:    switch(type) {
   2191 branch  0 never executed
   2192 branch  1 never executed
   2193 branch  2 never executed
   2194 branch  3 never executed
   2195 branch  4 never executed
   2196 branch  5 never executed
   2197 branch  6 never executed
   2198 branch  7 never executed
   2199         -: 1499:      case S_BOOL:
   2200     #####: 1500:        {forEachSArray(array, e) {
   2201 branch  0 never executed
   2202 branch  1 never executed
   2203     #####: 1501:          if (!ctx->boolOffset) {
   2204 branch  0 never executed
   2205 branch  1 never executed
   2206         -: 1502:            // new packed bools
   2207     #####: 1503:            storeNew8bPackedBool(e);
   2208 branch  0 never executed
   2209 branch  1 never executed
   2210 call    2 never executed
   2211         -: 1504:          }
   2212         -: 1505:          else {
   2213         -: 1506:            // there was a bool before this one, fill bits in nibbles
   2214     #####: 1507:            if (ctx->boolShift == 8) {
   2215 branch  0 never executed
   2216 branch  1 never executed
   2217         -: 1508:              // previous packed bool is full
   2218         -: 1509:              // next byte is the new packed bools
   2219     #####: 1510:              storeNew8bPackedBool(e);
   2220 branch  0 never executed
   2221 branch  1 never executed
   2222 call    2 never executed
   2223         -: 1511:            }
   2224         -: 1512:            else {
   2225     #####: 1513:              storeBool(e);
   2226 branch  0 never executed
   2227 branch  1 never executed
   2228         -: 1514:            }
   2229         -: 1515:          }
   2230         -: 1516:        }}
   2231     #####: 1517:        break;
   2232         -: 1518:      case S_DICT:
   2233         -: 1519:      case UNIFORM_DICT:
   2234     #####: 1520:        {forEachSArray(array, e) {
   2235 branch  0 never executed
   2236 branch  1 never executed
   2237     #####: 1521:          dictNetSerialLevel2(r, (sDictt *)e, ctx, /*packed=*/true);
   2238 call    0 never executed
   2239         -: 1522:        }}
   2240     #####: 1523:        break;
   2241         -: 1524:      case S_DOUBLE:
   2242     #####: 1525:        {forEachSArray(array, e) {
   2243 branch  0 never executed
   2244 branch  1 never executed
   2245     #####: 1526:          sBytesPushBuffer(r, &((sDoublet *)e)->value, sizeof(double));
   2246 call    0 never executed
   2247         -: 1527:        }}
   2248     #####: 1528:        break;
   2249         -: 1529:      case S_INT:
   2250     #####: 1530:        {forEachSArray(array, e) {
   2251 branch  0 never executed
   2252 branch  1 never executed
   2253     #####: 1531:          i64 v = ((sIntt *)e)->value;
   2254     #####: 1532:          uintToVarint(r, (v << 1) ^ (v >> 63));
   2255 call    0 never executed
   2256         -: 1533:        }}
   2257     #####: 1534:        break;
   2258         -: 1535:      case S_STRING:
   2259     #####: 1536:        {forEachSArray(array, e) {
   2260 branch  0 never executed
   2261 branch  1 never executed
   2262     #####: 1537:          sBytesPushBuffer(r, &((sStringt *)e)->data, sizeof(sStringt) + strlen(&(((sStringt *)e)->data)) -1);
   2263 call    0 never executed
   2264         -: 1538:        }}
   2265     #####: 1539:        break;
   2266         -: 1540:      case S_ARRAY:
   2267         -: 1541:      case UNIFORM_ARRAY:
   2268     #####: 1542:        {forEachSArray(array, e) {
   2269 branch  0 never executed
   2270 branch  1 never executed
   2271     #####: 1543:          arrayNetSerialLevel2(r, (sArrayt *)e, ctx, /*packed=*/true);
   2272 call    0 never executed
   2273         -: 1544:        }}
   2274     #####: 1545:        break;
   2275         -: 1546:      case S_BYTES:
   2276     #####: 1547:        {forEachSArray(array, e) {
   2277 branch  0 never executed
   2278 branch  1 never executed
   2279     #####: 1548:          B = (sBytest *)e;
   2280     #####: 1549:          uintToVarint(r, B->count);
   2281 call    0 never executed
   2282     #####: 1550:          sBytesPushBuffer(r, &(B->data), B->count);
   2283 call    0 never executed
   2284         -: 1551:        }}
   2285     #####: 1552:        break;
   2286         -: 1553:    }
   2287     #####: 1554:    ret;
   2288         -: 1555:  }
   2289         -: 1556:
   2290     #####: 1557:  if (packed) {
   2291 branch  0 never executed
   2292 branch  1 never executed
   2293     #####: 1558:    uintToVarint(r, array->count);
   2294 call    0 never executed
   2295         -: 1559:  }
   2296         -: 1560:  else {
   2297     #####: 1561:    if (ctx->nibble == lowNbl) {
   2298 branch  0 never executed
   2299 branch  1 never executed
   2300     #####: 1562:      uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)array->type], array->count);
   2301 call    0 never executed
   2302         -: 1563:    }
   2303         -: 1564:    else {
   2304         -: 1565:      // high nibble
   2305     #####: 1566:      storeTypeInHighNbl(array);
   2306     #####: 1567:      uintToVarint(r, array->count);
   2307 call    0 never executed
   2308         -: 1568:    }
   2309         -: 1569:  }
   2310         -: 1570:
   2311     #####: 1571:  forEachSArray(array, e) {
   2312 branch  0 never executed
   2313 branch  1 never executed
   2314     #####: 1572:    if (!e) {
   2315 branch  0 never executed
   2316 branch  1 never executed
   2317         -: 1573:      // empty slots are represented as undefined elements
   2318     #####: 1574:      if (ctx->nibble == lowNbl) {
   2319 branch  0 never executed
   2320 branch  1 never executed
   2321     #####: 1575:        sBytesPush(r, NET_SERIAL_TYPES[UNDEFINED]);
   2322 call    0 never executed
   2323     #####: 1576:        ctx->nibble    = highNbl;
   2324     #####: 1577:        ctx->nblOffset = (*r)->count -1;
   2325         -: 1578:      }
   2326         -: 1579:      else {
   2327         -: 1580:        // high nibble
   2328     #####: 1581:        ctx->nibble  = lowNbl;
   2329     #####: 1582:        data         = (char *)&((*r)->data) + ctx->nblOffset;
   2330     #####: 1583:        *data       |= NET_SERIAL_TYPES[UNDEFINED] << 4;
   2331         -: 1584:      }
   2332         -: 1585:    }
   2333         -: 1586:    else {
   2334     #####: 1587:      switch(e->type) {
   2335 branch  0 never executed
   2336 branch  1 never executed
   2337 branch  2 never executed
   2338 branch  3 never executed
   2339 branch  4 never executed
   2340 branch  5 never executed
   2341 branch  6 never executed
   2342 branch  7 never executed
   2343 branch  8 never executed
   2344         -: 1588:        case UNDEFINED:
   2345         -: 1589:        case CONTAINER:
   2346     #####: 1590:          if (ctx->nibble == lowNbl) {
   2347 branch  0 never executed
   2348 branch  1 never executed
   2349     #####: 1591:            storeTypeOnly(e);
   2350 call    0 never executed
   2351         -: 1592:          }
   2352         -: 1593:          else {
   2353         -: 1594:            // high nibble
   2354     #####: 1595:            storeTypeInHighNbl(e);
   2355         -: 1596:          }
   2356     #####: 1597:          break;
   2357         -: 1598:        case BOOL:
   2358     #####: 1599:          if (!ctx->boolOffset) {
   2359 branch  0 never executed
   2360 branch  1 never executed
   2361         -: 1600:            // new packed bools
   2362     #####: 1601:            if (ctx->nibble == lowNbl) {
   2363 branch  0 never executed
   2364 branch  1 never executed
   2365     #####: 1602:              storeNew4bPackedBool(e);
   2366 branch  0 never executed
   2367 branch  1 never executed
   2368 call    2 never executed
   2369         -: 1603:            }
   2370         -: 1604:            else {
   2371         -: 1605:              // high nibble, next byte is packed bools
   2372     #####: 1606:              storeTypeInHighNbl(e);
   2373     #####: 1607:              storeNew8bPackedBool(e);
   2374 branch  0 never executed
   2375 branch  1 never executed
   2376 call    2 never executed
   2377         -: 1608:            }
   2378         -: 1609:          }
   2379         -: 1610:          else {
   2380         -: 1611:            // there was a bool before this one, fill bits in nibbles
   2381     #####: 1612:            if (ctx->nibble == lowNbl) {
   2382 branch  0 never executed
   2383 branch  1 never executed
   2384     #####: 1613:              if (ctx->boolShift == 8) {
   2385 branch  0 never executed
   2386 branch  1 never executed
   2387         -: 1614:                // previous packed bool is full
   2388         -: 1615:                // this byte is the new packed bools
   2389     #####: 1616:                storeNew4bPackedBool(e);
   2390 branch  0 never executed
   2391 branch  1 never executed
   2392 call    2 never executed
   2393         -: 1617:              }
   2394         -: 1618:              else {
   2395     #####: 1619:                storeTypeOnly(e);
   2396 call    0 never executed
   2397     #####: 1620:                storeBool(e);
   2398 branch  0 never executed
   2399 branch  1 never executed
   2400         -: 1621:              }
   2401         -: 1622:            }
   2402         -: 1623:            else {
   2403         -: 1624:              // high nibble
   2404     #####: 1625:              storeTypeInHighNbl(e);
   2405     #####: 1626:              if (ctx->boolShift == 8) {
   2406 branch  0 never executed
   2407 branch  1 never executed
   2408         -: 1627:                // previous packed bool is full
   2409         -: 1628:                // next byte is the new packed bools
   2410     #####: 1629:                storeNew8bPackedBool(e);
   2411 branch  0 never executed
   2412 branch  1 never executed
   2413 call    2 never executed
   2414         -: 1630:              }
   2415         -: 1631:              else {
   2416     #####: 1632:                storeBool(e);
   2417 branch  0 never executed
   2418 branch  1 never executed
   2419         -: 1633:              }
   2420         -: 1634:            }
   2421         -: 1635:          }
   2422     #####: 1636:          break;
   2423         -: 1637:        case DICT:
   2424     #####: 1638:          dictNetSerialLevel2(r, (sDictt *)e, ctx, /*packed=*/false);
   2425 call    0 never executed
   2426     #####: 1639:          break;
   2427         -: 1640:        case DOUBLE:
   2428     #####: 1641:          if (ctx->nibble == lowNbl) {
   2429 branch  0 never executed
   2430 branch  1 never executed
   2431     #####: 1642:            storeTypeOnly(e);
   2432 call    0 never executed
   2433         -: 1643:          }
   2434         -: 1644:          else {
   2435         -: 1645:            // high nibble
   2436     #####: 1646:            storeTypeInHighNbl(e);
   2437         -: 1647:          }
   2438     #####: 1648:          sBytesPushBuffer(r, &((sDoublet *)e)->value, sizeof(double));
   2439 call    0 never executed
   2440     #####: 1649:          break;
   2441         -: 1650:        case INT: {
   2442         -: 1651:            // encode int to varint
   2443         -: 1652:            // v is int64_t to convert to varint
   2444     #####: 1653:            i64 v = ((sIntt *)&(e->type))->value;
   2445     #####: 1654:            if (ctx->nibble == lowNbl) {
   2446 branch  0 never executed
   2447 branch  1 never executed
   2448         -: 1655:              // encode v with arithmetic shifts
   2449     #####: 1656:              uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->type], (v << 1) ^ (v >> 63));
   2450 call    0 never executed
   2451         -: 1657:            }
   2452         -: 1658:            else {
   2453         -: 1659:              // high nibble
   2454     #####: 1660:              storeTypeInHighNbl(e);
   2455     #####: 1661:              uintToVarint(r, (v << 1) ^ (v >> 63));
   2456 call    0 never executed
   2457         -: 1662:            }
   2458         -: 1663:          }
   2459     #####: 1664:          break;
   2460         -: 1665:        case STRING:
   2461     #####: 1666:          if (ctx->nibble == lowNbl) {
   2462 branch  0 never executed
   2463 branch  1 never executed
   2464     #####: 1667:            storeTypeOnly(e);
   2465 call    0 never executed
   2466         -: 1668:          }
   2467         -: 1669:          else {
   2468         -: 1670:            // high nibble
   2469     #####: 1671:            storeTypeInHighNbl(e);
   2470         -: 1672:          }
   2471     #####: 1673:          sBytesPushBuffer(r, &((sStringt *)e)->data, sizeof(sStringt) + strlen(&(((sStringt *)e)->data)) -1);
   2472 call    0 never executed
   2473     #####: 1674:          break;
   2474         -: 1675:        case ARRAY:
   2475     #####: 1676:          arrayNetSerialLevel2(r, (sArrayt *)e, ctx, /*packed=*/false);
   2476 call    0 never executed
   2477     #####: 1677:          break;
   2478         -: 1678:        case BYTES:
   2479     #####: 1679:          B = (sBytest *)e;
   2480     #####: 1680:          if (ctx->nibble == lowNbl) {
   2481 branch  0 never executed
   2482 branch  1 never executed
   2483     #####: 1681:            uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->type], B->count);
   2484 call    0 never executed
   2485         -: 1682:          }
   2486         -: 1683:          else {
   2487         -: 1684:            // high nibble
   2488     #####: 1685:            storeTypeInHighNbl(e);
   2489     #####: 1686:            uintToVarint(r, B->count);
   2490 call    0 never executed
   2491         -: 1687:          }
   2492     #####: 1688:          sBytesPushBuffer(r, &(B->data), B->count);
   2493 call    0 never executed
   2494     #####: 1689:          break;
   2495         -: 1690:      }
   2496         -: 1691:    }
   2497         -: 1692:  }
   2498     #####: 1693:  ret;
   2499         -: 1694:}
   2500         -: 1695:
   2501 function serialNetSerialLevel2 called 0 returned 0% blocks executed 0%
   2502     #####: 1696:internal smallBytest* serialNetSerialLevel2(smallJsont *self) {
   2503         -: 1697:
   2504     #####: 1698:  smallt *o = getsoG(self);
   2505 call    0 never executed
   2506         -: 1699:
   2507     #####: 1700:  if (o == NULL)
   2508 branch  0 never executed
   2509 branch  1 never executed
   2510     #####: 1701:    ret NULL;
   2511         -: 1702:
   2512     #####: 1703:  sBytest *B = netSerialLevel2(o);
   2513 call    0 never executed
   2514         -: 1704:
   2515     #####: 1705:  if (!B) {
   2516 branch  0 never executed
   2517 branch  1 never executed
   2518     #####: 1706:    ret NULL;
   2519         -: 1707:  }
   2520         -: 1708:
   2521     #####: 1709:  createAllocateSmallBytes(r);
   2522 call    0 never executed
   2523     #####: 1710:  r->B = B;
   2524     #####: 1711:  ret r;
   2525         -: 1712:}
   2526         -: 1713:
   2527         -: 1714:// level 3
   2528         -: 1715:// like level 2, elements of identical type in a row are packed
   2529         -: 1716:
   2530         -: 1717:/**
   2531         -: 1718: * serializer top function
   2532         -: 1719: */
   2533 function netSerial called 86 returned 100% blocks executed 88%
   2534        86: 1720:internal sBytest* netSerial(smallt *o) {
   2535        86: 1721:  sBytest *r = NULL;
   2536        86: 1722:  sBytest *B = NULL;
   2537        86: 1723:  contextt ctx = {.nibble=lowNbl, .nblOffset=0, .boolShift = 0, .boolOffset=0};
   2538         -: 1724:
   2539        86: 1725:  switch(o->type) {
   2540 branch  0 taken 1%
   2541 branch  1 taken 1%
   2542 branch  2 taken 47%
   2543 branch  3 taken 1%
   2544 branch  4 taken 3%
   2545 branch  5 taken 1%
   2546 branch  6 taken 45%
   2547 branch  7 taken 0%
   2548 branch  8 taken 0%
   2549         -: 1726:    case UNDEFINED:
   2550         -: 1727:    case CONTAINER:
   2551         1: 1728:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
   2552 call    0 returned 100%
   2553         1: 1729:      break;
   2554         -: 1730:    case BOOL: {
   2555         1: 1731:      u8 c = NET_SERIAL_TYPES[(u8)o->type];
   2556         -: 1732:      // set bit 4 when true
   2557         1: 1733:      if (((sBoolt *)&(o->type))->value)
   2558 branch  0 taken 100% (fallthrough)
   2559 branch  1 taken 0%
   2560         1: 1734:        c |= (1<<4);
   2561         1: 1735:      sBytesPush(&r, c);
   2562 call    0 returned 100%
   2563         -: 1736:      }
   2564         1: 1737:      break;
   2565         -: 1738:    case DICT:
   2566        40: 1739:      dictNetSerial(&r, (sDictt *)&(o->type), &ctx, /*packing=*/NOPACKING);
   2567 call    0 returned 100%
   2568        40: 1740:      break;
   2569         -: 1741:    case DOUBLE:
   2570         1: 1742:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
   2571 call    0 returned 100%
   2572         1: 1743:      sBytesPushBuffer(&r, &((sDoublet *)&(o->type))->value, sizeof(double));
   2573 call    0 returned 100%
   2574         1: 1744:      break;
   2575         -: 1745:    case INT: {
   2576         -: 1746:      // encode int to varint
   2577         -: 1747:      // v is int64_t to convert to varint
   2578         3: 1748:      i64 v = ((sIntt *)&(o->type))->value;
   2579         -: 1749:      // encode v with arithmetic shifts
   2580         3: 1750:      uintToNetTypeVarint(&r, NET_SERIAL_TYPES[(u8)o->type], (v << 1) ^ (v >> 63));
   2581 call    0 returned 100%
   2582         -: 1751:      }
   2583         3: 1752:      break;
   2584         -: 1753:    case STRING:
   2585         1: 1754:      sBytesPush(&r, NET_SERIAL_TYPES[(u8)o->type]);
   2586 call    0 returned 100%
   2587         1: 1755:      sBytesPushBuffer(&r, &((sStringt *)&(o->type))->data, sizeof(sStringt) + strlen(&(((sStringt *)&(o->type))->data)) -1);
   2588 call    0 returned 100%
   2589         1: 1756:      break;
   2590         -: 1757:    case ARRAY:
   2591        39: 1758:      arrayNetSerial(&r, (sArrayt *)&(o->type), &ctx, /*packing=*/NOPACKING);
   2592 call    0 returned 100%
   2593        39: 1759:      break;
   2594         -: 1760:    case BYTES:
   2595     #####: 1761:      B = (sBytest *)&(o->type);
   2596     #####: 1762:      uintToNetTypeVarint(&r, NET_SERIAL_TYPES[(u8)o->type], B->count);
   2597 call    0 never executed
   2598     #####: 1763:      sBytesPushBuffer(&r, &(B->data), B->count);
   2599 call    0 never executed
   2600     #####: 1764:      break;
   2601         -: 1765:  }
   2602        86: 1766:  ret r;
   2603         -: 1767:}
   2604         -: 1768:
   2605         -: 1769:/**
   2606         -: 1770: * serialize dictionary
   2607         -: 1771: *
   2608         -: 1772: * the serialized dict is pushed to r.
   2609         -: 1773: * All elements are serialized recursively
   2610         -: 1774: *
   2611         -: 1775: * the data in containers is not serialized
   2612         -: 1776: *
   2613         -: 1777: * \param
   2614         -: 1778: *   r small bytes object
   2615         -: 1779: *   dict dictionary to serialize
   2616         -: 1780: */
   2617 function dictNetSerial called 83 returned 100% blocks executed 96%
   2618        83: 1781:internal void dictNetSerial(sBytest **r, sDictt *dict, contextt *ctx, packingT packing) {
   2619        83: 1782:  sBytest *B     = NULL;
   2620        83: 1783:  char    *data  = NULL;
   2621         -: 1784:
   2622         -: 1785:  // compute allocated element count and use that instead of dict->count
   2623         -: 1786:  // when elements are deleted, some positions are NULL
   2624         -: 1787:  // and should not be counted
   2625        83: 1788:  u32 cnt =0;
   2626       302: 1789:  {forEachSDict(dict, e) {
   2627 branch  0 taken 73%
   2628 branch  1 taken 27% (fallthrough)
   2629       219: 1790:    if (e->key) {
   2630 branch  0 taken 99% (fallthrough)
   2631 branch  1 taken 1%
   2632       218: 1791:      inc cnt;
   2633         -: 1792:    }
   2634         -: 1793:  }}
   2635         -: 1794:
   2636         -: 1795:  // check if all elements have same type
   2637         -: 1796:  // then set dict type normal or uniform
   2638         -: 1797:  // array and dict have to be checked recursively to know if they are normal or uniform
   2639        83: 1798:  bool allElementsHaveSameType = true;
   2640        83: 1799:  bool foundFirstType          = false;
   2641        83: 1800:  char type                    = 0;
   2642         -: 1801:  // get first element type
   2643         -: 1802:  // compare to other element type
   2644       209: 1803:  {forEachSDict(dict, e) {
   2645 branch  0 taken 78%
   2646 branch  1 taken 22% (fallthrough)
   2647       164: 1804:    if (e->key) {
   2648 branch  0 taken 99% (fallthrough)
   2649 branch  1 taken 1%
   2650       163: 1805:      if (foundFirstType) {
   2651 branch  0 taken 56% (fallthrough)
   2652 branch  1 taken 44%
   2653         -: 1806:        u8 nextType;
   2654        92: 1807:        switch(e->data->type) {
   2655 branch  0 taken 16%
   2656 branch  1 taken 11%
   2657 branch  2 taken 73%
   2658         -: 1808:          case DICT:
   2659        15: 1809:            nextType = isDictUniform((sDictt*)e->data);
   2660 call    0 returned 100%
   2661        15: 1810:            break;
   2662         -: 1811:          case ARRAY:
   2663        10: 1812:            nextType = isArrayUniform((sArrayt*)e->data);
   2664 call    0 returned 100%
   2665        10: 1813:            break;
   2666         -: 1814:          default:
   2667        67: 1815:            nextType = NET_SERIAL_TYPES[(u8)e->data->type];
   2668         -: 1816:        }
   2669        92: 1817:        if (nextType != type) {
   2670 branch  0 taken 41% (fallthrough)
   2671 branch  1 taken 59%
   2672        38: 1818:          allElementsHaveSameType = false;
   2673        38: 1819:          break;
   2674         -: 1820:        }
   2675         -: 1821:      }
   2676         -: 1822:      else {
   2677        71: 1823:        switch(e->data->type) {
   2678 branch  0 taken 7%
   2679 branch  1 taken 4%
   2680 branch  2 taken 89%
   2681         -: 1824:          case DICT:
   2682         5: 1825:            type = isDictUniform((sDictt*)e->data);
   2683 call    0 returned 100%
   2684         5: 1826:            break;
   2685         -: 1827:          case ARRAY:
   2686         3: 1828:            type = isArrayUniform((sArrayt*)e->data);
   2687 call    0 returned 100%
   2688         3: 1829:            break;
   2689         -: 1830:          default:
   2690        63: 1831:            type = NET_SERIAL_TYPES[(u8)e->data->type];
   2691         -: 1832:        }
   2692        71: 1833:        foundFirstType = true;
   2693         -: 1834:      }
   2694         -: 1835:    }
   2695         -: 1836:  }}
   2696         -: 1837:
   2697        83: 1838:  if (allElementsHaveSameType) {
   2698 branch  0 taken 54% (fallthrough)
   2699 branch  1 taken 46%
   2700         -: 1839:    // uniform dict
   2701         -: 1840:    // encode type and element count
   2702         -: 1841:
   2703         -: 1842:    // in pack dictionary
   2704        45: 1843:    if (packing == PACK) {
   2705 branch  0 taken 40% (fallthrough)
   2706 branch  1 taken 60%
   2707         -: 1844:      // uniform dict can't be packed
   2708         -: 1845:      // because there is only one type of packed arrays
   2709        18: 1846:      goto normalDict;
   2710         -: 1847:    }
   2711        27: 1848:    elif (packing == UNIFORM) {
   2712 branch  0 taken 15% (fallthrough)
   2713 branch  1 taken 85%
   2714         -: 1849:      // when the packing is uniform, there is no need to encode UNIFORM_DICT since all elements have this type
   2715         4: 1850:      uintToNetTypeVarint(r, type, cnt);
   2716 call    0 returned 100%
   2717         -: 1851:    }
   2718         -: 1852:    else {
   2719        23: 1853:      if (ctx->nibble == lowNbl) {
   2720 branch  0 taken 91% (fallthrough)
   2721 branch  1 taken 9%
   2722        21: 1854:        sBytesPush(r, (type << 4) + UNIFORM_DICT);
   2723 call    0 returned 100%
   2724        21: 1855:        uintToVarint(r, cnt);
   2725 call    0 returned 100%
   2726         -: 1856:      }
   2727         -: 1857:      else {
   2728         -: 1858:        // high nibble
   2729         2: 1859:        ctx->nibble  = lowNbl;
   2730         2: 1860:        data         = (char *)&((*r)->data) + ctx->nblOffset;
   2731         2: 1861:        *data       |= UNIFORM_DICT << 4;
   2732         2: 1862:        uintToNetTypeVarint(r, type, cnt);
   2733 call    0 returned 100%
   2734         -: 1863:      }
   2735         -: 1864:    }
   2736         -: 1865:
   2737         -: 1866:    // encode all element keys and values
   2738        27: 1867:    switch(type) {
   2739 branch  0 taken 11%
   2740 branch  1 taken 15%
   2741 branch  2 taken 7%
   2742 branch  3 taken 4%
   2743 branch  4 taken 33%
   2744 branch  5 taken 19%
   2745 branch  6 taken 7%
   2746 branch  7 taken 4%
   2747 branch  8 taken 0%
   2748         -: 1868:      case S_UNDEFINED:
   2749        10: 1869:        {forEachSDict(dict, e) {
   2750 branch  0 taken 70%
   2751 branch  1 taken 30% (fallthrough)
   2752         7: 1870:          if (e->key) {
   2753 branch  0 taken 86% (fallthrough)
   2754 branch  1 taken 14%
   2755         6: 1871:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   2756 call    0 returned 100%
   2757         -: 1872:          }
   2758         -: 1873:        }}
   2759         -: 1874:
   2760         3: 1875:        break;
   2761         -: 1876:      case S_BOOL:
   2762        19: 1877:        {forEachSDict(dict, e) {
   2763 branch  0 taken 79%
   2764 branch  1 taken 21% (fallthrough)
   2765        15: 1878:          if (e->key) {
   2766 branch  0 taken 100% (fallthrough)
   2767 branch  1 taken 0%
   2768        15: 1879:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   2769 call    0 returned 100%
   2770         -: 1880:
   2771        15: 1881:            if (!ctx->boolOffset) {
   2772 branch  0 taken 20% (fallthrough)
   2773 branch  1 taken 80%
   2774         -: 1882:              // new packed bools
   2775         3: 1883:              storeNew8bPackedBool(e->data);
   2776 branch  0 taken 100% (fallthrough)
   2777 branch  1 taken 0%
   2778 call    2 returned 100%
   2779         -: 1884:            }
   2780         -: 1885:            else {
   2781         -: 1886:              // there was a bool before this one, fill bits in nibbles
   2782        12: 1887:              if (ctx->boolShift == 8) {
   2783 branch  0 taken 8% (fallthrough)
   2784 branch  1 taken 92%
   2785         -: 1888:                // previous packed bool is full
   2786         -: 1889:                // next byte is the new packed bools
   2787         1: 1890:                storeNew8bPackedBool(e->data);
   2788 branch  0 taken 100% (fallthrough)
   2789 branch  1 taken 0%
   2790 call    2 returned 100%
   2791         -: 1891:              }
   2792         -: 1892:              else {
   2793        11: 1893:                storeBool(e->data);
   2794 branch  0 taken 91% (fallthrough)
   2795 branch  1 taken 9%
   2796         -: 1894:              }
   2797         -: 1895:            }
   2798         -: 1896:          }
   2799         -: 1897:        }}
   2800         4: 1898:        break;
   2801         -: 1899:      case S_DICT:
   2802         -: 1900:      case UNIFORM_DICT:
   2803         6: 1901:        {forEachSDict(dict, e) {
   2804 branch  0 taken 67%
   2805 branch  1 taken 33% (fallthrough)
   2806         4: 1902:          if (e->key) {
   2807 branch  0 taken 100% (fallthrough)
   2808 branch  1 taken 0%
   2809         4: 1903:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   2810 call    0 returned 100%
   2811         4: 1904:            dictNetSerial(r, (sDictt *)(e->data), ctx, /*packing=*/UNIFORM);
   2812 call    0 returned 100%
   2813         -: 1905:          }
   2814         -: 1906:        }}
   2815         2: 1907:        break;
   2816         -: 1908:      case S_DOUBLE:
   2817         4: 1909:        {forEachSDict(dict, e) {
   2818 branch  0 taken 75%
   2819 branch  1 taken 25% (fallthrough)
   2820         3: 1910:          if (e->key) {
   2821 branch  0 taken 100% (fallthrough)
   2822 branch  1 taken 0%
   2823         3: 1911:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   2824 call    0 returned 100%
   2825         3: 1912:            sBytesPushBuffer(r, &((sDoublet *)(e->data))->value, sizeof(double));
   2826 call    0 returned 100%
   2827         -: 1913:          }
   2828         -: 1914:        }}
   2829         1: 1915:        break;
   2830         -: 1916:      case S_INT:
   2831        21: 1917:        {forEachSDict(dict, e) {
   2832 branch  0 taken 57%
   2833 branch  1 taken 43% (fallthrough)
   2834        12: 1918:          if (e->key) {
   2835 branch  0 taken 100% (fallthrough)
   2836 branch  1 taken 0%
   2837        12: 1919:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   2838 call    0 returned 100%
   2839        12: 1920:            i64 v = ((sIntt *)(e->data))->value;
   2840        12: 1921:            uintToVarint(r, (v << 1) ^ (v >> 63));
   2841 call    0 returned 100%
   2842         -: 1922:          }
   2843         -: 1923:        }}
   2844         9: 1924:        break;
   2845         -: 1925:      case S_STRING:
   2846        16: 1926:        {forEachSDict(dict, e) {
   2847 branch  0 taken 69%
   2848 branch  1 taken 31% (fallthrough)
   2849        11: 1927:          if (e->key) {
   2850 branch  0 taken 100% (fallthrough)
   2851 branch  1 taken 0%
   2852        11: 1928:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   2853 call    0 returned 100%
   2854        11: 1929:            sBytesPushBuffer(r, &((sStringt *)(e->data))->data, sizeof(sStringt) + strlen(&(((sStringt *)(e->data))->data)) -1);
   2855 call    0 returned 100%
   2856         -: 1930:          }
   2857         -: 1931:        }}
   2858         5: 1932:        break;
   2859         -: 1933:      case S_ARRAY:
   2860         -: 1934:      case UNIFORM_ARRAY:
   2861         4: 1935:        {forEachSDict(dict, e) {
   2862 branch  0 taken 50%
   2863 branch  1 taken 50% (fallthrough)
   2864         2: 1936:          if (e->key) {
   2865 branch  0 taken 100% (fallthrough)
   2866 branch  1 taken 0%
   2867         2: 1937:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   2868 call    0 returned 100%
   2869         2: 1938:            arrayNetSerial(r, (sArrayt *)(e->data), ctx, /*packing=*/UNIFORM);
   2870 call    0 returned 100%
   2871         -: 1939:          }
   2872         -: 1940:        }}
   2873         2: 1941:        break;
   2874         -: 1942:      case S_BYTES:
   2875         3: 1943:        {forEachSDict(dict, e) {
   2876 branch  0 taken 67%
   2877 branch  1 taken 33% (fallthrough)
   2878         2: 1944:          if (e->key) {
   2879 branch  0 taken 100% (fallthrough)
   2880 branch  1 taken 0%
   2881         2: 1945:            sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   2882 call    0 returned 100%
   2883         2: 1946:            B = (sBytest *)(e->data);
   2884         2: 1947:            uintToVarint(r, B->count);
   2885 call    0 returned 100%
   2886         2: 1948:            sBytesPushBuffer(r, &(B->data), B->count);
   2887 call    0 returned 100%
   2888         -: 1949:          }
   2889         -: 1950:        }}
   2890         1: 1951:        break;
   2891         -: 1952:    }
   2892        27: 1953:    ret;
   2893         -: 1954:  }
   2894         -: 1955:
   2895         -: 1956:  normalDict:
   2896         -: 1957:  // encode type and element count
   2897        56: 1958:  if (packing == PACK or packing == UNIFORM) {
   2898 branch  0 taken 59% (fallthrough)
   2899 branch  1 taken 41%
   2900 branch  2 taken 12% (fallthrough)
   2901 branch  3 taken 88%
   2902         -: 1959:    // when the packing is packed or uniform, there is no need to encode DICT type since all elements have this type
   2903        27: 1960:    uintToVarint(r, cnt);
   2904 call    0 returned 100%
   2905         -: 1961:  }
   2906         -: 1962:  else {
   2907        29: 1963:    if (ctx->nibble == lowNbl) {
   2908 branch  0 taken 93% (fallthrough)
   2909 branch  1 taken 7%
   2910        27: 1964:      uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)dict->type], cnt);
   2911 call    0 returned 100%
   2912         -: 1965:    }
   2913         -: 1966:    else {
   2914         -: 1967:      // high nibble
   2915         -: 1968:      #define storeTypeInHighNbl(o)\
   2916         -: 1969:      ctx->nibble  = lowNbl;\
   2917         -: 1970:      data         = (char *)&((*r)->data) + ctx->nblOffset;\
   2918         -: 1971:      *data       |= NET_SERIAL_TYPES[(u8)o->type] << 4
   2919         2: 1972:      storeTypeInHighNbl(dict);
   2920         2: 1973:      uintToVarint(r, cnt);
   2921 call    0 returned 100%
   2922         -: 1974:    }
   2923         -: 1975:  }
   2924         -: 1976:
   2925        56: 1977:  bool   pack = false;
   2926         -: 1978:  size_t packCount;
   2927       219: 1979:  enumerateSDict(dict, e, eIdx) {
   2928 branch  0 taken 74%
   2929 branch  1 taken 26% (fallthrough)
   2930       163: 1980:    if (e->key) {
   2931 branch  0 taken 100% (fallthrough)
   2932 branch  1 taken 0%
   2933       163: 1981:      if (!pack) {
   2934 branch  0 taken 77% (fallthrough)
   2935 branch  1 taken 23%
   2936         -: 1982:        // scan dict for packing
   2937       125: 1983:        if ((cnt - eIdx) > 3) {
   2938 branch  0 taken 34% (fallthrough)
   2939 branch  1 taken 66%
   2940         -: 1984:          // at least 4 elements, less than that is not worth it
   2941        42: 1985:          if (   e->data->type == DICT
   2942 branch  0 taken 93% (fallthrough)
   2943 branch  1 taken 7%
   2944        39: 1986:              or e->data->type == DOUBLE
   2945 branch  0 taken 95% (fallthrough)
   2946 branch  1 taken 5%
   2947        37: 1987:              or e->data->type == INT
   2948 branch  0 taken 95% (fallthrough)
   2949 branch  1 taken 5%
   2950        35: 1988:              or e->data->type == STRING
   2951 branch  0 taken 94% (fallthrough)
   2952 branch  1 taken 6%
   2953        33: 1989:              or e->data->type == ARRAY
   2954 branch  0 taken 94% (fallthrough)
   2955 branch  1 taken 6%
   2956        31: 1990:              or e->data->type == BYTES) {
   2957 branch  0 taken 0% (fallthrough)
   2958 branch  1 taken 100%
   2959        11: 1991:            type      = e->data->type;
   2960        11: 1992:            packCount = 1;
   2961        11: 1993:            sDictElemt *element = &((dict)->elements) + eIdx +1;
   2962        49: 1994:            for (size_t i = eIdx+1; i < (dict)->count ; i++, element = &((dict)->elements) + i) {
   2963 branch  0 taken 100%
   2964 branch  1 taken 0% (fallthrough)
   2965        49: 1995:              if (element->key) {
   2966 branch  0 taken 100% (fallthrough)
   2967 branch  1 taken 0%
   2968        49: 1996:                if (element->data->type != type) {
   2969 branch  0 taken 22% (fallthrough)
   2970 branch  1 taken 78%
   2971        11: 1997:                  break;
   2972         -: 1998:                }
   2973        38: 1999:                packCount++;
   2974         -: 2000:              } // element->key
   2975         -: 2001:            } // for
   2976        11: 2002:            if (packCount > 3) {
   2977 branch  0 taken 100% (fallthrough)
   2978 branch  1 taken 0%
   2979        11: 2003:              type = PACKED_NET_SERIAL_TYPES[(u8)type];
   2980        11: 2004:              pack = true;
   2981         -: 2005:            }
   2982         -: 2006:          } // test current element type
   2983         -: 2007:        } // is dict big enough
   2984         -: 2008:      } // not already packing
   2985         -: 2009:
   2986         -: 2010:      // encode key
   2987       163: 2011:      sBytesPushBuffer(r, e->key, strlen(e->key) + 1);
   2988 call    0 returned 100%
   2989         -: 2012:
   2990         -: 2013:      // encode value
   2991       163: 2014:      switch(e->data->type) {
   2992 branch  0 taken 18%
   2993 branch  1 taken 19%
   2994 branch  2 taken 12%
   2995 branch  3 taken 7%
   2996 branch  4 taken 20%
   2997 branch  5 taken 13%
   2998 branch  6 taken 9%
   2999 branch  7 taken 1%
   3000 branch  8 taken 0%
   3001         -: 2015:        case UNDEFINED:
   3002         -: 2016:        case CONTAINER:
   3003        29: 2017:          if (ctx->nibble == lowNbl) {
   3004 branch  0 taken 93% (fallthrough)
   3005 branch  1 taken 7%
   3006         -: 2018:            #define storeTypeOnly(o)\
   3007         -: 2019:            sBytesPush(r, NET_SERIAL_TYPES[(u8)o->type]);\
   3008         -: 2020:            ctx->nibble    = highNbl;\
   3009         -: 2021:            ctx->nblOffset = (*r)->count -1
   3010        27: 2022:            storeTypeOnly(e->data);
   3011 call    0 returned 100%
   3012         -: 2023:          }
   3013         -: 2024:          else {
   3014         2: 2025:            storeTypeInHighNbl(e->data);
   3015         -: 2026:          }
   3016        29: 2027:          break;
   3017         -: 2028:        case BOOL:
   3018        31: 2029:          if (!ctx->boolOffset) {
   3019 branch  0 taken 16% (fallthrough)
   3020 branch  1 taken 84%
   3021         -: 2030:            // new packed bools
   3022         5: 2031:            if (ctx->nibble == lowNbl) {
   3023 branch  0 taken 60% (fallthrough)
   3024 branch  1 taken 40%
   3025         -: 2032:              #define storeNew4bPackedBool(o)\
   3026         -: 2033:              u8 c = NET_SERIAL_TYPES[(u8)o->type];\
   3027         -: 2034:              /* set bit 4 when true */\
   3028         -: 2035:              if (((sBoolt *)(o))->value)\
   3029         -: 2036:                c |= (1<<4);\
   3030         -: 2037:              sBytesPush(r, c);\
   3031         -: 2038:              ctx->boolShift  = 5;\
   3032         -: 2039:              ctx->boolOffset = (*r)->count -1
   3033         3: 2040:              storeNew4bPackedBool(e->data);
   3034 branch  0 taken 100% (fallthrough)
   3035 branch  1 taken 0%
   3036 call    2 returned 100%
   3037         -: 2041:            }
   3038         -: 2042:            else {
   3039         -: 2043:              // high nibble, next byte is packed bools
   3040         2: 2044:              storeTypeInHighNbl(e->data);
   3041         -: 2045:              #define storeNew8bPackedBool(o)\
   3042         -: 2046:              u8 c         = 0;\
   3043         -: 2047:              if (((sBoolt *)(o))->value)\
   3044         -: 2048:                c = 1;\
   3045         -: 2049:              sBytesPush(r, c);\
   3046         -: 2050:              ctx->boolShift  = 1;\
   3047         -: 2051:              ctx->boolOffset = (*r)->count -1
   3048         2: 2052:              storeNew8bPackedBool(e->data);
   3049 branch  0 taken 100% (fallthrough)
   3050 branch  1 taken 0%
   3051 call    2 returned 100%
   3052         -: 2053:            }
   3053         -: 2054:          }
   3054         -: 2055:          else {
   3055         -: 2056:            // there was a bool before this one, fill bits in nibbles
   3056        26: 2057:            if (ctx->nibble == lowNbl) {
   3057 branch  0 taken 58% (fallthrough)
   3058 branch  1 taken 42%
   3059        15: 2058:              if (ctx->boolShift == 8) {
   3060 branch  0 taken 7% (fallthrough)
   3061 branch  1 taken 93%
   3062         -: 2059:                // previous packed bool is full
   3063         -: 2060:                // this byte is the new packed bools
   3064         1: 2061:                storeNew4bPackedBool(e->data);
   3065 branch  0 taken 100% (fallthrough)
   3066 branch  1 taken 0%
   3067 call    2 returned 100%
   3068         -: 2062:              }
   3069         -: 2063:              else {
   3070        14: 2064:                storeTypeOnly(e->data);
   3071 call    0 returned 100%
   3072         -: 2065:                #define storeBool(o)\
   3073         -: 2066:                data           = (char *)&((*r)->data) + ctx->boolOffset;\
   3074         -: 2067:                if (((sBoolt *)(o))->value)\
   3075         -: 2068:                  *data |= 1 << ctx->boolShift;\
   3076         -: 2069:                ctx->boolShift++
   3077        14: 2070:                storeBool(e->data);
   3078 branch  0 taken 100% (fallthrough)
   3079 branch  1 taken 0%
   3080         -: 2071:              }
   3081         -: 2072:            }
   3082         -: 2073:            else {
   3083         -: 2074:              // high nibble
   3084        11: 2075:              storeTypeInHighNbl(e->data);
   3085        11: 2076:              if (ctx->boolShift == 8) {
   3086 branch  0 taken 18% (fallthrough)
   3087 branch  1 taken 82%
   3088         -: 2077:                // previous packed bool is full
   3089         -: 2078:                // next byte is the new packed bools
   3090         2: 2079:                storeNew8bPackedBool(e->data);
   3091 branch  0 taken 100% (fallthrough)
   3092 branch  1 taken 0%
   3093 call    2 returned 100%
   3094         -: 2080:              }
   3095         -: 2081:              else {
   3096         9: 2082:                storeBool(e->data);
   3097 branch  0 taken 100% (fallthrough)
   3098 branch  1 taken 0%
   3099         -: 2083:              }
   3100         -: 2084:            }
   3101         -: 2085:          }
   3102        31: 2086:          break;
   3103         -: 2087:        case DICT:
   3104        20: 2088:          if (pack) {
   3105 branch  0 taken 75% (fallthrough)
   3106 branch  1 taken 25%
   3107        15: 2089:            if (type) {
   3108 branch  0 taken 20% (fallthrough)
   3109 branch  1 taken 80%
   3110         -: 2090:              // this is the first packed element
   3111         3: 2091:              if (ctx->nibble == lowNbl) {
   3112 branch  0 taken 67% (fallthrough)
   3113 branch  1 taken 33%
   3114         2: 2092:                uintToNetTypeVarint(r, type, packCount);
   3115 call    0 returned 100%
   3116         -: 2093:              }
   3117         -: 2094:              else {
   3118         -: 2095:                // high nibble
   3119         -: 2096:                // store type in high nibble
   3120         1: 2097:                ctx->nibble  = lowNbl;
   3121         1: 2098:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   3122         1: 2099:                *data       |= type << 4;
   3123         1: 2100:                uintToVarint(r, packCount);
   3124 call    0 returned 100%
   3125         -: 2101:              }
   3126         3: 2102:              type = 0;
   3127         -: 2103:            } // if type
   3128         -: 2104:
   3129        15: 2105:            dictNetSerial(r, (sDictt *)(e->data), ctx, /*packing=*/PACK);
   3130 call    0 returned 100%
   3131         -: 2106:            // stop packing when packCount == 0
   3132        15: 2107:            packCount--;
   3133        15: 2108:            if (!packCount) pack = false;
   3134 branch  0 taken 20% (fallthrough)
   3135 branch  1 taken 80%
   3136         -: 2109:          } // if pack
   3137         -: 2110:          else
   3138         5: 2111:            dictNetSerial(r, (sDictt *)(e->data), ctx, /*packing=*/NOPACKING);
   3139 call    0 returned 100%
   3140        20: 2112:          break;
   3141         -: 2113:        case DOUBLE:
   3142        12: 2114:          if (pack) {
   3143 branch  0 taken 83% (fallthrough)
   3144 branch  1 taken 17%
   3145        10: 2115:            if (type) {
   3146 branch  0 taken 20% (fallthrough)
   3147 branch  1 taken 80%
   3148         -: 2116:              // this is the first packed element
   3149         2: 2117:              if (ctx->nibble == lowNbl) {
   3150 branch  0 taken 50% (fallthrough)
   3151 branch  1 taken 50%
   3152         1: 2118:                uintToNetTypeVarint(r, type, packCount);
   3153 call    0 returned 100%
   3154         -: 2119:              }
   3155         -: 2120:              else {
   3156         -: 2121:                // high nibble
   3157         -: 2122:                // store type in high nibble
   3158         1: 2123:                ctx->nibble  = lowNbl;
   3159         1: 2124:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   3160         1: 2125:                *data       |= type << 4;
   3161         1: 2126:                uintToVarint(r, packCount);
   3162 call    0 returned 100%
   3163         -: 2127:              }
   3164         2: 2128:              type = 0;
   3165         -: 2129:            } // if type
   3166         -: 2130:
   3167        10: 2131:            sBytesPushBuffer(r, &((sDoublet *)(e->data))->value, sizeof(double));
   3168 call    0 returned 100%
   3169         -: 2132:            // stop packing when packCount == 0
   3170        10: 2133:            packCount--;
   3171        10: 2134:            if (!packCount) pack = false;
   3172 branch  0 taken 20% (fallthrough)
   3173 branch  1 taken 80%
   3174         -: 2135:          } // if pack
   3175         -: 2136:          else {
   3176         2: 2137:            if (ctx->nibble == lowNbl) {
   3177 branch  0 taken 50% (fallthrough)
   3178 branch  1 taken 50%
   3179         1: 2138:              storeTypeOnly(e->data);
   3180 call    0 returned 100%
   3181         -: 2139:            }
   3182         -: 2140:            else {
   3183         -: 2141:              // high nibble
   3184         1: 2142:              storeTypeInHighNbl(e->data);
   3185         -: 2143:            }
   3186         2: 2144:            sBytesPushBuffer(r, &((sDoublet *)(e->data))->value, sizeof(double));
   3187 call    0 returned 100%
   3188         -: 2145:          }
   3189        12: 2146:          break;
   3190         -: 2147:        case INT:
   3191        32: 2148:          if (pack) {
   3192 branch  0 taken 25% (fallthrough)
   3193 branch  1 taken 75%
   3194         8: 2149:            if (type) {
   3195 branch  0 taken 25% (fallthrough)
   3196 branch  1 taken 75%
   3197         -: 2150:              // this is the first packed element
   3198         2: 2151:              if (ctx->nibble == lowNbl) {
   3199 branch  0 taken 50% (fallthrough)
   3200 branch  1 taken 50%
   3201         1: 2152:                uintToNetTypeVarint(r, type, packCount);
   3202 call    0 returned 100%
   3203         -: 2153:              }
   3204         -: 2154:              else {
   3205         -: 2155:                // high nibble
   3206         -: 2156:                // store type in high nibble
   3207         1: 2157:                ctx->nibble  = lowNbl;
   3208         1: 2158:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   3209         1: 2159:                *data       |= type << 4;
   3210         1: 2160:                uintToVarint(r, packCount);
   3211 call    0 returned 100%
   3212         -: 2161:              }
   3213         2: 2162:              type = 0;
   3214         -: 2163:            } // if type
   3215         -: 2164:
   3216         8: 2165:            i64 v = ((sIntt *)(e->data))->value;
   3217         8: 2166:            uintToVarint(r, (v << 1) ^ (v >> 63));
   3218 call    0 returned 100%
   3219         -: 2167:            // stop packing when packCount == 0
   3220         8: 2168:            packCount--;
   3221         8: 2169:            if (!packCount) pack = false;
   3222 branch  0 taken 25% (fallthrough)
   3223 branch  1 taken 75%
   3224         -: 2170:          } // if pack
   3225         -: 2171:          else {
   3226         -: 2172:            // encode int to varint
   3227         -: 2173:            // v is int64_t to convert to varint
   3228        24: 2174:            i64 v = ((sIntt *)(e->data))->value;
   3229        24: 2175:            if (ctx->nibble == lowNbl) {
   3230 branch  0 taken 50% (fallthrough)
   3231 branch  1 taken 50%
   3232         -: 2176:              // encode v with arithmetic shifts
   3233        12: 2177:              uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->data->type], (v << 1) ^ (v >> 63));
   3234 call    0 returned 100%
   3235         -: 2178:            }
   3236         -: 2179:            else {
   3237         -: 2180:              // high nibble
   3238        12: 2181:              storeTypeInHighNbl(e->data);
   3239        12: 2182:              uintToVarint(r, (v << 1) ^ (v >> 63));
   3240 call    0 returned 100%
   3241         -: 2183:            }
   3242         -: 2184:          }
   3243        32: 2185:          break;
   3244         -: 2186:        case STRING:
   3245        22: 2187:          if (pack) {
   3246 branch  0 taken 36% (fallthrough)
   3247 branch  1 taken 64%
   3248         8: 2188:            if (type) {
   3249 branch  0 taken 25% (fallthrough)
   3250 branch  1 taken 75%
   3251         -: 2189:              // this is the first packed element
   3252         2: 2190:              if (ctx->nibble == lowNbl) {
   3253 branch  0 taken 50% (fallthrough)
   3254 branch  1 taken 50%
   3255         1: 2191:                uintToNetTypeVarint(r, type, packCount);
   3256 call    0 returned 100%
   3257         -: 2192:              }
   3258         -: 2193:              else {
   3259         -: 2194:                // high nibble
   3260         -: 2195:                // store type in high nibble
   3261         1: 2196:                ctx->nibble  = lowNbl;
   3262         1: 2197:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   3263         1: 2198:                *data       |= type << 4;
   3264         1: 2199:                uintToVarint(r, packCount);
   3265 call    0 returned 100%
   3266         -: 2200:              }
   3267         2: 2201:              type = 0;
   3268         -: 2202:            } // if type
   3269         -: 2203:
   3270         8: 2204:            sBytesPushBuffer(r, &((sStringt *)(e->data))->data, sizeof(sStringt) + strlen(&(((sStringt *)(e->data))->data)) -1);
   3271 call    0 returned 100%
   3272         -: 2205:            // stop packing when packCount == 0
   3273         8: 2206:            packCount--;
   3274         8: 2207:            if (!packCount) pack = false;
   3275 branch  0 taken 25% (fallthrough)
   3276 branch  1 taken 75%
   3277         -: 2208:          } // if pack
   3278         -: 2209:          else {
   3279        14: 2210:            if (ctx->nibble == lowNbl) {
   3280 branch  0 taken 93% (fallthrough)
   3281 branch  1 taken 7%
   3282        13: 2211:              storeTypeOnly(e->data);
   3283 call    0 returned 100%
   3284         -: 2212:            }
   3285         -: 2213:            else {
   3286         -: 2214:              // high nibble
   3287         1: 2215:              storeTypeInHighNbl(e->data);
   3288         -: 2216:            }
   3289        14: 2217:            sBytesPushBuffer(r, &((sStringt *)(e->data))->data, sizeof(sStringt) + strlen(&(((sStringt *)(e->data))->data)) -1);
   3290 call    0 returned 100%
   3291         -: 2218:          }
   3292        22: 2219:          break;
   3293         -: 2220:        case ARRAY:
   3294        15: 2221:          if (pack) {
   3295 branch  0 taken 53% (fallthrough)
   3296 branch  1 taken 47%
   3297         8: 2222:            if (type) {
   3298 branch  0 taken 25% (fallthrough)
   3299 branch  1 taken 75%
   3300         -: 2223:              // this is the first packed element
   3301         2: 2224:              if (ctx->nibble == lowNbl) {
   3302 branch  0 taken 50% (fallthrough)
   3303 branch  1 taken 50%
   3304         1: 2225:                uintToNetTypeVarint(r, type, packCount);
   3305 call    0 returned 100%
   3306         -: 2226:              }
   3307         -: 2227:              else {
   3308         -: 2228:                // high nibble
   3309         -: 2229:                // store type in high nibble
   3310         1: 2230:                ctx->nibble  = lowNbl;
   3311         1: 2231:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   3312         1: 2232:                *data       |= type << 4;
   3313         1: 2233:                uintToVarint(r, packCount);
   3314 call    0 returned 100%
   3315         -: 2234:              }
   3316         2: 2235:              type = 0;
   3317         -: 2236:            } // if type
   3318         -: 2237:
   3319         8: 2238:            arrayNetSerial(r, (sArrayt *)(e->data), ctx, /*packing=*/PACK);
   3320 call    0 returned 100%
   3321         -: 2239:            // stop packing when packCount == 0
   3322         8: 2240:            packCount--;
   3323         8: 2241:            if (!packCount) pack = false;
   3324 branch  0 taken 25% (fallthrough)
   3325 branch  1 taken 75%
   3326         -: 2242:          } // if pack
   3327         -: 2243:          else
   3328         7: 2244:            arrayNetSerial(r, (sArrayt *)(e->data), ctx, /*packing=*/NOPACKING);
   3329 call    0 returned 100%
   3330        15: 2245:          break;
   3331         -: 2246:        case BYTES:
   3332         2: 2247:          if (pack) {
   3333 branch  0 taken 0% (fallthrough)
   3334 branch  1 taken 100%
   3335     #####: 2248:            if (type) {
   3336 branch  0 never executed
   3337 branch  1 never executed
   3338         -: 2249:              // this is the first packed element
   3339     #####: 2250:              if (ctx->nibble == lowNbl) {
   3340 branch  0 never executed
   3341 branch  1 never executed
   3342     #####: 2251:                uintToNetTypeVarint(r, type, packCount);
   3343 call    0 never executed
   3344         -: 2252:              }
   3345         -: 2253:              else {
   3346         -: 2254:                // high nibble
   3347         -: 2255:                // store type in high nibble
   3348     #####: 2256:                ctx->nibble  = lowNbl;
   3349     #####: 2257:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   3350     #####: 2258:                *data       |= type << 4;
   3351     #####: 2259:                uintToVarint(r, packCount);
   3352 call    0 never executed
   3353         -: 2260:              }
   3354     #####: 2261:              type = 0;
   3355         -: 2262:            } // if type
   3356         -: 2263:
   3357     #####: 2264:            B = (sBytest *)(e->data);
   3358     #####: 2265:            uintToVarint(r, B->count);
   3359 call    0 never executed
   3360     #####: 2266:            sBytesPushBuffer(r, &(B->data), B->count);
   3361 call    0 never executed
   3362         -: 2267:            // stop packing when packCount == 0
   3363     #####: 2268:            packCount--;
   3364     #####: 2269:            if (!packCount) pack = false;
   3365 branch  0 never executed
   3366 branch  1 never executed
   3367         -: 2270:          } // if pack
   3368         -: 2271:          else {
   3369         2: 2272:            B = (sBytest *)(e->data);
   3370         2: 2273:            if (ctx->nibble == lowNbl) {
   3371 branch  0 taken 50% (fallthrough)
   3372 branch  1 taken 50%
   3373         1: 2274:              uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->data->type], B->count);
   3374 call    0 returned 100%
   3375         -: 2275:            }
   3376         -: 2276:            else {
   3377         -: 2277:              // high nibble
   3378         1: 2278:              storeTypeInHighNbl(e->data);
   3379         1: 2279:              uintToVarint(r, B->count);
   3380 call    0 returned 100%
   3381         -: 2280:            }
   3382         2: 2281:            sBytesPushBuffer(r, &(B->data), B->count);
   3383 call    0 returned 100%
   3384         -: 2282:          }
   3385         2: 2283:          break;
   3386         -: 2284:      }
   3387         -: 2285:    }
   3388         -: 2286:  }
   3389        56: 2287:  ret;
   3390         -: 2288:}
   3391         -: 2289:
   3392         -: 2290:/**
   3393         -: 2291: * serialize array
   3394         -: 2292: *
   3395         -: 2293: * the serialized array is pushed to r.
   3396         -: 2294: * All elements are serialized recursively
   3397         -: 2295: *
   3398         -: 2296: * the data in containers is not serialized
   3399         -: 2297: *
   3400         -: 2298: * \param
   3401         -: 2299: *   r small bytes object
   3402         -: 2300: *   array to serialize
   3403         -: 2301: */
   3404 function arrayNetSerial called 78 returned 100% blocks executed 91%
   3405        78: 2302:internal void arrayNetSerial(sBytest **r, sArrayt *array, contextt *ctx, packingT packing) {
   3406        78: 2303:  sBytest *B     = NULL;
   3407        78: 2304:  char    *data  = NULL;
   3408         -: 2305:
   3409         -: 2306:  // check if all elements have same type
   3410         -: 2307:  // then set array type normal or uniform
   3411         -: 2308:  // array and dict have to be checked recursively to know if they are normal or uniform
   3412        78: 2309:  bool allElementsHaveSameType = true;
   3413        78: 2310:  bool foundFirstType          = false;
   3414        78: 2311:  char type                    = 0;
   3415         -: 2312:
   3416         -: 2313:  // get first element type
   3417         -: 2314:  // compare to other element type
   3418         -: 2315:  // null element are interpreted as undefined
   3419       230: 2316:  {forEachSArray(array, e) {
   3420 branch  0 taken 82%
   3421 branch  1 taken 18% (fallthrough)
   3422       189: 2317:    if (!e) {
   3423 branch  0 taken 0% (fallthrough)
   3424 branch  1 taken 100%
   3425     #####: 2318:      if (foundFirstType) {
   3426 branch  0 never executed
   3427 branch  1 never executed
   3428     #####: 2319:        if (type != S_UNDEFINED) {
   3429 branch  0 never executed
   3430 branch  1 never executed
   3431     #####: 2320:          allElementsHaveSameType = false;
   3432     #####: 2321:          break;
   3433         -: 2322:        }
   3434         -: 2323:      }
   3435         -: 2324:      else {
   3436     #####: 2325:        type = S_UNDEFINED;
   3437     #####: 2326:        foundFirstType = true;
   3438         -: 2327:      }
   3439         -: 2328:    }
   3440         -: 2329:    else {
   3441       189: 2330:      if (foundFirstType) {
   3442 branch  0 taken 61% (fallthrough)
   3443 branch  1 taken 39%
   3444         -: 2331:        u8 nextType;
   3445       115: 2332:        switch(e->type) {
   3446 branch  0 taken 6%
   3447 branch  1 taken 10%
   3448 branch  2 taken 84%
   3449         -: 2333:          case DICT:
   3450         7: 2334:            nextType = isDictUniform((sDictt*)e);
   3451 call    0 returned 100%
   3452         7: 2335:            break;
   3453         -: 2336:          case ARRAY:
   3454        11: 2337:            nextType = isArrayUniform((sArrayt*)e);
   3455 call    0 returned 100%
   3456        11: 2338:            break;
   3457         -: 2339:          default:
   3458        97: 2340:            nextType = NET_SERIAL_TYPES[(u8)e->type];
   3459         -: 2341:        }
   3460       115: 2342:        if (nextType != type) {
   3461 branch  0 taken 32% (fallthrough)
   3462 branch  1 taken 68%
   3463        37: 2343:          allElementsHaveSameType = false;
   3464        37: 2344:          break;
   3465         -: 2345:        }
   3466         -: 2346:      }
   3467         -: 2347:      else {
   3468        74: 2348:        switch(e->type) {
   3469 branch  0 taken 7%
   3470 branch  1 taken 8%
   3471 branch  2 taken 85%
   3472         -: 2349:          case DICT:
   3473         5: 2350:            type = isDictUniform((sDictt*)e);
   3474 call    0 returned 100%
   3475         5: 2351:            break;
   3476         -: 2352:          case ARRAY:
   3477         6: 2353:            type = isArrayUniform((sArrayt*)e);
   3478 call    0 returned 100%
   3479         6: 2354:            break;
   3480         -: 2355:          default:
   3481        63: 2356:            type = NET_SERIAL_TYPES[(u8)e->type];
   3482         -: 2357:        }
   3483        74: 2358:        foundFirstType = true;
   3484         -: 2359:      }
   3485         -: 2360:    }
   3486         -: 2361:  }}
   3487         -: 2362:
   3488        78: 2363:  if (allElementsHaveSameType) {
   3489 branch  0 taken 53% (fallthrough)
   3490 branch  1 taken 47%
   3491         -: 2364:    // uniform array
   3492         -: 2365:    // encode type and element count
   3493         -: 2366:
   3494         -: 2367:    // in pack array
   3495        41: 2368:    if (packing == PACK) {
   3496 branch  0 taken 39% (fallthrough)
   3497 branch  1 taken 61%
   3498         -: 2369:      // uniform array can't be packed
   3499         -: 2370:      // because there is only one type of packed arrays
   3500        16: 2371:      goto normalArray;
   3501         -: 2372:    }
   3502        25: 2373:    elif (packing == UNIFORM) {
   3503 branch  0 taken 8% (fallthrough)
   3504 branch  1 taken 92%
   3505         -: 2374:      // when the packing is uniform, there is no need to encode UNIFORM_ARRAY since all elements have this type
   3506         2: 2375:      uintToNetTypeVarint(r, type, array->count);
   3507 call    0 returned 100%
   3508         -: 2376:    }
   3509         -: 2377:    else {
   3510        23: 2378:      if (ctx->nibble == lowNbl) {
   3511 branch  0 taken 78% (fallthrough)
   3512 branch  1 taken 22%
   3513        18: 2379:        sBytesPush(r, (type << 4) + UNIFORM_ARRAY);
   3514 call    0 returned 100%
   3515        18: 2380:        uintToVarint(r, array->count);
   3516 call    0 returned 100%
   3517         -: 2381:      }
   3518         -: 2382:      else {
   3519         -: 2383:        // high nibble
   3520         5: 2384:        ctx->nibble  = lowNbl;
   3521         5: 2385:        data         = (char *)&((*r)->data) + ctx->nblOffset;
   3522         5: 2386:        *data       |= UNIFORM_ARRAY << 4;
   3523         5: 2387:        uintToNetTypeVarint(r, type, array->count);
   3524 call    0 returned 100%
   3525         -: 2388:      }
   3526         -: 2389:    }
   3527         -: 2390:
   3528         -: 2391:    // encode all element values
   3529        25: 2392:    switch(type) {
   3530 branch  0 taken 8%
   3531 branch  1 taken 8%
   3532 branch  2 taken 4%
   3533 branch  3 taken 44%
   3534 branch  4 taken 4%
   3535 branch  5 taken 16%
   3536 branch  6 taken 4%
   3537 branch  7 taken 12%
   3538         -: 2393:      case S_BOOL:
   3539        16: 2394:        {forEachSArray(array, e) {
   3540 branch  0 taken 88%
   3541 branch  1 taken 13% (fallthrough)
   3542        14: 2395:          if (!ctx->boolOffset) {
   3543 branch  0 taken 14% (fallthrough)
   3544 branch  1 taken 86%
   3545         -: 2396:            // new packed bools
   3546         2: 2397:            storeNew8bPackedBool(e);
   3547 branch  0 taken 100% (fallthrough)
   3548 branch  1 taken 0%
   3549 call    2 returned 100%
   3550         -: 2398:          }
   3551         -: 2399:          else {
   3552         -: 2400:            // there was a bool before this one, fill bits in nibbles
   3553        12: 2401:            if (ctx->boolShift == 8) {
   3554 branch  0 taken 8% (fallthrough)
   3555 branch  1 taken 92%
   3556         -: 2402:              // previous packed bool is full
   3557         -: 2403:              // next byte is the new packed bools
   3558         1: 2404:              storeNew8bPackedBool(e);
   3559 branch  0 taken 0% (fallthrough)
   3560 branch  1 taken 100%
   3561 call    2 returned 100%
   3562         -: 2405:            }
   3563         -: 2406:            else {
   3564        11: 2407:              storeBool(e);
   3565 branch  0 taken 100% (fallthrough)
   3566 branch  1 taken 0%
   3567         -: 2408:            }
   3568         -: 2409:          }
   3569         -: 2410:        }}
   3570         2: 2411:        break;
   3571         -: 2412:      case S_DICT:
   3572         -: 2413:      case UNIFORM_DICT:
   3573         6: 2414:        {forEachSArray(array, e) {
   3574 branch  0 taken 67%
   3575 branch  1 taken 33% (fallthrough)
   3576         4: 2415:          dictNetSerial(r, (sDictt *)e, ctx, /*packing=*/UNIFORM);
   3577 call    0 returned 100%
   3578         -: 2416:        }}
   3579         2: 2417:        break;
   3580         -: 2418:      case S_DOUBLE:
   3581         4: 2419:        {forEachSArray(array, e) {
   3582 branch  0 taken 75%
   3583 branch  1 taken 25% (fallthrough)
   3584         3: 2420:          sBytesPushBuffer(r, &((sDoublet *)e)->value, sizeof(double));
   3585 call    0 returned 100%
   3586         -: 2421:        }}
   3587         1: 2422:        break;
   3588         -: 2423:      case S_INT:
   3589        49: 2424:        {forEachSArray(array, e) {
   3590 branch  0 taken 78%
   3591 branch  1 taken 22% (fallthrough)
   3592        38: 2425:          i64 v = ((sIntt *)e)->value;
   3593        38: 2426:          uintToVarint(r, (v << 1) ^ (v >> 63));
   3594 call    0 returned 100%
   3595         -: 2427:        }}
   3596        11: 2428:        break;
   3597         -: 2429:      case S_STRING:
   3598         4: 2430:        {forEachSArray(array, e) {
   3599 branch  0 taken 75%
   3600 branch  1 taken 25% (fallthrough)
   3601         3: 2431:          sBytesPushBuffer(r, &((sStringt *)e)->data, sizeof(sStringt) + strlen(&(((sStringt *)e)->data)) -1);
   3602 call    0 returned 100%
   3603         -: 2432:        }}
   3604         1: 2433:        break;
   3605         -: 2434:      case S_ARRAY:
   3606         -: 2435:      case UNIFORM_ARRAY:
   3607        10: 2436:        {forEachSArray(array, e) {
   3608 branch  0 taken 60%
   3609 branch  1 taken 40% (fallthrough)
   3610         6: 2437:          arrayNetSerial(r, (sArrayt *)e, ctx, /*packing=*/UNIFORM);
   3611 call    0 returned 100%
   3612         -: 2438:        }}
   3613         4: 2439:        break;
   3614         -: 2440:      case S_BYTES:
   3615         3: 2441:        {forEachSArray(array, e) {
   3616 branch  0 taken 67%
   3617 branch  1 taken 33% (fallthrough)
   3618         2: 2442:          B = (sBytest *)e;
   3619         2: 2443:          uintToVarint(r, B->count);
   3620 call    0 returned 100%
   3621         2: 2444:          sBytesPushBuffer(r, &(B->data), B->count);
   3622 call    0 returned 100%
   3623         -: 2445:        }}
   3624         1: 2446:        break;
   3625         -: 2447:    }
   3626        25: 2448:    ret;
   3627         -: 2449:  }
   3628         -: 2450:
   3629         -: 2451:  normalArray:
   3630         -: 2452:  // encode type and element count
   3631        53: 2453:  if (packing == PACK or packing == UNIFORM) {
   3632 branch  0 taken 70% (fallthrough)
   3633 branch  1 taken 30%
   3634 branch  2 taken 16% (fallthrough)
   3635 branch  3 taken 84%
   3636         -: 2454:    // when the packing is packed or uniform, there is no need to encode ARRAY type since all elements have this type
   3637        22: 2455:    uintToVarint(r, array->count);
   3638 call    0 returned 100%
   3639         -: 2456:  }
   3640         -: 2457:  else {
   3641        31: 2458:    if (ctx->nibble == lowNbl) {
   3642 branch  0 taken 90% (fallthrough)
   3643 branch  1 taken 10%
   3644        28: 2459:      uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)array->type], array->count);
   3645 call    0 returned 100%
   3646         -: 2460:    }
   3647         -: 2461:    else {
   3648         -: 2462:      // high nibble
   3649         3: 2463:      storeTypeInHighNbl(array);
   3650         3: 2464:      uintToVarint(r, array->count);
   3651 call    0 returned 100%
   3652         -: 2465:    }
   3653         -: 2466:  }
   3654         -: 2467:
   3655        53: 2468:  bool   pack = false;
   3656         -: 2469:  size_t packCount;
   3657       218: 2470:  enumerateSArray(array, e, eIdx) {
   3658 branch  0 taken 76%
   3659 branch  1 taken 24% (fallthrough)
   3660       165: 2471:    if (!e) {
   3661 branch  0 taken 0% (fallthrough)
   3662 branch  1 taken 100%
   3663         -: 2472:      // empty slots are represented as undefined elements
   3664     #####: 2473:      if (ctx->nibble == lowNbl) {
   3665 branch  0 never executed
   3666 branch  1 never executed
   3667     #####: 2474:        sBytesPush(r, NET_SERIAL_TYPES[UNDEFINED]);
   3668 call    0 never executed
   3669     #####: 2475:        ctx->nibble    = highNbl;
   3670     #####: 2476:        ctx->nblOffset = (*r)->count -1;
   3671         -: 2477:      }
   3672         -: 2478:      else {
   3673         -: 2479:        // high nibble
   3674     #####: 2480:        ctx->nibble  = lowNbl;
   3675     #####: 2481:        data         = (char *)&((*r)->data) + ctx->nblOffset;
   3676     #####: 2482:        *data       |= NET_SERIAL_TYPES[UNDEFINED] << 4;
   3677         -: 2483:      }
   3678         -: 2484:    }
   3679         -: 2485:    else {
   3680       165: 2486:      if (!pack) {
   3681 branch  0 taken 82% (fallthrough)
   3682 branch  1 taken 18%
   3683         -: 2487:        // scan array for packing
   3684       135: 2488:        if ((array->count - eIdx) > 3) {
   3685 branch  0 taken 30% (fallthrough)
   3686 branch  1 taken 70%
   3687         -: 2489:          // at least 4 elements, less than that is not worth it
   3688        41: 2490:          if (   e->type == DICT
   3689 branch  0 taken 90% (fallthrough)
   3690 branch  1 taken 10%
   3691        37: 2491:              or e->type == DOUBLE
   3692 branch  0 taken 95% (fallthrough)
   3693 branch  1 taken 5%
   3694        35: 2492:              or e->type == INT
   3695 branch  0 taken 89% (fallthrough)
   3696 branch  1 taken 11%
   3697        31: 2493:              or e->type == STRING
   3698 branch  0 taken 94% (fallthrough)
   3699 branch  1 taken 6%
   3700        29: 2494:              or e->type == ARRAY
   3701 branch  0 taken 93% (fallthrough)
   3702 branch  1 taken 7%
   3703        27: 2495:              or e->type == BYTES) {
   3704 branch  0 taken 0% (fallthrough)
   3705 branch  1 taken 100%
   3706        14: 2496:            type      = e->type;
   3707        14: 2497:            packCount = 1;
   3708        14: 2498:            smallt *element = ((smallt **) &((array)->data))[eIdx+1];
   3709        47: 2499:            for (size_t i = eIdx+1; i < (array)->count ; i++, element = ((smallt **) &((array)->data))[i]) {
   3710 branch  0 taken 100%
   3711 branch  1 taken 0% (fallthrough)
   3712        47: 2500:              if (!element) {
   3713 branch  0 taken 0% (fallthrough)
   3714 branch  1 taken 100%
   3715         -: 2501:                // null element are undefined
   3716     #####: 2502:                break;
   3717         -: 2503:              }
   3718         -: 2504:              else {
   3719        47: 2505:                if (element->type != type) {
   3720 branch  0 taken 30% (fallthrough)
   3721 branch  1 taken 70%
   3722        14: 2506:                  break;
   3723         -: 2507:                }
   3724        33: 2508:                packCount++;
   3725         -: 2509:              } // if element
   3726         -: 2510:            } // for
   3727        14: 2511:            if (packCount > 3) {
   3728 branch  0 taken 71% (fallthrough)
   3729 branch  1 taken 29%
   3730        10: 2512:              type = PACKED_NET_SERIAL_TYPES[(u8)type];
   3731        10: 2513:              pack = true;
   3732         -: 2514:            }
   3733         -: 2515:          } // test current element type
   3734         -: 2516:        } // is array big enough
   3735         -: 2517:      } // not already packing
   3736         -: 2518:
   3737         -: 2519:      // encode element value
   3738       165: 2520:      switch(e->type) {
   3739 branch  0 taken 18%
   3740 branch  1 taken 22%
   3741 branch  2 taken 9%
   3742 branch  3 taken 6%
   3743 branch  4 taken 22%
   3744 branch  5 taken 13%
   3745 branch  6 taken 10%
   3746 branch  7 taken 1%
   3747 branch  8 taken 0%
   3748         -: 2521:        case UNDEFINED:
   3749         -: 2522:        case CONTAINER:
   3750        29: 2523:          if (ctx->nibble == lowNbl) {
   3751 branch  0 taken 93% (fallthrough)
   3752 branch  1 taken 7%
   3753        27: 2524:            storeTypeOnly(e);
   3754 call    0 returned 100%
   3755         -: 2525:          }
   3756         -: 2526:          else {
   3757         -: 2527:            // high nibble
   3758         2: 2528:            storeTypeInHighNbl(e);
   3759         -: 2529:          }
   3760        29: 2530:          break;
   3761         -: 2531:        case BOOL:
   3762        36: 2532:          if (!ctx->boolOffset) {
   3763 branch  0 taken 22% (fallthrough)
   3764 branch  1 taken 78%
   3765         -: 2533:            // new packed bools
   3766         8: 2534:            if (ctx->nibble == lowNbl) {
   3767 branch  0 taken 63% (fallthrough)
   3768 branch  1 taken 38%
   3769         5: 2535:              storeNew4bPackedBool(e);
   3770 branch  0 taken 80% (fallthrough)
   3771 branch  1 taken 20%
   3772 call    2 returned 100%
   3773         -: 2536:            }
   3774         -: 2537:            else {
   3775         -: 2538:              // high nibble, next byte is packed bools
   3776         3: 2539:              storeTypeInHighNbl(e);
   3777         3: 2540:              storeNew8bPackedBool(e);
   3778 branch  0 taken 100% (fallthrough)
   3779 branch  1 taken 0%
   3780 call    2 returned 100%
   3781         -: 2541:            }
   3782         -: 2542:          }
   3783         -: 2543:          else {
   3784         -: 2544:            // there was a bool before this one, fill bits in nibbles
   3785        28: 2545:            if (ctx->nibble == lowNbl) {
   3786 branch  0 taken 61% (fallthrough)
   3787 branch  1 taken 39%
   3788        17: 2546:              if (ctx->boolShift == 8) {
   3789 branch  0 taken 12% (fallthrough)
   3790 branch  1 taken 88%
   3791         -: 2547:                // previous packed bool is full
   3792         -: 2548:                // this byte is the new packed bools
   3793         2: 2549:                storeNew4bPackedBool(e);
   3794 branch  0 taken 50% (fallthrough)
   3795 branch  1 taken 50%
   3796 call    2 returned 100%
   3797         -: 2550:              }
   3798         -: 2551:              else {
   3799        15: 2552:                storeTypeOnly(e);
   3800 call    0 returned 100%
   3801        15: 2553:                storeBool(e);
   3802 branch  0 taken 53% (fallthrough)
   3803 branch  1 taken 47%
   3804         -: 2554:              }
   3805         -: 2555:            }
   3806         -: 2556:            else {
   3807         -: 2557:              // high nibble
   3808        11: 2558:              storeTypeInHighNbl(e);
   3809        11: 2559:              if (ctx->boolShift == 8) {
   3810 branch  0 taken 18% (fallthrough)
   3811 branch  1 taken 82%
   3812         -: 2560:                // previous packed bool is full
   3813         -: 2561:                // next byte is the new packed bools
   3814         2: 2562:                storeNew8bPackedBool(e);
   3815 branch  0 taken 100% (fallthrough)
   3816 branch  1 taken 0%
   3817 call    2 returned 100%
   3818         -: 2563:              }
   3819         -: 2564:              else {
   3820         9: 2565:                storeBool(e);
   3821 branch  0 taken 78% (fallthrough)
   3822 branch  1 taken 22%
   3823         -: 2566:              }
   3824         -: 2567:            }
   3825         -: 2568:          }
   3826        36: 2569:          break;
   3827         -: 2570:        case DICT:
   3828        15: 2571:          if (pack) {
   3829 branch  0 taken 53% (fallthrough)
   3830 branch  1 taken 47%
   3831         8: 2572:            if (type) {
   3832 branch  0 taken 25% (fallthrough)
   3833 branch  1 taken 75%
   3834         -: 2573:              // this is the first packed element
   3835         2: 2574:              if (ctx->nibble == lowNbl) {
   3836 branch  0 taken 50% (fallthrough)
   3837 branch  1 taken 50%
   3838         1: 2575:                uintToNetTypeVarint(r, type, packCount);
   3839 call    0 returned 100%
   3840         -: 2576:              }
   3841         -: 2577:              else {
   3842         -: 2578:                // high nibble
   3843         -: 2579:                // store type in high nibble
   3844         1: 2580:                ctx->nibble  = lowNbl;
   3845         1: 2581:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   3846         1: 2582:                *data       |= type << 4;
   3847         1: 2583:                uintToVarint(r, packCount);
   3848 call    0 returned 100%
   3849         -: 2584:              }
   3850         2: 2585:              type = 0;
   3851         -: 2586:            } // if type
   3852         -: 2587:
   3853         8: 2588:            dictNetSerial(r, (sDictt *)e, ctx, /*packing=*/PACK);
   3854 call    0 returned 100%
   3855         -: 2589:            // stop packing when packCount == 0
   3856         8: 2590:            packCount--;
   3857         8: 2591:            if (!packCount) pack = false;
   3858 branch  0 taken 25% (fallthrough)
   3859 branch  1 taken 75%
   3860         -: 2592:          } // if pack
   3861         -: 2593:          else
   3862         7: 2594:            dictNetSerial(r, (sDictt *)e, ctx, /*packing=*/NOPACKING);
   3863 call    0 returned 100%
   3864        15: 2595:          break;
   3865         -: 2596:        case DOUBLE:
   3866        10: 2597:          if (pack) {
   3867 branch  0 taken 80% (fallthrough)
   3868 branch  1 taken 20%
   3869         8: 2598:            if (type) {
   3870 branch  0 taken 25% (fallthrough)
   3871 branch  1 taken 75%
   3872         -: 2599:              // this is the first packed element
   3873         2: 2600:              if (ctx->nibble == lowNbl) {
   3874 branch  0 taken 50% (fallthrough)
   3875 branch  1 taken 50%
   3876         1: 2601:                uintToNetTypeVarint(r, type, packCount);
   3877 call    0 returned 100%
   3878         -: 2602:              }
   3879         -: 2603:              else {
   3880         -: 2604:                // high nibble
   3881         -: 2605:                // store type in high nibble
   3882         1: 2606:                ctx->nibble  = lowNbl;
   3883         1: 2607:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   3884         1: 2608:                *data       |= type << 4;
   3885         1: 2609:                uintToVarint(r, packCount);
   3886 call    0 returned 100%
   3887         -: 2610:              }
   3888         2: 2611:              type = 0;
   3889         -: 2612:            } // if type
   3890         -: 2613:
   3891         8: 2614:            sBytesPushBuffer(r, &((sDoublet *)e)->value, sizeof(double));
   3892 call    0 returned 100%
   3893         -: 2615:            // stop packing when packCount == 0
   3894         8: 2616:            packCount--;
   3895         8: 2617:            if (!packCount) pack = false;
   3896 branch  0 taken 25% (fallthrough)
   3897 branch  1 taken 75%
   3898         -: 2618:          } // if pack
   3899         -: 2619:          else {
   3900         2: 2620:            if (ctx->nibble == lowNbl) {
   3901 branch  0 taken 50% (fallthrough)
   3902 branch  1 taken 50%
   3903         1: 2621:              storeTypeOnly(e);
   3904 call    0 returned 100%
   3905         -: 2622:            }
   3906         -: 2623:            else {
   3907         -: 2624:              // high nibble
   3908         1: 2625:              storeTypeInHighNbl(e);
   3909         -: 2626:            }
   3910         2: 2627:            sBytesPushBuffer(r, &((sDoublet *)e)->value, sizeof(double));
   3911 call    0 returned 100%
   3912         -: 2628:          }
   3913        10: 2629:          break;
   3914         -: 2630:        case INT:
   3915        36: 2631:          if (pack) {
   3916 branch  0 taken 22% (fallthrough)
   3917 branch  1 taken 78%
   3918         8: 2632:            if (type) {
   3919 branch  0 taken 25% (fallthrough)
   3920 branch  1 taken 75%
   3921         -: 2633:              // this is the first packed element
   3922         2: 2634:              if (ctx->nibble == lowNbl) {
   3923 branch  0 taken 50% (fallthrough)
   3924 branch  1 taken 50%
   3925         1: 2635:                uintToNetTypeVarint(r, type, packCount);
   3926 call    0 returned 100%
   3927         -: 2636:              }
   3928         -: 2637:              else {
   3929         -: 2638:                // high nibble
   3930         -: 2639:                // store type in high nibble
   3931         1: 2640:                ctx->nibble  = lowNbl;
   3932         1: 2641:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   3933         1: 2642:                *data       |= type << 4;
   3934         1: 2643:                uintToVarint(r, packCount);
   3935 call    0 returned 100%
   3936         -: 2644:              }
   3937         2: 2645:              type = 0;
   3938         -: 2646:            } // if type
   3939         -: 2647:
   3940         8: 2648:            i64 v = ((sIntt *)&(e->type))->value;
   3941         8: 2649:            uintToVarint(r, (v << 1) ^ (v >> 63));
   3942 call    0 returned 100%
   3943         -: 2650:            // stop packing when packCount == 0
   3944         8: 2651:            packCount--;
   3945         8: 2652:            if (!packCount) pack = false;
   3946 branch  0 taken 25% (fallthrough)
   3947 branch  1 taken 75%
   3948         -: 2653:          } // if pack
   3949         -: 2654:          else {
   3950         -: 2655:            // encode int to varint
   3951         -: 2656:            // v is int64_t to convert to varint
   3952        28: 2657:            i64 v = ((sIntt *)&(e->type))->value;
   3953        28: 2658:            if (ctx->nibble == lowNbl) {
   3954 branch  0 taken 86% (fallthrough)
   3955 branch  1 taken 14%
   3956         -: 2659:              // encode v with arithmetic shifts
   3957        24: 2660:              uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->type], (v << 1) ^ (v >> 63));
   3958 call    0 returned 100%
   3959         -: 2661:            }
   3960         -: 2662:            else {
   3961         -: 2663:              // high nibble
   3962         4: 2664:              storeTypeInHighNbl(e);
   3963         4: 2665:              uintToVarint(r, (v << 1) ^ (v >> 63));
   3964 call    0 returned 100%
   3965         -: 2666:            }
   3966         -: 2667:          }
   3967        36: 2668:          break;
   3968         -: 2669:        case STRING:
   3969        21: 2670:          if (pack) {
   3970 branch  0 taken 38% (fallthrough)
   3971 branch  1 taken 62%
   3972         8: 2671:            if (type) {
   3973 branch  0 taken 25% (fallthrough)
   3974 branch  1 taken 75%
   3975         -: 2672:              // this is the first packed element
   3976         2: 2673:              if (ctx->nibble == lowNbl) {
   3977 branch  0 taken 50% (fallthrough)
   3978 branch  1 taken 50%
   3979         1: 2674:                uintToNetTypeVarint(r, type, packCount);
   3980 call    0 returned 100%
   3981         -: 2675:              }
   3982         -: 2676:              else {
   3983         -: 2677:                // high nibble
   3984         -: 2678:                // store type in high nibble
   3985         1: 2679:                ctx->nibble  = lowNbl;
   3986         1: 2680:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   3987         1: 2681:                *data       |= type << 4;
   3988         1: 2682:                uintToVarint(r, packCount);
   3989 call    0 returned 100%
   3990         -: 2683:              }
   3991         2: 2684:              type = 0;
   3992         -: 2685:            } // if type
   3993         -: 2686:
   3994         8: 2687:            sBytesPushBuffer(r, &((sStringt *)e)->data, sizeof(sStringt) + strlen(&(((sStringt *)e)->data)) -1);
   3995 call    0 returned 100%
   3996         -: 2688:            // stop packing when packCount == 0
   3997         8: 2689:            packCount--;
   3998         8: 2690:            if (!packCount) pack = false;
   3999 branch  0 taken 25% (fallthrough)
   4000 branch  1 taken 75%
   4001         -: 2691:          } // if pack
   4002         -: 2692:          else {
   4003        13: 2693:            if (ctx->nibble == lowNbl) {
   4004 branch  0 taken 69% (fallthrough)
   4005 branch  1 taken 31%
   4006         9: 2694:              storeTypeOnly(e);
   4007 call    0 returned 100%
   4008         -: 2695:            }
   4009         -: 2696:            else {
   4010         -: 2697:              // high nibble
   4011         4: 2698:              storeTypeInHighNbl(e);
   4012         -: 2699:            }
   4013        13: 2700:            sBytesPushBuffer(r, &((sStringt *)e)->data, sizeof(sStringt) + strlen(&(((sStringt *)e)->data)) -1);
   4014 call    0 returned 100%
   4015         -: 2701:          }
   4016        21: 2702:          break;
   4017         -: 2703:        case ARRAY:
   4018        16: 2704:          if (pack) {
   4019 branch  0 taken 50% (fallthrough)
   4020 branch  1 taken 50%
   4021         8: 2705:            if (type) {
   4022 branch  0 taken 25% (fallthrough)
   4023 branch  1 taken 75%
   4024         -: 2706:              // this is the first packed element
   4025         2: 2707:              if (ctx->nibble == lowNbl) {
   4026 branch  0 taken 50% (fallthrough)
   4027 branch  1 taken 50%
   4028         1: 2708:                uintToNetTypeVarint(r, type, packCount);
   4029 call    0 returned 100%
   4030         -: 2709:              }
   4031         -: 2710:              else {
   4032         -: 2711:                // high nibble
   4033         -: 2712:                // store type in high nibble
   4034         1: 2713:                ctx->nibble  = lowNbl;
   4035         1: 2714:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   4036         1: 2715:                *data       |= type << 4;
   4037         1: 2716:                uintToVarint(r, packCount);
   4038 call    0 returned 100%
   4039         -: 2717:              }
   4040         2: 2718:              type = 0;
   4041         -: 2719:            } // if type
   4042         -: 2720:
   4043         8: 2721:            arrayNetSerial(r, (sArrayt *)e, ctx, /*packing=*/PACK);
   4044 call    0 returned 100%
   4045         -: 2722:            // stop packing when packCount == 0
   4046         8: 2723:            packCount--;
   4047         8: 2724:            if (!packCount) pack = false;
   4048 branch  0 taken 25% (fallthrough)
   4049 branch  1 taken 75%
   4050         -: 2725:          } // if pack
   4051         -: 2726:          else
   4052         8: 2727:            arrayNetSerial(r, (sArrayt *)e, ctx, /*packing=*/NOPACKING);
   4053 call    0 returned 100%
   4054        16: 2728:          break;
   4055         -: 2729:        case BYTES:
   4056         2: 2730:          if (pack) {
   4057 branch  0 taken 0% (fallthrough)
   4058 branch  1 taken 100%
   4059     #####: 2731:            if (type) {
   4060 branch  0 never executed
   4061 branch  1 never executed
   4062         -: 2732:              // this is the first packed element
   4063     #####: 2733:              if (ctx->nibble == lowNbl) {
   4064 branch  0 never executed
   4065 branch  1 never executed
   4066     #####: 2734:                uintToNetTypeVarint(r, type, packCount);
   4067 call    0 never executed
   4068         -: 2735:              }
   4069         -: 2736:              else {
   4070         -: 2737:                // high nibble
   4071         -: 2738:                // store type in high nibble
   4072     #####: 2739:                ctx->nibble  = lowNbl;
   4073     #####: 2740:                data         = (char *)&((*r)->data) + ctx->nblOffset;
   4074     #####: 2741:                *data       |= type << 4;
   4075     #####: 2742:                uintToVarint(r, packCount);
   4076 call    0 never executed
   4077         -: 2743:              }
   4078     #####: 2744:              type = 0;
   4079         -: 2745:            } // if type
   4080         -: 2746:
   4081     #####: 2747:            B = (sBytest *)e;
   4082     #####: 2748:            uintToVarint(r, B->count);
   4083 call    0 never executed
   4084     #####: 2749:            sBytesPushBuffer(r, &(B->data), B->count);
   4085 call    0 never executed
   4086         -: 2750:            // stop packing when packCount == 0
   4087     #####: 2751:            packCount--;
   4088     #####: 2752:            if (!packCount) pack = false;
   4089 branch  0 never executed
   4090 branch  1 never executed
   4091         -: 2753:          } // if pack
   4092         -: 2754:          else {
   4093         2: 2755:            B = (sBytest *)e;
   4094         2: 2756:            if (ctx->nibble == lowNbl) {
   4095 branch  0 taken 50% (fallthrough)
   4096 branch  1 taken 50%
   4097         1: 2757:              uintToNetTypeVarint(r, NET_SERIAL_TYPES[(u8)e->type], B->count);
   4098 call    0 returned 100%
   4099         -: 2758:            }
   4100         -: 2759:            else {
   4101         -: 2760:              // high nibble
   4102         1: 2761:              storeTypeInHighNbl(e);
   4103         1: 2762:              uintToVarint(r, B->count);
   4104 call    0 returned 100%
   4105         -: 2763:            }
   4106         2: 2764:            sBytesPushBuffer(r, &(B->data), B->count);
   4107 call    0 returned 100%
   4108         -: 2765:          }
   4109         2: 2766:          break;
   4110         -: 2767:      }
   4111         -: 2768:    }
   4112         -: 2769:  }
   4113        53: 2770:  ret;
   4114         -: 2771:}
   4115         -: 2772:
   4116 function serialNetSerial called 86 returned 100% blocks executed 80%
   4117        86: 2773:internal smallBytest* serialNetSerial(smallJsont *self) {
   4118         -: 2774:
   4119        86: 2775:  smallt *o = getsoG(self);
   4120 call    0 returned 100%
   4121         -: 2776:
   4122        86: 2777:  if (o == NULL)
   4123 branch  0 taken 0% (fallthrough)
   4124 branch  1 taken 100%
   4125     #####: 2778:    ret NULL;
   4126         -: 2779:
   4127        86: 2780:  sBytest *B = netSerial(o);
   4128 call    0 returned 100%
   4129         -: 2781:
   4130        86: 2782:  if (!B) {
   4131 branch  0 taken 0% (fallthrough)
   4132 branch  1 taken 100%
   4133     #####: 2783:    ret NULL;
   4134         -: 2784:  }
   4135         -: 2785:
   4136        86: 2786:  createAllocateSmallBytes(r);
   4137 call    0 returned 100%
   4138        86: 2787:  r->B = B;
   4139        86: 2788:  ret r;
   4140         -: 2789:}
   4141         -: 2790:
   4142         -: 2791:// -------------------------------------
   4143         -: 2792:// Deserializers
   4144         -: 2793:
   4145         -: 2794:// level 0
   4146         -: 2795:// like smallJson with ints and length encoded as varints
   4147         -: 2796:
   4148         -: 2797:/**
   4149         -: 2798: * deserializer top function
   4150         -: 2799: */
   4151 function netDeserialLevel0 called 0 returned 0% blocks executed 0%
   4152     #####: 2800:internal smallt* netDeserialLevel0(sBytest *obj) {
   4153     #####: 2801:  smallt   *r = NULL;
   4154     #####: 2802:  double   *D = NULL;
   4155     #####: 2803:  char     *s = NULL;
   4156     #####: 2804:  sBytest  *B = NULL;
   4157         -: 2805:  uint32_t count;
   4158     #####: 2806:  char     *data  = NULL;
   4159         -: 2807:
   4160     #####: 2808:  switch(obj->data & 0xF) {
   4161 branch  0 never executed
   4162 branch  1 never executed
   4163 branch  2 never executed
   4164 branch  3 never executed
   4165 branch  4 never executed
   4166 branch  5 never executed
   4167 branch  6 never executed
   4168 branch  7 never executed
   4169 branch  8 never executed
   4170         -: 2809:    case S_UNDEFINED:
   4171     #####: 2810:      r = (smallt *) allocSUndefined();
   4172 call    0 never executed
   4173     #####: 2811:      break;
   4174         -: 2812:    case S_BOOL:
   4175     #####: 2813:      r = (smallt *) allocSBool(obj->data & 0x10);
   4176 call    0 never executed
   4177     #####: 2814:      break;
   4178         -: 2815:    case S_DICT:
   4179     #####: 2816:      data = (char *)&(obj->data);
   4180     #####: 2817:      dictNetDeserialLevel0((sDictt **)&r, &data);
   4181 call    0 never executed
   4182     #####: 2818:      break;
   4183         -: 2819:    case S_DOUBLE:
   4184     #####: 2820:      data = &(obj->data)+1;
   4185     #####: 2821:      D = (double *)data;
   4186     #####: 2822:      r = (smallt *) allocSDouble(*D);
   4187 call    0 never executed
   4188     #####: 2823:      break;
   4189         -: 2824:    case S_INT:
   4190     #####: 2825:      data  = &(obj->data);
   4191     #####: 2826:      u64 v = netTypeVarintToUint((u8**)&data);
   4192 call    0 never executed
   4193     #####: 2827:      v = (v >> 1) ^ (~(v & 1) + 1);
   4194     #####: 2828:      r = (smallt *) allocSInt(v);
   4195 call    0 never executed
   4196     #####: 2829:      break;
   4197         -: 2830:    case S_STRING:
   4198     #####: 2831:      s = (char *)&(obj->data)+1;
   4199     #####: 2832:      r = (smallt *) allocSStringTiny(s);
   4200 call    0 never executed
   4201     #####: 2833:      break;
   4202         -: 2834:    case S_ARRAY:
   4203     #####: 2835:      data = (char *)&(obj->data);
   4204     #####: 2836:      arrayNetDeserialLevel0((sArrayt **)&r, &data);
   4205 call    0 never executed
   4206     #####: 2837:      break;
   4207         -: 2838:    case S_BYTES:
   4208     #####: 2839:      B     = allocSBytes();
   4209 call    0 never executed
   4210     #####: 2840:      data  = &(obj->data);
   4211     #####: 2841:      count = netTypeVarintToUint((u8**)&data);
   4212 call    0 never executed
   4213     #####: 2842:      sBytesPushBuffer(&B, data, count);
   4214 call    0 never executed
   4215     #####: 2843:      r = (smallt *)B;
   4216     #####: 2844:      break;
   4217         -: 2845:  }
   4218         -: 2846:
   4219     #####: 2847:  ret r;
   4220         -: 2848:}
   4221         -: 2849:
   4222         -: 2850:/**
   4223         -: 2851: * deserialize dictionary from data
   4224         -: 2852: *
   4225         -: 2853: * a new dictionary is allocated
   4226         -: 2854: *
   4227         -: 2855: * \param
   4228         -: 2856: *    dict dictionary holding the elements
   4229         -: 2857: *    data serialized dictionary
   4230         -: 2858: */
   4231 function dictNetDeserialLevel0 called 0 returned 0% blocks executed 0%
   4232     #####: 2859:internal void dictNetDeserialLevel0(sDictt **dict, char **data) {
   4233     #####: 2860:  sUndefinedt *u = NULL;
   4234     #####: 2861:  sBoolt *bo = NULL;
   4235     #####: 2862:  double *D = NULL;
   4236     #####: 2863:  sDoublet *Do = NULL;
   4237     #####: 2864:  sDictt *d = NULL;
   4238     #####: 2865:  sIntt *io = NULL;
   4239     #####: 2866:  char *s = NULL;
   4240     #####: 2867:  sStringt *so = NULL;
   4241     #####: 2868:  sArrayt *a = NULL;
   4242     #####: 2869:  sBytest *B = NULL;
   4243         -: 2870:  uint32_t count;
   4244         -: 2871:  uint32_t dictCount;
   4245         -: 2872:
   4246     #####: 2873:  dictCount = netTypeVarintToUint((u8**)data);
   4247 call    0 never executed
   4248         -: 2874:
   4249     #####: 2875:  if (!dictCount) {
   4250 branch  0 never executed
   4251 branch  1 never executed
   4252     #####: 2876:    *dict = allocSDict();
   4253 call    0 never executed
   4254     #####: 2877:    ret;
   4255         -: 2878:  }
   4256         -: 2879:
   4257     #####: 2880:  loop(dictCount) {
   4258 branch  0 never executed
   4259 branch  1 never executed
   4260         -: 2881:    char type;
   4261         -: 2882:    char *key;
   4262     #####: 2883:    key    = *data;
   4263     #####: 2884:    *data += strlen(key)+1;
   4264     #####: 2885:    type   = **data;
   4265         -: 2886:
   4266     #####: 2887:    switch(type & 0xF) {
   4267 branch  0 never executed
   4268 branch  1 never executed
   4269 branch  2 never executed
   4270 branch  3 never executed
   4271 branch  4 never executed
   4272 branch  5 never executed
   4273 branch  6 never executed
   4274 branch  7 never executed
   4275 branch  8 never executed
   4276         -: 2888:      case S_UNDEFINED:
   4277     #####: 2889:        (*data)++;
   4278     #####: 2890:        u    = allocSUndefined();
   4279 call    0 never executed
   4280     #####: 2891:        sDictPushTiny(dict, key, (smallt *) u);
   4281 call    0 never executed
   4282     #####: 2892:        break;
   4283         -: 2893:      case S_BOOL:
   4284     #####: 2894:        (*data)++;
   4285     #####: 2895:        bo = allocSBool(type & 0x10);
   4286 call    0 never executed
   4287     #####: 2896:        sDictPushTiny(dict, key, (smallt *) bo);
   4288 call    0 never executed
   4289     #####: 2897:        break;
   4290         -: 2898:      case S_DICT:
   4291     #####: 2899:        d = NULL;
   4292     #####: 2900:        dictNetDeserialLevel0(&d, data);
   4293 call    0 never executed
   4294     #####: 2901:        sDictPushTiny(dict, key, (smallt *) d);
   4295 call    0 never executed
   4296     #####: 2902:        break;
   4297         -: 2903:      case S_DOUBLE:
   4298     #####: 2904:        (*data)++;
   4299     #####: 2905:        D      = (double *)(*data);
   4300     #####: 2906:        *data += sizeof(double);
   4301     #####: 2907:        Do     = allocSDouble(*D);
   4302 call    0 never executed
   4303     #####: 2908:        sDictPushTiny(dict, key, (smallt *) Do);
   4304 call    0 never executed
   4305     #####: 2909:        break;
   4306         -: 2910:      case S_INT: {
   4307     #####: 2911:          u64 v = netTypeVarintToUint((u8**)data);
   4308 call    0 never executed
   4309     #####: 2912:          v = (v >> 1) ^ (~(v & 1) + 1);
   4310     #####: 2913:          io     = allocSInt(v);
   4311 call    0 never executed
   4312     #####: 2914:          sDictPushTiny(dict, key, (smallt *) io);
   4313 call    0 never executed
   4314         -: 2915:        }
   4315     #####: 2916:        break;
   4316         -: 2917:      case S_STRING:
   4317     #####: 2918:        (*data)++;
   4318     #####: 2919:        s      = (char *)(*data);
   4319     #####: 2920:        *data += strlen(s)+1;
   4320     #####: 2921:        so     = allocSStringTiny(s);
   4321 call    0 never executed
   4322     #####: 2922:        sDictPushTiny(dict, key, (smallt *) so);
   4323 call    0 never executed
   4324     #####: 2923:        break;
   4325         -: 2924:      case S_ARRAY:
   4326     #####: 2925:        a = NULL;
   4327     #####: 2926:        arrayNetDeserialLevel0(&a, data);
   4328 call    0 never executed
   4329     #####: 2927:        sDictPushTiny(dict, key, (smallt *) a);
   4330 call    0 never executed
   4331     #####: 2928:        break;
   4332         -: 2929:      case S_BYTES:
   4333     #####: 2930:        B      = allocSBytes();
   4334 call    0 never executed
   4335     #####: 2931:        count  = netTypeVarintToUint((u8**)data);
   4336 call    0 never executed
   4337     #####: 2932:        sBytesPushBuffer(&B, *data, count);
   4338 call    0 never executed
   4339     #####: 2933:        *data += count;
   4340     #####: 2934:        sDictPushTiny(dict, key, (smallt *) B);
   4341 call    0 never executed
   4342     #####: 2935:        break;
   4343         -: 2936:    }
   4344         -: 2937:  }
   4345         -: 2938:}
   4346         -: 2939:
   4347         -: 2940:/**
   4348         -: 2941: * deserialize array from data
   4349         -: 2942: *
   4350         -: 2943: * a new array is allocated
   4351         -: 2944: *
   4352         -: 2945: * \param
   4353         -: 2946: *    array holding the elements
   4354         -: 2947: *    data serialized dictionary
   4355         -: 2948: */
   4356 function arrayNetDeserialLevel0 called 0 returned 0% blocks executed 0%
   4357     #####: 2949:internal void arrayNetDeserialLevel0(sArrayt **array, char **data) {
   4358     #####: 2950:  sUndefinedt *u = NULL;
   4359     #####: 2951:  sBoolt *bo = NULL;
   4360     #####: 2952:  double *D = NULL;
   4361     #####: 2953:  sDoublet *Do = NULL;
   4362     #####: 2954:  sDictt *d = NULL;
   4363     #####: 2955:  sIntt *io = NULL;
   4364     #####: 2956:  char *s = NULL;
   4365     #####: 2957:  sStringt *so = NULL;
   4366     #####: 2958:  sArrayt *a = NULL;
   4367     #####: 2959:  sBytest *B = NULL;
   4368         -: 2960:  uint32_t count;
   4369         -: 2961:  uint32_t arrayCount;
   4370         -: 2962:
   4371     #####: 2963:  arrayCount = netTypeVarintToUint((u8**)data);
   4372 call    0 never executed
   4373         -: 2964:
   4374     #####: 2965:  if (!arrayCount) {
   4375 branch  0 never executed
   4376 branch  1 never executed
   4377     #####: 2966:    *array = allocSArray();;
   4378 call    0 never executed
   4379     #####: 2967:    ret;
   4380         -: 2968:  }
   4381         -: 2969:
   4382     #####: 2970:  loop(arrayCount) {
   4383 branch  0 never executed
   4384 branch  1 never executed
   4385         -: 2971:    char type;
   4386     #####: 2972:    type  = **data;
   4387         -: 2973:
   4388     #####: 2974:    switch(type & 0xF) {
   4389 branch  0 never executed
   4390 branch  1 never executed
   4391 branch  2 never executed
   4392 branch  3 never executed
   4393 branch  4 never executed
   4394 branch  5 never executed
   4395 branch  6 never executed
   4396 branch  7 never executed
   4397 branch  8 never executed
   4398         -: 2975:      case S_UNDEFINED:
   4399     #####: 2976:        (*data)++;
   4400     #####: 2977:        u = allocSUndefined();
   4401 call    0 never executed
   4402     #####: 2978:        sArrayPushTiny(array, (smallt *) u);
   4403 call    0 never executed
   4404     #####: 2979:        break;
   4405         -: 2980:      case S_BOOL:
   4406     #####: 2981:        (*data)++;
   4407     #####: 2982:        bo     = allocSBool(type & 0x10);
   4408 call    0 never executed
   4409     #####: 2983:        sArrayPushTiny(array, (smallt *) bo);
   4410 call    0 never executed
   4411     #####: 2984:        break;
   4412         -: 2985:      case S_DICT:
   4413     #####: 2986:        d = NULL;
   4414     #####: 2987:        dictNetDeserialLevel0(&d, data);
   4415 call    0 never executed
   4416     #####: 2988:        sArrayPushTiny(array, (smallt *) d);
   4417 call    0 never executed
   4418     #####: 2989:        break;
   4419         -: 2990:      case S_DOUBLE:
   4420     #####: 2991:        (*data)++;
   4421     #####: 2992:        D      = (double *)(*data);
   4422     #####: 2993:        *data += sizeof(double);
   4423     #####: 2994:        Do     = allocSDouble(*D);
   4424 call    0 never executed
   4425     #####: 2995:        sArrayPushTiny(array, (smallt *) Do);
   4426 call    0 never executed
   4427     #####: 2996:        break;
   4428         -: 2997:      case S_INT: {
   4429     #####: 2998:          u64 v = netTypeVarintToUint((u8**)data);
   4430 call    0 never executed
   4431     #####: 2999:          v = (v >> 1) ^ (~(v & 1) + 1);
   4432     #####: 3000:          io     = allocSInt(v);
   4433 call    0 never executed
   4434     #####: 3001:          sArrayPushTiny(array, (smallt *) io);
   4435 call    0 never executed
   4436         -: 3002:        }
   4437     #####: 3003:        break;
   4438         -: 3004:      case S_STRING:
   4439     #####: 3005:        (*data)++;
   4440     #####: 3006:        s      = (char *)(*data);
   4441     #####: 3007:        *data += strlen(s)+1;
   4442     #####: 3008:        so     = allocSStringTiny(s);
   4443 call    0 never executed
   4444     #####: 3009:        sArrayPushTiny(array, (smallt *) so);
   4445 call    0 never executed
   4446     #####: 3010:        break;
   4447         -: 3011:      case S_ARRAY:
   4448     #####: 3012:        a = NULL;
   4449     #####: 3013:        arrayNetDeserialLevel0(&a, data);
   4450 call    0 never executed
   4451     #####: 3014:        sArrayPushTiny(array, (smallt *) a);
   4452 call    0 never executed
   4453     #####: 3015:        break;
   4454         -: 3016:      case S_BYTES:
   4455     #####: 3017:        B      = allocSBytes();
   4456 call    0 never executed
   4457     #####: 3018:        count  = netTypeVarintToUint((u8**)data);
   4458 call    0 never executed
   4459     #####: 3019:        sBytesPushBuffer(&B, *data, count);
   4460 call    0 never executed
   4461     #####: 3020:        *data += count;
   4462     #####: 3021:        sArrayPushTiny(array, (smallt *) B);
   4463 call    0 never executed
   4464     #####: 3022:        break;
   4465         -: 3023:    }
   4466         -: 3024:  }
   4467         -: 3025:}
   4468         -: 3026:
   4469 function deserialNetSerialLevel0 called 0 returned 0% blocks executed 0%
   4470     #####: 3027:internal smallJsont* deserialNetSerialLevel0(smallJsont *self, smallBytest *data) {
   4471         -: 3028:
   4472     #####: 3029:  if (!data or !data->B or !data->B->count) {
   4473 branch  0 never executed
   4474 branch  1 never executed
   4475 branch  2 never executed
   4476 branch  3 never executed
   4477 branch  4 never executed
   4478 branch  5 never executed
   4479     #####: 3030:    ret self;
   4480         -: 3031:  }
   4481         -: 3032:
   4482     #####: 3033:  smallt *o = netDeserialLevel0(data->B);
   4483 call    0 never executed
   4484         -: 3034:
   4485     #####: 3035:  if (!o) {
   4486 branch  0 never executed
   4487 branch  1 never executed
   4488     #####: 3036:    ret self;
   4489         -: 3037:  }
   4490         -: 3038:
   4491     #####: 3039:  freeG(self);
   4492 call    0 never executed
   4493         -: 3040:
   4494     #####: 3041:  setsoG(self, o);
   4495 call    0 never executed
   4496         -: 3042:
   4497     #####: 3043:  ret self;
   4498         -: 3044:}
   4499         -: 3045:
   4500         -: 3046:// level 1
   4501         -: 3047:// like level 0 with type encoded in nibbles and bools are packed
   4502         -: 3048:
   4503         -: 3049:/**
   4504         -: 3050: * deserializer top function
   4505         -: 3051: */
   4506 function netDeserialLevel1 called 0 returned 0% blocks executed 0%
   4507     #####: 3052:internal smallt* netDeserialLevel1(sBytest *obj) {
   4508     #####: 3053:  smallt   *r = NULL;
   4509     #####: 3054:  double   *D = NULL;
   4510     #####: 3055:  char     *s = NULL;
   4511     #####: 3056:  sBytest  *B = NULL;
   4512         -: 3057:  uint32_t count;
   4513     #####: 3058:  char     *data  = NULL;
   4514     #####: 3059:  contextt ctx = {.nibble=lowNbl, .nblAddr=NULL, .boolShift = 0, .boolAddr=NULL};
   4515         -: 3060:
   4516     #####: 3061:  switch(obj->data & 0xF) {
   4517 branch  0 never executed
   4518 branch  1 never executed
   4519 branch  2 never executed
   4520 branch  3 never executed
   4521 branch  4 never executed
   4522 branch  5 never executed
   4523 branch  6 never executed
   4524 branch  7 never executed
   4525 branch  8 never executed
   4526         -: 3062:    case S_UNDEFINED:
   4527     #####: 3063:      r = (smallt *) allocSUndefined();
   4528 call    0 never executed
   4529     #####: 3064:      break;
   4530         -: 3065:    case S_BOOL:
   4531     #####: 3066:      r = (smallt *) allocSBool(obj->data & 0x10);
   4532 call    0 never executed
   4533     #####: 3067:      break;
   4534         -: 3068:    case S_DICT:
   4535     #####: 3069:      data     = (char *)&(obj->data);
   4536         -: 3070:      //debug - ctx.dbuf = (u8*) data;
   4537     #####: 3071:      dictNetDeserialLevel1((sDictt **)&r, (u8**)&data, &ctx);
   4538 call    0 never executed
   4539     #####: 3072:      break;
   4540         -: 3073:    case S_DOUBLE:
   4541     #####: 3074:      data = &(obj->data)+1;
   4542     #####: 3075:      D = (double *)data;
   4543     #####: 3076:      r = (smallt *) allocSDouble(*D);
   4544 call    0 never executed
   4545     #####: 3077:      break;
   4546         -: 3078:    case S_INT:
   4547     #####: 3079:      data  = &(obj->data);
   4548     #####: 3080:      u64 v = netTypeVarintToUint((u8**)&data);
   4549 call    0 never executed
   4550     #####: 3081:      v = (v >> 1) ^ (~(v & 1) + 1);
   4551     #####: 3082:      r = (smallt *) allocSInt(v);
   4552 call    0 never executed
   4553     #####: 3083:      break;
   4554         -: 3084:    case S_STRING:
   4555     #####: 3085:      s = (char *)&(obj->data)+1;
   4556     #####: 3086:      r = (smallt *) allocSStringTiny(s);
   4557 call    0 never executed
   4558     #####: 3087:      break;
   4559         -: 3088:    case S_ARRAY:
   4560     #####: 3089:      data = (char *)&(obj->data);
   4561         -: 3090:      //debug - ctx.dbuf = (u8*) data;
   4562     #####: 3091:      arrayNetDeserialLevel1((sArrayt **)&r, (u8**)&data, &ctx);
   4563 call    0 never executed
   4564     #####: 3092:      break;
   4565         -: 3093:    case S_BYTES:
   4566     #####: 3094:      B     = allocSBytes();
   4567 call    0 never executed
   4568     #####: 3095:      data  = &(obj->data);
   4569     #####: 3096:      count = netTypeVarintToUint((u8**)&data);
   4570 call    0 never executed
   4571     #####: 3097:      sBytesPushBuffer(&B, data, count);
   4572 call    0 never executed
   4573     #####: 3098:      r = (smallt *)B;
   4574     #####: 3099:      break;
   4575         -: 3100:  }
   4576         -: 3101:
   4577     #####: 3102:  ret r;
   4578         -: 3103:}
   4579         -: 3104:
   4580         -: 3105:/**
   4581         -: 3106: * deserialize dictionary from data
   4582         -: 3107: *
   4583         -: 3108: * a new dictionary is allocated
   4584         -: 3109: *
   4585         -: 3110: * \param
   4586         -: 3111: *    dict dictionary holding the elements
   4587         -: 3112: *    data serialized dictionary
   4588         -: 3113: */
   4589 function dictNetDeserialLevel1 called 0 returned 0% blocks executed 0%
   4590     #####: 3114:internal void dictNetDeserialLevel1(sDictt **dict, u8 **data, contextt *ctx) {
   4591     #####: 3115:  sUndefinedt *u = NULL;
   4592     #####: 3116:  sBoolt *bo = NULL;
   4593     #####: 3117:  double *D = NULL;
   4594     #####: 3118:  sDoublet *Do = NULL;
   4595     #####: 3119:  sDictt *d = NULL;
   4596     #####: 3120:  sIntt *io = NULL;
   4597     #####: 3121:  char *s = NULL;
   4598     #####: 3122:  sStringt *so = NULL;
   4599     #####: 3123:  sArrayt *a = NULL;
   4600     #####: 3124:  sBytest *B = NULL;
   4601         -: 3125:  uint32_t count;
   4602         -: 3126:  uint32_t dictCount;
   4603         -: 3127:
   4604     #####: 3128:  if (ctx->nibble == lowNbl) {
   4605 branch  0 never executed
   4606 branch  1 never executed
   4607     #####: 3129:    dictCount = netTypeVarintToUint(data);
   4608 call    0 never executed
   4609         -: 3130:  }
   4610         -: 3131:  else {
   4611         -: 3132:    // high nibble
   4612         -: 3133:    // type = *(ctx->dbuf + ctx->nblOffset) >> 4;
   4613         -: 3134:    #define readTypeInHighNbl\
   4614         -: 3135:    ctx->nibble  = lowNbl;\
   4615         -: 3136:    if (ctx->nblAddr == *data)\
   4616         -: 3137:      /* data points to the type, next byte is count */\
   4617         -: 3138:      (*data)++
   4618     #####: 3139:    readTypeInHighNbl;
   4619 branch  0 never executed
   4620 branch  1 never executed
   4621     #####: 3140:    dictCount = varintToUint(data);
   4622 call    0 never executed
   4623         -: 3141:  }
   4624         -: 3142:
   4625     #####: 3143:  if (!dictCount) {
   4626 branch  0 never executed
   4627 branch  1 never executed
   4628     #####: 3144:    *dict = allocSDict();
   4629 call    0 never executed
   4630     #####: 3145:    ret;
   4631         -: 3146:  }
   4632         -: 3147:
   4633     #####: 3148:  loop(dictCount) {
   4634 branch  0 never executed
   4635 branch  1 never executed
   4636     #####: 3149:    char *key  = (char*)*data;
   4637     #####: 3150:    *data     += strlen(key)+1;
   4638         -: 3151:    char type;
   4639     #####: 3152:    if (ctx->nibble == lowNbl) {
   4640 branch  0 never executed
   4641 branch  1 never executed
   4642     #####: 3153:      type = (**data) & 0xF;
   4643         -: 3154:    }
   4644         -: 3155:    else {
   4645         -: 3156:      // high nibble
   4646     #####: 3157:      type = (*ctx->nblAddr) >> 4;
   4647         -: 3158:    }
   4648         -: 3159:
   4649     #####: 3160:    switch(type) {
   4650 branch  0 never executed
   4651 branch  1 never executed
   4652 branch  2 never executed
   4653 branch  3 never executed
   4654 branch  4 never executed
   4655 branch  5 never executed
   4656 branch  6 never executed
   4657 branch  7 never executed
   4658 branch  8 never executed
   4659         -: 3161:      case S_UNDEFINED:
   4660     #####: 3162:        if (ctx->nibble == lowNbl) {
   4661 branch  0 never executed
   4662 branch  1 never executed
   4663         -: 3163:          #define readTypeOnly\
   4664         -: 3164:          ctx->nibble  = highNbl;\
   4665         -: 3165:          ctx->nblAddr = *data;\
   4666         -: 3166:          (*data)++
   4667     #####: 3167:          readTypeOnly;
   4668         -: 3168:        }
   4669         -: 3169:        else {
   4670         -: 3170:          // high nibble
   4671     #####: 3171:          readTypeInHighNbl;
   4672 branch  0 never executed
   4673 branch  1 never executed
   4674         -: 3172:        }
   4675     #####: 3173:        u = allocSUndefined();
   4676 call    0 never executed
   4677     #####: 3174:        sDictPushTiny(dict, key, (smallt *) u);
   4678 call    0 never executed
   4679     #####: 3175:        break;
   4680         -: 3176:      case S_BOOL:
   4681     #####: 3177:        if (!ctx->boolAddr) {
   4682 branch  0 never executed
   4683 branch  1 never executed
   4684         -: 3178:          // new packed bools
   4685     #####: 3179:          if (ctx->nibble == lowNbl) {
   4686 branch  0 never executed
   4687 branch  1 never executed
   4688         -: 3180:            #define read4bPackedBool\
   4689         -: 3181:            ctx->boolShift  = 5;\
   4690         -: 3182:            ctx->boolAddr   = *data;\
   4691         -: 3183:            (*data)++
   4692     #####: 3184:            read4bPackedBool;
   4693     #####: 3185:            bo = allocSBool((*ctx->boolAddr) & 0x10);
   4694 call    0 never executed
   4695         -: 3186:          }
   4696         -: 3187:          else {
   4697         -: 3188:            // high nibble
   4698     #####: 3189:            readTypeInHighNbl;
   4699 branch  0 never executed
   4700 branch  1 never executed
   4701         -: 3190:            #define read8bPackedBool\
   4702         -: 3191:            ctx->boolShift  = 1;\
   4703         -: 3192:            ctx->boolAddr   = *data;\
   4704         -: 3193:            (*data)++
   4705     #####: 3194:            read8bPackedBool;
   4706     #####: 3195:            bo = allocSBool((*ctx->boolAddr) & 0x1);
   4707 call    0 never executed
   4708         -: 3196:          }
   4709         -: 3197:        }
   4710         -: 3198:        else {
   4711         -: 3199:          // there was a bool before this one, read bits in nibbles
   4712     #####: 3200:          if (ctx->nibble == lowNbl) {
   4713 branch  0 never executed
   4714 branch  1 never executed
   4715     #####: 3201:            if (ctx->boolShift == 8) {
   4716 branch  0 never executed
   4717 branch  1 never executed
   4718     #####: 3202:              read4bPackedBool;
   4719     #####: 3203:              bo = allocSBool((*ctx->boolAddr) & 0x10);
   4720 call    0 never executed
   4721         -: 3204:            }
   4722         -: 3205:            else {
   4723     #####: 3206:              readTypeOnly;
   4724     #####: 3207:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   4725 call    0 never executed
   4726         -: 3208:            }
   4727         -: 3209:          }
   4728         -: 3210:          else {
   4729         -: 3211:            // high nibble
   4730     #####: 3212:            readTypeInHighNbl;
   4731 branch  0 never executed
   4732 branch  1 never executed
   4733     #####: 3213:            if (ctx->boolShift == 8) {
   4734 branch  0 never executed
   4735 branch  1 never executed
   4736     #####: 3214:              read8bPackedBool;
   4737     #####: 3215:              bo = allocSBool((*ctx->boolAddr) & 0x1);
   4738 call    0 never executed
   4739         -: 3216:            }
   4740         -: 3217:            else {
   4741         -: 3218:              // high nibble
   4742     #####: 3219:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   4743 call    0 never executed
   4744         -: 3220:            }
   4745         -: 3221:          }
   4746         -: 3222:        }
   4747     #####: 3223:        sDictPushTiny(dict, key, (smallt *) bo);
   4748 call    0 never executed
   4749     #####: 3224:        break;
   4750         -: 3225:      case S_DICT:
   4751     #####: 3226:        d = NULL;
   4752     #####: 3227:        dictNetDeserialLevel1(&d, data, ctx);
   4753 call    0 never executed
   4754     #####: 3228:        sDictPushTiny(dict, key, (smallt *) d);
   4755 call    0 never executed
   4756     #####: 3229:        break;
   4757         -: 3230:      case S_DOUBLE:
   4758     #####: 3231:        if (ctx->nibble == lowNbl) {
   4759 branch  0 never executed
   4760 branch  1 never executed
   4761     #####: 3232:          readTypeOnly;
   4762         -: 3233:        }
   4763         -: 3234:        else {
   4764         -: 3235:          // high nibble
   4765     #####: 3236:          readTypeInHighNbl;
   4766 branch  0 never executed
   4767 branch  1 never executed
   4768         -: 3237:        }
   4769     #####: 3238:        D      = (double *)(*data);
   4770     #####: 3239:        *data += sizeof(double);
   4771     #####: 3240:        Do     = allocSDouble(*D);
   4772 call    0 never executed
   4773     #####: 3241:        sDictPushTiny(dict, key, (smallt *) Do);
   4774 call    0 never executed
   4775     #####: 3242:        break;
   4776         -: 3243:      case S_INT: {
   4777         -: 3244:          u64 v;
   4778     #####: 3245:          if (ctx->nibble == lowNbl) {
   4779 branch  0 never executed
   4780 branch  1 never executed
   4781     #####: 3246:            v = netTypeVarintToUint((u8**)data);
   4782 call    0 never executed
   4783         -: 3247:          }
   4784         -: 3248:          else {
   4785         -: 3249:            // high nibble
   4786     #####: 3250:            readTypeInHighNbl;
   4787 branch  0 never executed
   4788 branch  1 never executed
   4789     #####: 3251:            v = varintToUint(data);
   4790 call    0 never executed
   4791         -: 3252:          }
   4792     #####: 3253:          v  = (v >> 1) ^ (~(v & 1) + 1);
   4793     #####: 3254:          io = allocSInt(v);
   4794 call    0 never executed
   4795     #####: 3255:          sDictPushTiny(dict, key, (smallt *) io);
   4796 call    0 never executed
   4797         -: 3256:        }
   4798     #####: 3257:        break;
   4799         -: 3258:      case S_STRING:
   4800     #####: 3259:        if (ctx->nibble == lowNbl) {
   4801 branch  0 never executed
   4802 branch  1 never executed
   4803     #####: 3260:          readTypeOnly;
   4804         -: 3261:        }
   4805         -: 3262:        else {
   4806         -: 3263:          // high nibble
   4807     #####: 3264:          readTypeInHighNbl;
   4808 branch  0 never executed
   4809 branch  1 never executed
   4810         -: 3265:        }
   4811     #####: 3266:        s      = (char *)(*data);
   4812     #####: 3267:        *data += strlen(s)+1;
   4813     #####: 3268:        so     = allocSStringTiny(s);
   4814 call    0 never executed
   4815     #####: 3269:        sDictPushTiny(dict, key, (smallt *) so);
   4816 call    0 never executed
   4817     #####: 3270:        break;
   4818         -: 3271:      case S_ARRAY:
   4819     #####: 3272:        a = NULL;
   4820     #####: 3273:        arrayNetDeserialLevel1(&a, data, ctx);
   4821 call    0 never executed
   4822     #####: 3274:        sDictPushTiny(dict, key, (smallt *) a);
   4823 call    0 never executed
   4824     #####: 3275:        break;
   4825         -: 3276:      case S_BYTES:
   4826     #####: 3277:        B      = allocSBytes();
   4827 call    0 never executed
   4828     #####: 3278:        if (ctx->nibble == lowNbl) {
   4829 branch  0 never executed
   4830 branch  1 never executed
   4831     #####: 3279:          count  = netTypeVarintToUint((u8**)data);
   4832 call    0 never executed
   4833         -: 3280:        }
   4834         -: 3281:        else {
   4835         -: 3282:          // high nibble
   4836     #####: 3283:          readTypeInHighNbl;
   4837 branch  0 never executed
   4838 branch  1 never executed
   4839     #####: 3284:          count  = varintToUint((u8**)data);
   4840 call    0 never executed
   4841         -: 3285:        }
   4842     #####: 3286:        sBytesPushBuffer(&B, *data, count);
   4843 call    0 never executed
   4844     #####: 3287:        *data += count;
   4845     #####: 3288:        sDictPushTiny(dict, key, (smallt *) B);
   4846 call    0 never executed
   4847     #####: 3289:        break;
   4848         -: 3290:    }
   4849         -: 3291:  }
   4850         -: 3292:}
   4851         -: 3293:
   4852         -: 3294:/**
   4853         -: 3295: * deserialize array from data
   4854         -: 3296: *
   4855         -: 3297: * a new array is allocated
   4856         -: 3298: *
   4857         -: 3299: * \param
   4858         -: 3300: *    array holding the elements
   4859         -: 3301: *    data serialized dictionary
   4860         -: 3302: */
   4861 function arrayNetDeserialLevel1 called 0 returned 0% blocks executed 0%
   4862     #####: 3303:internal void arrayNetDeserialLevel1(sArrayt **array, u8 **data, contextt *ctx) {
   4863     #####: 3304:  sUndefinedt *u = NULL;
   4864     #####: 3305:  sBoolt *bo = NULL;
   4865     #####: 3306:  double *D = NULL;
   4866     #####: 3307:  sDoublet *Do = NULL;
   4867     #####: 3308:  sDictt *d = NULL;
   4868     #####: 3309:  sIntt *io = NULL;
   4869     #####: 3310:  char *s = NULL;
   4870     #####: 3311:  sStringt *so = NULL;
   4871     #####: 3312:  sArrayt *a = NULL;
   4872     #####: 3313:  sBytest *B = NULL;
   4873         -: 3314:  uint32_t count;
   4874         -: 3315:  uint32_t arrayCount;
   4875         -: 3316:
   4876     #####: 3317:  if (ctx->nibble == lowNbl) {
   4877 branch  0 never executed
   4878 branch  1 never executed
   4879     #####: 3318:    arrayCount = netTypeVarintToUint(data);
   4880 call    0 never executed
   4881         -: 3319:  }
   4882         -: 3320:  else {
   4883         -: 3321:    // high nibble
   4884     #####: 3322:    readTypeInHighNbl;
   4885 branch  0 never executed
   4886 branch  1 never executed
   4887     #####: 3323:    arrayCount = varintToUint(data);
   4888 call    0 never executed
   4889         -: 3324:  }
   4890         -: 3325:
   4891     #####: 3326:  if (!arrayCount) {
   4892 branch  0 never executed
   4893 branch  1 never executed
   4894     #####: 3327:    *array = allocSArray();;
   4895 call    0 never executed
   4896     #####: 3328:    ret;
   4897         -: 3329:  }
   4898         -: 3330:
   4899     #####: 3331:  loop(arrayCount) {
   4900 branch  0 never executed
   4901 branch  1 never executed
   4902         -: 3332:    char type;
   4903     #####: 3333:    if (ctx->nibble == lowNbl) {
   4904 branch  0 never executed
   4905 branch  1 never executed
   4906     #####: 3334:      type = (**data) & 0xF;
   4907         -: 3335:    }
   4908         -: 3336:    else {
   4909         -: 3337:      // high nibble
   4910     #####: 3338:      type = (*ctx->nblAddr) >> 4;
   4911         -: 3339:    }
   4912         -: 3340:
   4913     #####: 3341:    switch(type) {
   4914 branch  0 never executed
   4915 branch  1 never executed
   4916 branch  2 never executed
   4917 branch  3 never executed
   4918 branch  4 never executed
   4919 branch  5 never executed
   4920 branch  6 never executed
   4921 branch  7 never executed
   4922 branch  8 never executed
   4923         -: 3342:      case S_UNDEFINED:
   4924     #####: 3343:        if (ctx->nibble == lowNbl) {
   4925 branch  0 never executed
   4926 branch  1 never executed
   4927     #####: 3344:          readTypeOnly;
   4928         -: 3345:        }
   4929         -: 3346:        else {
   4930         -: 3347:          // high nibble
   4931     #####: 3348:          readTypeInHighNbl;
   4932 branch  0 never executed
   4933 branch  1 never executed
   4934         -: 3349:        }
   4935     #####: 3350:        u = allocSUndefined();
   4936 call    0 never executed
   4937     #####: 3351:        sArrayPushTiny(array, (smallt *) u);
   4938 call    0 never executed
   4939     #####: 3352:        break;
   4940         -: 3353:      case S_BOOL:
   4941     #####: 3354:        if (!ctx->boolAddr) {
   4942 branch  0 never executed
   4943 branch  1 never executed
   4944         -: 3355:          // new packed bools
   4945     #####: 3356:          if (ctx->nibble == lowNbl) {
   4946 branch  0 never executed
   4947 branch  1 never executed
   4948     #####: 3357:            read4bPackedBool;
   4949     #####: 3358:            bo = allocSBool((*ctx->boolAddr) & 0x10);
   4950 call    0 never executed
   4951         -: 3359:          }
   4952         -: 3360:          else {
   4953         -: 3361:            // high nibble
   4954     #####: 3362:            readTypeInHighNbl;
   4955 branch  0 never executed
   4956 branch  1 never executed
   4957     #####: 3363:            read8bPackedBool;
   4958     #####: 3364:            bo = allocSBool((*ctx->boolAddr) & 0x1);
   4959 call    0 never executed
   4960         -: 3365:          }
   4961         -: 3366:        }
   4962         -: 3367:        else {
   4963         -: 3368:          // there was a bool before this one, read bits in nibbles
   4964     #####: 3369:          if (ctx->nibble == lowNbl) {
   4965 branch  0 never executed
   4966 branch  1 never executed
   4967     #####: 3370:            if (ctx->boolShift == 8) {
   4968 branch  0 never executed
   4969 branch  1 never executed
   4970     #####: 3371:              read4bPackedBool;
   4971     #####: 3372:              bo = allocSBool((*ctx->boolAddr) & 0x10);
   4972 call    0 never executed
   4973         -: 3373:            }
   4974         -: 3374:            else {
   4975     #####: 3375:              readTypeOnly;
   4976     #####: 3376:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   4977 call    0 never executed
   4978         -: 3377:            }
   4979         -: 3378:          }
   4980         -: 3379:          else {
   4981         -: 3380:            // high nibble
   4982     #####: 3381:            readTypeInHighNbl;
   4983 branch  0 never executed
   4984 branch  1 never executed
   4985     #####: 3382:            if (ctx->boolShift == 8) {
   4986 branch  0 never executed
   4987 branch  1 never executed
   4988     #####: 3383:              read8bPackedBool;
   4989     #####: 3384:              bo = allocSBool((*ctx->boolAddr) & 0x1);
   4990 call    0 never executed
   4991         -: 3385:            }
   4992         -: 3386:            else {
   4993     #####: 3387:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   4994 call    0 never executed
   4995         -: 3388:            }
   4996         -: 3389:          }
   4997         -: 3390:        }
   4998     #####: 3391:        sArrayPushTiny(array, (smallt *) bo);
   4999 call    0 never executed
   5000     #####: 3392:        break;
   5001         -: 3393:      case S_DICT:
   5002     #####: 3394:        d = NULL;
   5003     #####: 3395:        dictNetDeserialLevel1(&d, data, ctx);
   5004 call    0 never executed
   5005     #####: 3396:        sArrayPushTiny(array, (smallt *) d);
   5006 call    0 never executed
   5007     #####: 3397:        break;
   5008         -: 3398:      case S_DOUBLE:
   5009     #####: 3399:        if (ctx->nibble == lowNbl) {
   5010 branch  0 never executed
   5011 branch  1 never executed
   5012     #####: 3400:          readTypeOnly;
   5013         -: 3401:        }
   5014         -: 3402:        else {
   5015         -: 3403:          // high nibble
   5016     #####: 3404:          readTypeInHighNbl;
   5017 branch  0 never executed
   5018 branch  1 never executed
   5019         -: 3405:        }
   5020     #####: 3406:        D      = (double *)(*data);
   5021     #####: 3407:        *data += sizeof(double);
   5022     #####: 3408:        Do     = allocSDouble(*D);
   5023 call    0 never executed
   5024     #####: 3409:        sArrayPushTiny(array, (smallt *) Do);
   5025 call    0 never executed
   5026     #####: 3410:        break;
   5027         -: 3411:      case S_INT: {
   5028         -: 3412:          u64 v;
   5029     #####: 3413:          if (ctx->nibble == lowNbl) {
   5030 branch  0 never executed
   5031 branch  1 never executed
   5032     #####: 3414:            v = netTypeVarintToUint((u8**)data);
   5033 call    0 never executed
   5034         -: 3415:          }
   5035         -: 3416:          else {
   5036         -: 3417:            // high nibble
   5037     #####: 3418:            readTypeInHighNbl;
   5038 branch  0 never executed
   5039 branch  1 never executed
   5040     #####: 3419:            v = varintToUint(data);
   5041 call    0 never executed
   5042         -: 3420:          }
   5043     #####: 3421:          v  = (v >> 1) ^ (~(v & 1) + 1);
   5044     #####: 3422:          io = allocSInt(v);
   5045 call    0 never executed
   5046     #####: 3423:          sArrayPushTiny(array, (smallt *) io);
   5047 call    0 never executed
   5048         -: 3424:        }
   5049     #####: 3425:        break;
   5050         -: 3426:      case S_STRING:
   5051     #####: 3427:        if (ctx->nibble == lowNbl) {
   5052 branch  0 never executed
   5053 branch  1 never executed
   5054     #####: 3428:          readTypeOnly;
   5055         -: 3429:        }
   5056         -: 3430:        else {
   5057         -: 3431:          // high nibble
   5058     #####: 3432:          readTypeInHighNbl;
   5059 branch  0 never executed
   5060 branch  1 never executed
   5061         -: 3433:        }
   5062     #####: 3434:        s      = (char *)(*data);
   5063     #####: 3435:        *data += strlen(s)+1;
   5064     #####: 3436:        so     = allocSStringTiny(s);
   5065 call    0 never executed
   5066     #####: 3437:        sArrayPushTiny(array, (smallt *) so);
   5067 call    0 never executed
   5068     #####: 3438:        break;
   5069         -: 3439:      case S_ARRAY:
   5070     #####: 3440:        a = NULL;
   5071     #####: 3441:        arrayNetDeserialLevel1(&a, data, ctx);
   5072 call    0 never executed
   5073     #####: 3442:        sArrayPushTiny(array, (smallt *) a);
   5074 call    0 never executed
   5075     #####: 3443:        break;
   5076         -: 3444:      case S_BYTES:
   5077     #####: 3445:        B      = allocSBytes();
   5078 call    0 never executed
   5079     #####: 3446:        if (ctx->nibble == lowNbl) {
   5080 branch  0 never executed
   5081 branch  1 never executed
   5082     #####: 3447:          count  = netTypeVarintToUint((u8**)data);
   5083 call    0 never executed
   5084         -: 3448:        }
   5085         -: 3449:        else {
   5086         -: 3450:          // high nibble
   5087     #####: 3451:          readTypeInHighNbl;
   5088 branch  0 never executed
   5089 branch  1 never executed
   5090     #####: 3452:          count  = varintToUint((u8**)data);
   5091 call    0 never executed
   5092         -: 3453:        }
   5093     #####: 3454:        sBytesPushBuffer(&B, *data, count);
   5094 call    0 never executed
   5095     #####: 3455:        *data += count;
   5096     #####: 3456:        sArrayPushTiny(array, (smallt *) B);
   5097 call    0 never executed
   5098     #####: 3457:        break;
   5099         -: 3458:    }
   5100         -: 3459:  }
   5101         -: 3460:}
   5102         -: 3461:
   5103 function deserialNetSerialLevel1 called 0 returned 0% blocks executed 0%
   5104     #####: 3462:internal smallJsont* deserialNetSerialLevel1(smallJsont *self, smallBytest *data) {
   5105         -: 3463:
   5106     #####: 3464:  if (!data or !data->B or !data->B->count) {
   5107 branch  0 never executed
   5108 branch  1 never executed
   5109 branch  2 never executed
   5110 branch  3 never executed
   5111 branch  4 never executed
   5112 branch  5 never executed
   5113     #####: 3465:    ret self;
   5114         -: 3466:  }
   5115         -: 3467:
   5116     #####: 3468:  smallt *o = netDeserialLevel1(data->B);
   5117 call    0 never executed
   5118         -: 3469:
   5119     #####: 3470:  if (!o) {
   5120 branch  0 never executed
   5121 branch  1 never executed
   5122     #####: 3471:    ret self;
   5123         -: 3472:  }
   5124         -: 3473:
   5125     #####: 3474:  freeG(self);
   5126 call    0 never executed
   5127         -: 3475:
   5128     #####: 3476:  setsoG(self, o);
   5129 call    0 never executed
   5130         -: 3477:
   5131     #####: 3478:  ret self;
   5132         -: 3479:}
   5133         -: 3480:
   5134         -: 3481:// level 2
   5135         -: 3482:// like level 1, arrays are set to uniform when all elements are same type
   5136         -: 3483:
   5137         -: 3484:/**
   5138         -: 3485: * deserializer top function
   5139         -: 3486: */
   5140 function netDeserialLevel2 called 0 returned 0% blocks executed 0%
   5141     #####: 3487:internal smallt* netDeserialLevel2(sBytest *obj) {
   5142     #####: 3488:  smallt   *r = NULL;
   5143     #####: 3489:  double   *D = NULL;
   5144     #####: 3490:  char     *s = NULL;
   5145     #####: 3491:  sBytest  *B = NULL;
   5146         -: 3492:  uint32_t count;
   5147     #####: 3493:  char     *data  = NULL;
   5148     #####: 3494:  contextt ctx = {.nibble=lowNbl, .nblAddr=NULL, .boolShift = 0, .boolAddr=NULL};
   5149         -: 3495:
   5150     #####: 3496:  switch(obj->data & 0xF) {
   5151 branch  0 never executed
   5152 branch  1 never executed
   5153 branch  2 never executed
   5154 branch  3 never executed
   5155 branch  4 never executed
   5156 branch  5 never executed
   5157 branch  6 never executed
   5158 branch  7 never executed
   5159 branch  8 never executed
   5160 branch  9 never executed
   5161 branch 10 never executed
   5162         -: 3497:    case S_UNDEFINED:
   5163     #####: 3498:      r = (smallt *) allocSUndefined();
   5164 call    0 never executed
   5165     #####: 3499:      break;
   5166         -: 3500:    case S_BOOL:
   5167     #####: 3501:      r = (smallt *) allocSBool(obj->data & 0x10);
   5168 call    0 never executed
   5169     #####: 3502:      break;
   5170         -: 3503:    case S_DICT:
   5171     #####: 3504:      data     = (char *)&(obj->data);
   5172         -: 3505:      //debug - ctx.dbuf = (u8*) data;
   5173     #####: 3506:      dictNetDeserialLevel2((sDictt **)&r, (u8**)&data, &ctx, /*packed=*/false);
   5174 call    0 never executed
   5175     #####: 3507:      break;
   5176         -: 3508:    case S_DOUBLE:
   5177     #####: 3509:      data = &(obj->data)+1;
   5178     #####: 3510:      D = (double *)data;
   5179     #####: 3511:      r = (smallt *) allocSDouble(*D);
   5180 call    0 never executed
   5181     #####: 3512:      break;
   5182         -: 3513:    case S_INT:
   5183     #####: 3514:      data  = &(obj->data);
   5184     #####: 3515:      u64 v = netTypeVarintToUint((u8**)&data);
   5185 call    0 never executed
   5186     #####: 3516:      v     = (v >> 1) ^ (~(v & 1) + 1);
   5187     #####: 3517:      r = (smallt *) allocSInt(v);
   5188 call    0 never executed
   5189     #####: 3518:      break;
   5190         -: 3519:    case S_STRING:
   5191     #####: 3520:      s = (char *)&(obj->data)+1;
   5192     #####: 3521:      r = (smallt *) allocSStringTiny(s);
   5193 call    0 never executed
   5194     #####: 3522:      break;
   5195         -: 3523:    case S_ARRAY:
   5196     #####: 3524:      data = (char *)&(obj->data);
   5197         -: 3525:      //debug - ctx.dbuf = (u8*) data;
   5198     #####: 3526:      arrayNetDeserialLevel2((sArrayt **)&r, (u8**)&data, &ctx, /*packed=*/false);
   5199 call    0 never executed
   5200     #####: 3527:      break;
   5201         -: 3528:    case S_BYTES:
   5202     #####: 3529:      B     = allocSBytes();
   5203 call    0 never executed
   5204     #####: 3530:      data  = &(obj->data);
   5205     #####: 3531:      count = netTypeVarintToUint((u8**)&data);
   5206 call    0 never executed
   5207     #####: 3532:      sBytesPushBuffer(&B, data, count);
   5208 call    0 never executed
   5209     #####: 3533:      r = (smallt *)B;
   5210     #####: 3534:      break;
   5211         -: 3535:    case UNIFORM_DICT:
   5212     #####: 3536:      data     = (char *)&(obj->data);
   5213         -: 3537:      //debug - ctx.dbuf = (u8*) data;
   5214     #####: 3538:      uniformDictNetDeserialLevel2((sDictt **)&r, (u8**)&data, &ctx, /*packed=*/false);
   5215 call    0 never executed
   5216     #####: 3539:      break;
   5217         -: 3540:    case UNIFORM_ARRAY:
   5218     #####: 3541:      data     = (char *)&(obj->data);
   5219         -: 3542:      //debug - ctx.dbuf = (u8*) data;
   5220     #####: 3543:      uniformArrayNetDeserialLevel2((sArrayt **)&r, (u8**)&data, &ctx, /*packed=*/false);
   5221 call    0 never executed
   5222     #####: 3544:      break;
   5223         -: 3545:  }
   5224         -: 3546:
   5225     #####: 3547:  ret r;
   5226         -: 3548:}
   5227         -: 3549:
   5228         -: 3550:/**
   5229         -: 3551: * deserialize dictionary from data
   5230         -: 3552: *
   5231         -: 3553: * a new dictionary is allocated
   5232         -: 3554: *
   5233         -: 3555: * \param
   5234         -: 3556: *    dict dictionary holding the elements
   5235         -: 3557: *    data serialized dictionary
   5236         -: 3558: */
   5237 function dictNetDeserialLevel2 called 0 returned 0% blocks executed 0%
   5238     #####: 3559:internal void dictNetDeserialLevel2(sDictt **dict, u8 **data, contextt *ctx, bool packed) {
   5239     #####: 3560:  sUndefinedt *u = NULL;
   5240     #####: 3561:  sBoolt *bo = NULL;
   5241     #####: 3562:  double *D = NULL;
   5242     #####: 3563:  sDoublet *Do = NULL;
   5243     #####: 3564:  sDictt *d = NULL;
   5244     #####: 3565:  sIntt *io = NULL;
   5245     #####: 3566:  char *s = NULL;
   5246     #####: 3567:  sStringt *so = NULL;
   5247     #####: 3568:  sArrayt *a = NULL;
   5248     #####: 3569:  sBytest *B = NULL;
   5249         -: 3570:  uint32_t count;
   5250         -: 3571:  uint32_t dictCount;
   5251         -: 3572:
   5252     #####: 3573:  if (packed) {
   5253 branch  0 never executed
   5254 branch  1 never executed
   5255     #####: 3574:    dictCount = varintToUint(data);
   5256 call    0 never executed
   5257         -: 3575:  }
   5258         -: 3576:  else {
   5259     #####: 3577:    if (ctx->nibble == lowNbl) {
   5260 branch  0 never executed
   5261 branch  1 never executed
   5262     #####: 3578:      dictCount = netTypeVarintToUint(data);
   5263 call    0 never executed
   5264         -: 3579:    }
   5265         -: 3580:    else {
   5266         -: 3581:      // high nibble
   5267         -: 3582:      // type = *(ctx->dbuf + ctx->nblOffset) >> 4;
   5268         -: 3583:      #define readTypeInHighNbl\
   5269         -: 3584:      ctx->nibble  = lowNbl;\
   5270         -: 3585:      if (ctx->nblAddr == *data)\
   5271         -: 3586:      /* data points to the type, next byte is count */\
   5272         -: 3587:      (*data)++
   5273     #####: 3588:      readTypeInHighNbl;
   5274 branch  0 never executed
   5275 branch  1 never executed
   5276     #####: 3589:      dictCount = varintToUint(data);
   5277 call    0 never executed
   5278         -: 3590:    }
   5279         -: 3591:  }
   5280         -: 3592:
   5281     #####: 3593:  if (!dictCount) {
   5282 branch  0 never executed
   5283 branch  1 never executed
   5284     #####: 3594:    *dict = allocSDict();
   5285 call    0 never executed
   5286     #####: 3595:    ret;
   5287         -: 3596:  }
   5288         -: 3597:
   5289     #####: 3598:  loop(dictCount) {
   5290 branch  0 never executed
   5291 branch  1 never executed
   5292     #####: 3599:    char *key  = (char*)*data;
   5293     #####: 3600:    *data     += strlen(key)+1;
   5294         -: 3601:    char type;
   5295     #####: 3602:    if (ctx->nibble == lowNbl) {
   5296 branch  0 never executed
   5297 branch  1 never executed
   5298     #####: 3603:      type = (**data) & 0xF;
   5299         -: 3604:    }
   5300         -: 3605:    else {
   5301         -: 3606:      // high nibble
   5302     #####: 3607:      type = (*ctx->nblAddr) >> 4;
   5303         -: 3608:    }
   5304         -: 3609:
   5305     #####: 3610:    switch(type) {
   5306 branch  0 never executed
   5307 branch  1 never executed
   5308 branch  2 never executed
   5309 branch  3 never executed
   5310 branch  4 never executed
   5311 branch  5 never executed
   5312 branch  6 never executed
   5313 branch  7 never executed
   5314 branch  8 never executed
   5315 branch  9 never executed
   5316 branch 10 never executed
   5317         -: 3611:      case S_UNDEFINED:
   5318     #####: 3612:        if (ctx->nibble == lowNbl) {
   5319 branch  0 never executed
   5320 branch  1 never executed
   5321         -: 3613:          #define readTypeOnly\
   5322         -: 3614:          ctx->nibble  = highNbl;\
   5323         -: 3615:          ctx->nblAddr = *data;\
   5324         -: 3616:          (*data)++
   5325     #####: 3617:          readTypeOnly;
   5326         -: 3618:        }
   5327         -: 3619:        else {
   5328         -: 3620:          // high nibble
   5329     #####: 3621:          readTypeInHighNbl;
   5330 branch  0 never executed
   5331 branch  1 never executed
   5332         -: 3622:        }
   5333     #####: 3623:        u = allocSUndefined();
   5334 call    0 never executed
   5335     #####: 3624:        sDictPushTiny(dict, key, (smallt *) u);
   5336 call    0 never executed
   5337     #####: 3625:        break;
   5338         -: 3626:      case S_BOOL:
   5339     #####: 3627:        if (!ctx->boolAddr) {
   5340 branch  0 never executed
   5341 branch  1 never executed
   5342         -: 3628:          // new packed bools
   5343     #####: 3629:          if (ctx->nibble == lowNbl) {
   5344 branch  0 never executed
   5345 branch  1 never executed
   5346         -: 3630:            #define read4bPackedBool\
   5347         -: 3631:            ctx->boolShift  = 5;\
   5348         -: 3632:            ctx->boolAddr   = *data;\
   5349         -: 3633:            (*data)++
   5350     #####: 3634:            read4bPackedBool;
   5351     #####: 3635:            bo = allocSBool((*ctx->boolAddr) & 0x10);
   5352 call    0 never executed
   5353         -: 3636:          }
   5354         -: 3637:          else {
   5355         -: 3638:            // high nibble
   5356     #####: 3639:            readTypeInHighNbl;
   5357 branch  0 never executed
   5358 branch  1 never executed
   5359         -: 3640:            #define read8bPackedBool\
   5360         -: 3641:            ctx->boolShift  = 1;\
   5361         -: 3642:            ctx->boolAddr   = *data;\
   5362         -: 3643:            (*data)++
   5363     #####: 3644:            read8bPackedBool;
   5364     #####: 3645:            bo = allocSBool((*ctx->boolAddr) & 0x1);
   5365 call    0 never executed
   5366         -: 3646:          }
   5367         -: 3647:        }
   5368         -: 3648:        else {
   5369         -: 3649:          // there was a bool before this one, read bits in nibbles
   5370     #####: 3650:          if (ctx->nibble == lowNbl) {
   5371 branch  0 never executed
   5372 branch  1 never executed
   5373     #####: 3651:            if (ctx->boolShift == 8) {
   5374 branch  0 never executed
   5375 branch  1 never executed
   5376     #####: 3652:              read4bPackedBool;
   5377     #####: 3653:              bo = allocSBool((*ctx->boolAddr) & 0x10);
   5378 call    0 never executed
   5379         -: 3654:            }
   5380         -: 3655:            else {
   5381     #####: 3656:              readTypeOnly;
   5382     #####: 3657:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   5383 call    0 never executed
   5384         -: 3658:            }
   5385         -: 3659:          }
   5386         -: 3660:          else {
   5387         -: 3661:            // high nibble
   5388     #####: 3662:            readTypeInHighNbl;
   5389 branch  0 never executed
   5390 branch  1 never executed
   5391     #####: 3663:            if (ctx->boolShift == 8) {
   5392 branch  0 never executed
   5393 branch  1 never executed
   5394     #####: 3664:              read8bPackedBool;
   5395     #####: 3665:              bo = allocSBool((*ctx->boolAddr) & 0x1);
   5396 call    0 never executed
   5397         -: 3666:            }
   5398         -: 3667:            else {
   5399         -: 3668:              // high nibble
   5400     #####: 3669:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   5401 call    0 never executed
   5402         -: 3670:            }
   5403         -: 3671:          }
   5404         -: 3672:        }
   5405     #####: 3673:        sDictPushTiny(dict, key, (smallt *) bo);
   5406 call    0 never executed
   5407     #####: 3674:        break;
   5408         -: 3675:      case S_DICT:
   5409     #####: 3676:        d = NULL;
   5410     #####: 3677:        dictNetDeserialLevel2(&d, data, ctx, /*packed=*/false);
   5411 call    0 never executed
   5412     #####: 3678:        sDictPushTiny(dict, key, (smallt *) d);
   5413 call    0 never executed
   5414     #####: 3679:        break;
   5415         -: 3680:      case S_DOUBLE:
   5416     #####: 3681:        if (ctx->nibble == lowNbl) {
   5417 branch  0 never executed
   5418 branch  1 never executed
   5419     #####: 3682:          readTypeOnly;
   5420         -: 3683:        }
   5421         -: 3684:        else {
   5422         -: 3685:          // high nibble
   5423     #####: 3686:          readTypeInHighNbl;
   5424 branch  0 never executed
   5425 branch  1 never executed
   5426         -: 3687:        }
   5427     #####: 3688:        D      = (double *)(*data);
   5428     #####: 3689:        *data += sizeof(double);
   5429     #####: 3690:        Do     = allocSDouble(*D);
   5430 call    0 never executed
   5431     #####: 3691:        sDictPushTiny(dict, key, (smallt *) Do);
   5432 call    0 never executed
   5433     #####: 3692:        break;
   5434         -: 3693:      case S_INT: {
   5435         -: 3694:          u64 v;
   5436     #####: 3695:          if (ctx->nibble == lowNbl) {
   5437 branch  0 never executed
   5438 branch  1 never executed
   5439     #####: 3696:            v = netTypeVarintToUint((u8**)data);
   5440 call    0 never executed
   5441         -: 3697:          }
   5442         -: 3698:          else {
   5443         -: 3699:            // high nibble
   5444     #####: 3700:            readTypeInHighNbl;
   5445 branch  0 never executed
   5446 branch  1 never executed
   5447     #####: 3701:            v = varintToUint(data);
   5448 call    0 never executed
   5449         -: 3702:          }
   5450     #####: 3703:          v  = (v >> 1) ^ (~(v & 1) + 1);
   5451     #####: 3704:          io = allocSInt(v);
   5452 call    0 never executed
   5453     #####: 3705:          sDictPushTiny(dict, key, (smallt *) io);
   5454 call    0 never executed
   5455         -: 3706:        }
   5456     #####: 3707:        break;
   5457         -: 3708:      case S_STRING:
   5458     #####: 3709:        if (ctx->nibble == lowNbl) {
   5459 branch  0 never executed
   5460 branch  1 never executed
   5461     #####: 3710:          readTypeOnly;
   5462         -: 3711:        }
   5463         -: 3712:        else {
   5464         -: 3713:          // high nibble
   5465     #####: 3714:          readTypeInHighNbl;
   5466 branch  0 never executed
   5467 branch  1 never executed
   5468         -: 3715:        }
   5469     #####: 3716:        s      = (char *)(*data);
   5470     #####: 3717:        *data += strlen(s)+1;
   5471     #####: 3718:        so     = allocSStringTiny(s);
   5472 call    0 never executed
   5473     #####: 3719:        sDictPushTiny(dict, key, (smallt *) so);
   5474 call    0 never executed
   5475     #####: 3720:        break;
   5476         -: 3721:      case S_ARRAY:
   5477     #####: 3722:        a = NULL;
   5478     #####: 3723:        arrayNetDeserialLevel2(&a, data, ctx, /*packed=*/false);
   5479 call    0 never executed
   5480     #####: 3724:        sDictPushTiny(dict, key, (smallt *) a);
   5481 call    0 never executed
   5482     #####: 3725:        break;
   5483         -: 3726:      case S_BYTES:
   5484     #####: 3727:        B      = allocSBytes();
   5485 call    0 never executed
   5486     #####: 3728:        if (ctx->nibble == lowNbl) {
   5487 branch  0 never executed
   5488 branch  1 never executed
   5489     #####: 3729:          count  = netTypeVarintToUint((u8**)data);
   5490 call    0 never executed
   5491         -: 3730:        }
   5492         -: 3731:        else {
   5493         -: 3732:          // high nibble
   5494     #####: 3733:          readTypeInHighNbl;
   5495 branch  0 never executed
   5496 branch  1 never executed
   5497     #####: 3734:          count  = varintToUint((u8**)data);
   5498 call    0 never executed
   5499         -: 3735:        }
   5500     #####: 3736:        sBytesPushBuffer(&B, *data, count);
   5501 call    0 never executed
   5502     #####: 3737:        *data += count;
   5503     #####: 3738:        sDictPushTiny(dict, key, (smallt *) B);
   5504 call    0 never executed
   5505     #####: 3739:        break;
   5506         -: 3740:      case UNIFORM_DICT:
   5507     #####: 3741:        d = NULL;
   5508     #####: 3742:        uniformDictNetDeserialLevel2(&d, data, ctx, /*packed=*/false);
   5509 call    0 never executed
   5510     #####: 3743:        sDictPushTiny(dict, key, (smallt *) d);
   5511 call    0 never executed
   5512     #####: 3744:        break;
   5513         -: 3745:      case UNIFORM_ARRAY:
   5514     #####: 3746:        a = NULL;
   5515     #####: 3747:        uniformArrayNetDeserialLevel2(&a, data, ctx, /*packed=*/false);
   5516 call    0 never executed
   5517     #####: 3748:        sDictPushTiny(dict, key, (smallt *) a);
   5518 call    0 never executed
   5519     #####: 3749:        break;
   5520         -: 3750:    }
   5521         -: 3751:  }
   5522         -: 3752:}
   5523         -: 3753:
   5524         -: 3754:/**
   5525         -: 3755: * deserialize dictionary from data
   5526         -: 3756: *
   5527         -: 3757: * a new dictionary is allocated
   5528         -: 3758: *
   5529         -: 3759: * \param
   5530         -: 3760: *    dict dictionary holding the elements
   5531         -: 3761: *    data serialized dictionary
   5532         -: 3762: */
   5533 function uniformDictNetDeserialLevel2 called 0 returned 0% blocks executed 0%
   5534     #####: 3763:internal void uniformDictNetDeserialLevel2(sDictt **dict, u8 **data, contextt *ctx, bool packed) {
   5535     #####: 3764:  sUndefinedt *u = NULL;
   5536     #####: 3765:  sBoolt *bo = NULL;
   5537     #####: 3766:  double *D = NULL;
   5538     #####: 3767:  sDoublet *Do = NULL;
   5539     #####: 3768:  sDictt *d = NULL;
   5540     #####: 3769:  sIntt *io = NULL;
   5541     #####: 3770:  char *s = NULL;
   5542     #####: 3771:  sStringt *so = NULL;
   5543     #####: 3772:  sArrayt *a = NULL;
   5544     #####: 3773:  sBytest *B = NULL;
   5545         -: 3774:  uint32_t count;
   5546         -: 3775:  uint32_t dictCount;
   5547         -: 3776:  u8 type;
   5548         -: 3777:
   5549     #####: 3778:  if (packed) {
   5550 branch  0 never executed
   5551 branch  1 never executed
   5552     #####: 3779:    type = (**data) & 0xF;
   5553     #####: 3780:    dictCount = netTypeVarintToUint(data);
   5554 call    0 never executed
   5555         -: 3781:  }
   5556         -: 3782:  else {
   5557     #####: 3783:    if (ctx->nibble == lowNbl) {
   5558 branch  0 never executed
   5559 branch  1 never executed
   5560     #####: 3784:      type = (**data) >> 4;
   5561     #####: 3785:      (*data)++;
   5562     #####: 3786:      dictCount = varintToUint(data);
   5563 call    0 never executed
   5564         -: 3787:    }
   5565         -: 3788:    else {
   5566     #####: 3789:      readTypeInHighNbl;
   5567 branch  0 never executed
   5568 branch  1 never executed
   5569     #####: 3790:      type = (**data) & 0xF;
   5570     #####: 3791:      dictCount = netTypeVarintToUint(data);
   5571 call    0 never executed
   5572         -: 3792:    }
   5573         -: 3793:  }
   5574         -: 3794:
   5575     #####: 3795:  if (!dictCount) {
   5576 branch  0 never executed
   5577 branch  1 never executed
   5578     #####: 3796:    *dict = allocSDict();
   5579 call    0 never executed
   5580     #####: 3797:    ret;
   5581         -: 3798:  }
   5582         -: 3799:
   5583         -: 3800:
   5584     #####: 3801:  switch(type) {
   5585 branch  0 never executed
   5586 branch  1 never executed
   5587 branch  2 never executed
   5588 branch  3 never executed
   5589 branch  4 never executed
   5590 branch  5 never executed
   5591 branch  6 never executed
   5592 branch  7 never executed
   5593 branch  8 never executed
   5594 branch  9 never executed
   5595 branch 10 never executed
   5596         -: 3802:    case S_UNDEFINED:
   5597     #####: 3803:      loop(dictCount) {
   5598 branch  0 never executed
   5599 branch  1 never executed
   5600     #####: 3804:        char *key  = (char*)*data;
   5601     #####: 3805:        *data     += strlen(key)+1;
   5602     #####: 3806:        u = allocSUndefined();
   5603 call    0 never executed
   5604     #####: 3807:        sDictPushTiny(dict, key, (smallt *) u);
   5605 call    0 never executed
   5606         -: 3808:      }
   5607     #####: 3809:      break;
   5608         -: 3810:    case S_BOOL:
   5609     #####: 3811:      loop(dictCount) {
   5610 branch  0 never executed
   5611 branch  1 never executed
   5612     #####: 3812:        char *key  = (char*)*data;
   5613     #####: 3813:        *data     += strlen(key)+1;
   5614     #####: 3814:        if (!ctx->boolAddr) {
   5615 branch  0 never executed
   5616 branch  1 never executed
   5617     #####: 3815:          read8bPackedBool;
   5618     #####: 3816:          ctx->boolShift = 0;
   5619         -: 3817:        }
   5620     #####: 3818:        if (ctx->boolShift == 8) {
   5621 branch  0 never executed
   5622 branch  1 never executed
   5623     #####: 3819:          readTypeInHighNbl;
   5624 branch  0 never executed
   5625 branch  1 never executed
   5626     #####: 3820:          read8bPackedBool;
   5627     #####: 3821:          bo = allocSBool((*ctx->boolAddr) & 0x1);
   5628 call    0 never executed
   5629         -: 3822:        }
   5630         -: 3823:        else {
   5631         -: 3824:          // high nibble
   5632     #####: 3825:          readTypeInHighNbl;
   5633 branch  0 never executed
   5634 branch  1 never executed
   5635     #####: 3826:          bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   5636 call    0 never executed
   5637         -: 3827:        }
   5638     #####: 3828:        sDictPushTiny(dict, key, (smallt *) bo);
   5639 call    0 never executed
   5640         -: 3829:      }
   5641     #####: 3830:      break;
   5642         -: 3831:    case S_DICT:
   5643     #####: 3832:      loop(dictCount) {
   5644 branch  0 never executed
   5645 branch  1 never executed
   5646     #####: 3833:        char *key  = (char*)*data;
   5647     #####: 3834:        *data     += strlen(key)+1;
   5648     #####: 3835:        d          = NULL;
   5649     #####: 3836:        dictNetDeserialLevel2(&d, data, ctx, /*packed=*/true);
   5650 call    0 never executed
   5651     #####: 3837:        sDictPushTiny(dict, key, (smallt *) d);
   5652 call    0 never executed
   5653         -: 3838:      }
   5654     #####: 3839:      break;
   5655         -: 3840:    case S_DOUBLE:
   5656     #####: 3841:      loop(dictCount) {
   5657 branch  0 never executed
   5658 branch  1 never executed
   5659     #####: 3842:        char *key  = (char*)*data;
   5660     #####: 3843:        *data     += strlen(key)+1;
   5661     #####: 3844:        D          = (double *)(*data);
   5662     #####: 3845:        *data     += sizeof(double);
   5663     #####: 3846:        Do         = allocSDouble(*D);
   5664 call    0 never executed
   5665     #####: 3847:        sDictPushTiny(dict, key, (smallt *) Do);
   5666 call    0 never executed
   5667         -: 3848:      }
   5668     #####: 3849:      break;
   5669         -: 3850:    case S_INT:
   5670     #####: 3851:      loop(dictCount) {
   5671 branch  0 never executed
   5672 branch  1 never executed
   5673     #####: 3852:        char *key  = (char*)*data;
   5674     #####: 3853:        *data     += strlen(key)+1;
   5675     #####: 3854:        u64 v      = varintToUint(data);
   5676 call    0 never executed
   5677     #####: 3855:        v          = (v >> 1) ^ (~(v & 1) + 1);
   5678     #####: 3856:        io         = allocSInt(v);
   5679 call    0 never executed
   5680     #####: 3857:        sDictPushTiny(dict, key, (smallt *) io);
   5681 call    0 never executed
   5682         -: 3858:      }
   5683     #####: 3859:      break;
   5684         -: 3860:    case S_STRING:
   5685     #####: 3861:      loop(dictCount) {
   5686 branch  0 never executed
   5687 branch  1 never executed
   5688     #####: 3862:        char *key  = (char*)*data;
   5689     #####: 3863:        *data     += strlen(key)+1;
   5690     #####: 3864:        s          = (char *)(*data);
   5691     #####: 3865:        *data     += strlen(s)+1;
   5692     #####: 3866:        so         = allocSStringTiny(s);
   5693 call    0 never executed
   5694     #####: 3867:        sDictPushTiny(dict, key, (smallt *) so);
   5695 call    0 never executed
   5696         -: 3868:      }
   5697     #####: 3869:      break;
   5698         -: 3870:    case S_ARRAY:
   5699     #####: 3871:      loop(dictCount) {
   5700 branch  0 never executed
   5701 branch  1 never executed
   5702     #####: 3872:        char *key  = (char*)*data;
   5703     #####: 3873:        *data     += strlen(key)+1;
   5704     #####: 3874:        a          = NULL;
   5705     #####: 3875:        arrayNetDeserialLevel2(&a, data, ctx, /*packed=*/true);
   5706 call    0 never executed
   5707     #####: 3876:        sDictPushTiny(dict, key, (smallt *) a);
   5708 call    0 never executed
   5709         -: 3877:      }
   5710     #####: 3878:      break;
   5711         -: 3879:    case S_BYTES:
   5712     #####: 3880:      loop(dictCount) {
   5713 branch  0 never executed
   5714 branch  1 never executed
   5715     #####: 3881:        char *key  = (char*)*data;
   5716     #####: 3882:        *data     += strlen(key)+1;
   5717     #####: 3883:        B          = allocSBytes();
   5718 call    0 never executed
   5719     #####: 3884:        count      = varintToUint((u8**)data);
   5720 call    0 never executed
   5721     #####: 3885:        sBytesPushBuffer(&B, *data, count);
   5722 call    0 never executed
   5723     #####: 3886:        *data     += count;
   5724     #####: 3887:        sDictPushTiny(dict, key, (smallt *) B);
   5725 call    0 never executed
   5726         -: 3888:      }
   5727     #####: 3889:      break;
   5728         -: 3890:    case UNIFORM_DICT:
   5729     #####: 3891:      loop(dictCount) {
   5730 branch  0 never executed
   5731 branch  1 never executed
   5732     #####: 3892:        char *key  = (char*)*data;
   5733     #####: 3893:        *data     += strlen(key)+1;
   5734     #####: 3894:        d          = NULL;
   5735     #####: 3895:        uniformDictNetDeserialLevel2(&d, data, ctx, /*packed=*/true);
   5736 call    0 never executed
   5737     #####: 3896:        sDictPushTiny(dict, key, (smallt *) d);
   5738 call    0 never executed
   5739         -: 3897:      }
   5740     #####: 3898:      break;
   5741         -: 3899:    case UNIFORM_ARRAY:
   5742     #####: 3900:      loop(dictCount) {
   5743 branch  0 never executed
   5744 branch  1 never executed
   5745     #####: 3901:        char *key  = (char*)*data;
   5746     #####: 3902:        *data     += strlen(key)+1;
   5747     #####: 3903:        a          = NULL;
   5748     #####: 3904:        uniformArrayNetDeserialLevel2(&a, data, ctx, /*packed=*/true);
   5749 call    0 never executed
   5750     #####: 3905:        sDictPushTiny(dict, key, (smallt *) a);
   5751 call    0 never executed
   5752         -: 3906:      }
   5753     #####: 3907:      break;
   5754         -: 3908:  }
   5755         -: 3909:}
   5756         -: 3910:
   5757         -: 3911:/**
   5758         -: 3912: * deserialize array from data
   5759         -: 3913: *
   5760         -: 3914: * a new array is allocated
   5761         -: 3915: *
   5762         -: 3916: * \param
   5763         -: 3917: *    array holding the elements
   5764         -: 3918: *    data serialized dictionary
   5765         -: 3919: */
   5766 function arrayNetDeserialLevel2 called 0 returned 0% blocks executed 0%
   5767     #####: 3920:internal void arrayNetDeserialLevel2(sArrayt **array, u8 **data, contextt *ctx, bool packed) {
   5768     #####: 3921:  sUndefinedt *u = NULL;
   5769     #####: 3922:  sBoolt *bo = NULL;
   5770     #####: 3923:  double *D = NULL;
   5771     #####: 3924:  sDoublet *Do = NULL;
   5772     #####: 3925:  sDictt *d = NULL;
   5773     #####: 3926:  sIntt *io = NULL;
   5774     #####: 3927:  char *s = NULL;
   5775     #####: 3928:  sStringt *so = NULL;
   5776     #####: 3929:  sArrayt *a = NULL;
   5777     #####: 3930:  sBytest *B = NULL;
   5778         -: 3931:  uint32_t count;
   5779         -: 3932:  uint32_t arrayCount;
   5780         -: 3933:
   5781     #####: 3934:  if (packed) {
   5782 branch  0 never executed
   5783 branch  1 never executed
   5784     #####: 3935:    arrayCount = varintToUint(data);
   5785 call    0 never executed
   5786         -: 3936:  }
   5787         -: 3937:  else {
   5788     #####: 3938:    if (ctx->nibble == lowNbl) {
   5789 branch  0 never executed
   5790 branch  1 never executed
   5791     #####: 3939:      arrayCount = netTypeVarintToUint(data);
   5792 call    0 never executed
   5793         -: 3940:    }
   5794         -: 3941:    else {
   5795         -: 3942:      // high nibble
   5796     #####: 3943:      readTypeInHighNbl;
   5797 branch  0 never executed
   5798 branch  1 never executed
   5799     #####: 3944:      arrayCount = varintToUint(data);
   5800 call    0 never executed
   5801         -: 3945:    }
   5802         -: 3946:  }
   5803         -: 3947:
   5804     #####: 3948:  if (!arrayCount) {
   5805 branch  0 never executed
   5806 branch  1 never executed
   5807     #####: 3949:    *array = allocSArray();;
   5808 call    0 never executed
   5809     #####: 3950:    ret;
   5810         -: 3951:  }
   5811         -: 3952:
   5812     #####: 3953:  loop(arrayCount) {
   5813 branch  0 never executed
   5814 branch  1 never executed
   5815         -: 3954:    char type;
   5816     #####: 3955:    if (ctx->nibble == lowNbl) {
   5817 branch  0 never executed
   5818 branch  1 never executed
   5819     #####: 3956:      type = (**data) & 0xF;
   5820         -: 3957:    }
   5821         -: 3958:    else {
   5822         -: 3959:      // high nibble
   5823     #####: 3960:      type = (*ctx->nblAddr) >> 4;
   5824         -: 3961:    }
   5825         -: 3962:
   5826     #####: 3963:    switch(type) {
   5827 branch  0 never executed
   5828 branch  1 never executed
   5829 branch  2 never executed
   5830 branch  3 never executed
   5831 branch  4 never executed
   5832 branch  5 never executed
   5833 branch  6 never executed
   5834 branch  7 never executed
   5835 branch  8 never executed
   5836 branch  9 never executed
   5837 branch 10 never executed
   5838         -: 3964:      case S_UNDEFINED:
   5839     #####: 3965:        if (ctx->nibble == lowNbl) {
   5840 branch  0 never executed
   5841 branch  1 never executed
   5842     #####: 3966:          readTypeOnly;
   5843         -: 3967:        }
   5844         -: 3968:        else {
   5845         -: 3969:          // high nibble
   5846     #####: 3970:          readTypeInHighNbl;
   5847 branch  0 never executed
   5848 branch  1 never executed
   5849         -: 3971:        }
   5850     #####: 3972:        u = allocSUndefined();
   5851 call    0 never executed
   5852     #####: 3973:        sArrayPushTiny(array, (smallt *) u);
   5853 call    0 never executed
   5854     #####: 3974:        break;
   5855         -: 3975:      case S_BOOL:
   5856     #####: 3976:        if (!ctx->boolAddr) {
   5857 branch  0 never executed
   5858 branch  1 never executed
   5859         -: 3977:          // new packed bools
   5860     #####: 3978:          if (ctx->nibble == lowNbl) {
   5861 branch  0 never executed
   5862 branch  1 never executed
   5863     #####: 3979:            read4bPackedBool;
   5864     #####: 3980:            bo = allocSBool((*ctx->boolAddr) & 0x10);
   5865 call    0 never executed
   5866         -: 3981:          }
   5867         -: 3982:          else {
   5868         -: 3983:            // high nibble
   5869     #####: 3984:            readTypeInHighNbl;
   5870 branch  0 never executed
   5871 branch  1 never executed
   5872     #####: 3985:            read8bPackedBool;
   5873     #####: 3986:            bo = allocSBool((*ctx->boolAddr) & 0x1);
   5874 call    0 never executed
   5875         -: 3987:          }
   5876         -: 3988:        }
   5877         -: 3989:        else {
   5878         -: 3990:          // there was a bool before this one, read bits in nibbles
   5879     #####: 3991:          if (ctx->nibble == lowNbl) {
   5880 branch  0 never executed
   5881 branch  1 never executed
   5882     #####: 3992:            if (ctx->boolShift == 8) {
   5883 branch  0 never executed
   5884 branch  1 never executed
   5885     #####: 3993:              read4bPackedBool;
   5886     #####: 3994:              bo = allocSBool((*ctx->boolAddr) & 0x10);
   5887 call    0 never executed
   5888         -: 3995:            }
   5889         -: 3996:            else {
   5890     #####: 3997:              readTypeOnly;
   5891     #####: 3998:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   5892 call    0 never executed
   5893         -: 3999:            }
   5894         -: 4000:          }
   5895         -: 4001:          else {
   5896         -: 4002:            // high nibble
   5897     #####: 4003:            readTypeInHighNbl;
   5898 branch  0 never executed
   5899 branch  1 never executed
   5900     #####: 4004:            if (ctx->boolShift == 8) {
   5901 branch  0 never executed
   5902 branch  1 never executed
   5903     #####: 4005:              read8bPackedBool;
   5904     #####: 4006:              bo = allocSBool((*ctx->boolAddr) & 0x1);
   5905 call    0 never executed
   5906         -: 4007:            }
   5907         -: 4008:            else {
   5908     #####: 4009:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   5909 call    0 never executed
   5910         -: 4010:            }
   5911         -: 4011:          }
   5912         -: 4012:        }
   5913     #####: 4013:        sArrayPushTiny(array, (smallt *) bo);
   5914 call    0 never executed
   5915     #####: 4014:        break;
   5916         -: 4015:      case S_DICT:
   5917     #####: 4016:        d = NULL;
   5918     #####: 4017:        dictNetDeserialLevel2(&d, data, ctx, /*packed=*/false);
   5919 call    0 never executed
   5920     #####: 4018:        sArrayPushTiny(array, (smallt *) d);
   5921 call    0 never executed
   5922     #####: 4019:        break;
   5923         -: 4020:      case S_DOUBLE:
   5924     #####: 4021:        if (ctx->nibble == lowNbl) {
   5925 branch  0 never executed
   5926 branch  1 never executed
   5927     #####: 4022:          readTypeOnly;
   5928         -: 4023:        }
   5929         -: 4024:        else {
   5930         -: 4025:          // high nibble
   5931     #####: 4026:          readTypeInHighNbl;
   5932 branch  0 never executed
   5933 branch  1 never executed
   5934         -: 4027:        }
   5935     #####: 4028:        D      = (double *)(*data);
   5936     #####: 4029:        *data += sizeof(double);
   5937     #####: 4030:        Do     = allocSDouble(*D);
   5938 call    0 never executed
   5939     #####: 4031:        sArrayPushTiny(array, (smallt *) Do);
   5940 call    0 never executed
   5941     #####: 4032:        break;
   5942         -: 4033:      case S_INT: {
   5943         -: 4034:          u64 v;
   5944     #####: 4035:          if (ctx->nibble == lowNbl) {
   5945 branch  0 never executed
   5946 branch  1 never executed
   5947     #####: 4036:            v = netTypeVarintToUint((u8**)data);
   5948 call    0 never executed
   5949         -: 4037:          }
   5950         -: 4038:          else {
   5951         -: 4039:            // high nibble
   5952     #####: 4040:            readTypeInHighNbl;
   5953 branch  0 never executed
   5954 branch  1 never executed
   5955     #####: 4041:            v = varintToUint(data);
   5956 call    0 never executed
   5957         -: 4042:          }
   5958     #####: 4043:          v  = (v >> 1) ^ (~(v & 1) + 1);
   5959     #####: 4044:          io = allocSInt(v);
   5960 call    0 never executed
   5961     #####: 4045:          sArrayPushTiny(array, (smallt *) io);
   5962 call    0 never executed
   5963         -: 4046:        }
   5964     #####: 4047:        break;
   5965         -: 4048:      case S_STRING:
   5966     #####: 4049:        if (ctx->nibble == lowNbl) {
   5967 branch  0 never executed
   5968 branch  1 never executed
   5969     #####: 4050:          readTypeOnly;
   5970         -: 4051:        }
   5971         -: 4052:        else {
   5972         -: 4053:          // high nibble
   5973     #####: 4054:          readTypeInHighNbl;
   5974 branch  0 never executed
   5975 branch  1 never executed
   5976         -: 4055:        }
   5977     #####: 4056:        s      = (char *)(*data);
   5978     #####: 4057:        *data += strlen(s)+1;
   5979     #####: 4058:        so     = allocSStringTiny(s);
   5980 call    0 never executed
   5981     #####: 4059:        sArrayPushTiny(array, (smallt *) so);
   5982 call    0 never executed
   5983     #####: 4060:        break;
   5984         -: 4061:      case S_ARRAY:
   5985     #####: 4062:        a = NULL;
   5986     #####: 4063:        arrayNetDeserialLevel2(&a, data, ctx, /*packed=*/false);
   5987 call    0 never executed
   5988     #####: 4064:        sArrayPushTiny(array, (smallt *) a);
   5989 call    0 never executed
   5990     #####: 4065:        break;
   5991         -: 4066:      case S_BYTES:
   5992     #####: 4067:        B      = allocSBytes();
   5993 call    0 never executed
   5994     #####: 4068:        if (ctx->nibble == lowNbl) {
   5995 branch  0 never executed
   5996 branch  1 never executed
   5997     #####: 4069:          count  = netTypeVarintToUint((u8**)data);
   5998 call    0 never executed
   5999         -: 4070:        }
   6000         -: 4071:        else {
   6001         -: 4072:          // high nibble
   6002     #####: 4073:          readTypeInHighNbl;
   6003 branch  0 never executed
   6004 branch  1 never executed
   6005     #####: 4074:          count  = varintToUint((u8**)data);
   6006 call    0 never executed
   6007         -: 4075:        }
   6008     #####: 4076:        sBytesPushBuffer(&B, *data, count);
   6009 call    0 never executed
   6010     #####: 4077:        *data += count;
   6011     #####: 4078:        sArrayPushTiny(array, (smallt *) B);
   6012 call    0 never executed
   6013     #####: 4079:        break;
   6014         -: 4080:      case UNIFORM_DICT:
   6015     #####: 4081:        d = NULL;
   6016     #####: 4082:        uniformDictNetDeserialLevel2(&d, data, ctx, /*packed=*/false);
   6017 call    0 never executed
   6018     #####: 4083:        sArrayPushTiny(array, (smallt *) d);
   6019 call    0 never executed
   6020     #####: 4084:        break;
   6021         -: 4085:      case UNIFORM_ARRAY:
   6022     #####: 4086:        a = NULL;
   6023     #####: 4087:        uniformArrayNetDeserialLevel2(&a, data, ctx, /*packed=*/false);
   6024 call    0 never executed
   6025     #####: 4088:        sArrayPushTiny(array, (smallt *) a);
   6026 call    0 never executed
   6027     #####: 4089:        break;
   6028         -: 4090:    }
   6029         -: 4091:  }
   6030         -: 4092:}
   6031         -: 4093:
   6032 function uniformArrayNetDeserialLevel2 called 0 returned 0% blocks executed 0%
   6033     #####: 4094:internal void uniformArrayNetDeserialLevel2(sArrayt **array, u8 **data, contextt *ctx, bool packed) {
   6034     #####: 4095:  sUndefinedt *u = NULL;
   6035     #####: 4096:  sBoolt *bo = NULL;
   6036     #####: 4097:  double *D = NULL;
   6037     #####: 4098:  sDoublet *Do = NULL;
   6038     #####: 4099:  sDictt *d = NULL;
   6039     #####: 4100:  sIntt *io = NULL;
   6040     #####: 4101:  char *s = NULL;
   6041     #####: 4102:  sStringt *so = NULL;
   6042     #####: 4103:  sArrayt *a = NULL;
   6043     #####: 4104:  sBytest *B = NULL;
   6044         -: 4105:  uint32_t count;
   6045         -: 4106:  uint32_t arrayCount;
   6046         -: 4107:  u8 type;
   6047         -: 4108:
   6048     #####: 4109:  if (packed) {
   6049 branch  0 never executed
   6050 branch  1 never executed
   6051     #####: 4110:    type = (**data) & 0xF;
   6052     #####: 4111:    arrayCount = netTypeVarintToUint(data);
   6053 call    0 never executed
   6054         -: 4112:  }
   6055         -: 4113:  else {
   6056     #####: 4114:    if (ctx->nibble == lowNbl) {
   6057 branch  0 never executed
   6058 branch  1 never executed
   6059     #####: 4115:      type = (**data) >> 4;
   6060     #####: 4116:      (*data)++;
   6061     #####: 4117:      arrayCount = varintToUint(data);
   6062 call    0 never executed
   6063         -: 4118:    }
   6064         -: 4119:    else {
   6065     #####: 4120:      readTypeInHighNbl;
   6066 branch  0 never executed
   6067 branch  1 never executed
   6068     #####: 4121:      type = (**data) & 0xF;
   6069     #####: 4122:      arrayCount = netTypeVarintToUint(data);
   6070 call    0 never executed
   6071         -: 4123:    }
   6072         -: 4124:  }
   6073         -: 4125:
   6074     #####: 4126:  if (!arrayCount) {
   6075 branch  0 never executed
   6076 branch  1 never executed
   6077     #####: 4127:    *array = allocSArray();;
   6078 call    0 never executed
   6079     #####: 4128:    ret;
   6080         -: 4129:  }
   6081         -: 4130:
   6082     #####: 4131:  switch(type) {
   6083 branch  0 never executed
   6084 branch  1 never executed
   6085 branch  2 never executed
   6086 branch  3 never executed
   6087 branch  4 never executed
   6088 branch  5 never executed
   6089 branch  6 never executed
   6090 branch  7 never executed
   6091 branch  8 never executed
   6092 branch  9 never executed
   6093 branch 10 never executed
   6094         -: 4132:    case S_UNDEFINED:
   6095     #####: 4133:      loop(arrayCount) {
   6096 branch  0 never executed
   6097 branch  1 never executed
   6098     #####: 4134:        u = allocSUndefined();
   6099 call    0 never executed
   6100     #####: 4135:        sArrayPushTiny(array, (smallt *) u);
   6101 call    0 never executed
   6102         -: 4136:      }
   6103     #####: 4137:      break;
   6104         -: 4138:    case S_BOOL:
   6105     #####: 4139:      loop(arrayCount) {
   6106 branch  0 never executed
   6107 branch  1 never executed
   6108     #####: 4140:        if (!ctx->boolAddr) {
   6109 branch  0 never executed
   6110 branch  1 never executed
   6111     #####: 4141:          read8bPackedBool;
   6112     #####: 4142:          ctx->boolShift = 0;
   6113         -: 4143:        }
   6114     #####: 4144:        if (ctx->boolShift == 8) {
   6115 branch  0 never executed
   6116 branch  1 never executed
   6117     #####: 4145:          read8bPackedBool;
   6118     #####: 4146:          bo = allocSBool((*ctx->boolAddr) & 0x1);
   6119 call    0 never executed
   6120         -: 4147:        }
   6121         -: 4148:        else {
   6122     #####: 4149:          bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   6123 call    0 never executed
   6124         -: 4150:        }
   6125     #####: 4151:        sArrayPushTiny(array, (smallt *) bo);
   6126 call    0 never executed
   6127         -: 4152:      }
   6128     #####: 4153:      break;
   6129         -: 4154:    case S_DICT:
   6130     #####: 4155:      loop(arrayCount) {
   6131 branch  0 never executed
   6132 branch  1 never executed
   6133     #####: 4156:        d = NULL;
   6134     #####: 4157:        dictNetDeserialLevel2(&d, data, ctx, /*packed=*/true);
   6135 call    0 never executed
   6136     #####: 4158:        sArrayPushTiny(array, (smallt *) d);
   6137 call    0 never executed
   6138         -: 4159:      }
   6139     #####: 4160:      break;
   6140         -: 4161:    case S_DOUBLE:
   6141     #####: 4162:      loop(arrayCount) {
   6142 branch  0 never executed
   6143 branch  1 never executed
   6144     #####: 4163:        D      = (double *)(*data);
   6145     #####: 4164:        *data += sizeof(double);
   6146     #####: 4165:        Do     = allocSDouble(*D);
   6147 call    0 never executed
   6148     #####: 4166:        sArrayPushTiny(array, (smallt *) Do);
   6149 call    0 never executed
   6150         -: 4167:      }
   6151     #####: 4168:      break;
   6152         -: 4169:    case S_INT:
   6153     #####: 4170:      loop(arrayCount) {
   6154 branch  0 never executed
   6155 branch  1 never executed
   6156     #####: 4171:        u64 v = varintToUint(data);
   6157 call    0 never executed
   6158     #####: 4172:        v     = (v >> 1) ^ (~(v & 1) + 1);
   6159     #####: 4173:        io    = allocSInt(v);
   6160 call    0 never executed
   6161     #####: 4174:        sArrayPushTiny(array, (smallt *) io);
   6162 call    0 never executed
   6163         -: 4175:      }
   6164     #####: 4176:      break;
   6165         -: 4177:    case S_STRING:
   6166     #####: 4178:      loop(arrayCount) {
   6167 branch  0 never executed
   6168 branch  1 never executed
   6169     #####: 4179:        s      = (char *)(*data);
   6170     #####: 4180:        *data += strlen(s)+1;
   6171     #####: 4181:        so     = allocSStringTiny(s);
   6172 call    0 never executed
   6173     #####: 4182:        sArrayPushTiny(array, (smallt *) so);
   6174 call    0 never executed
   6175         -: 4183:      }
   6176     #####: 4184:      break;
   6177         -: 4185:    case S_ARRAY:
   6178     #####: 4186:      loop(arrayCount) {
   6179 branch  0 never executed
   6180 branch  1 never executed
   6181     #####: 4187:        a = NULL;
   6182     #####: 4188:        arrayNetDeserialLevel2(&a, data, ctx, /*packed=*/true);
   6183 call    0 never executed
   6184     #####: 4189:        sArrayPushTiny(array, (smallt *) a);
   6185 call    0 never executed
   6186         -: 4190:      }
   6187     #####: 4191:      break;
   6188         -: 4192:    case S_BYTES:
   6189     #####: 4193:      loop(arrayCount) {
   6190 branch  0 never executed
   6191 branch  1 never executed
   6192     #####: 4194:        B      = allocSBytes();
   6193 call    0 never executed
   6194     #####: 4195:        count  = varintToUint((u8**)data);
   6195 call    0 never executed
   6196     #####: 4196:        sBytesPushBuffer(&B, *data, count);
   6197 call    0 never executed
   6198     #####: 4197:        *data += count;
   6199     #####: 4198:        sArrayPushTiny(array, (smallt *) B);
   6200 call    0 never executed
   6201         -: 4199:      }
   6202     #####: 4200:      break;
   6203         -: 4201:    case UNIFORM_DICT:
   6204     #####: 4202:      loop(arrayCount) {
   6205 branch  0 never executed
   6206 branch  1 never executed
   6207     #####: 4203:        d = NULL;
   6208     #####: 4204:        uniformDictNetDeserialLevel2(&d, data, ctx, /*packed=*/true);
   6209 call    0 never executed
   6210     #####: 4205:        sArrayPushTiny(array, (smallt *) d);
   6211 call    0 never executed
   6212         -: 4206:      }
   6213     #####: 4207:      break;
   6214         -: 4208:    case UNIFORM_ARRAY:
   6215     #####: 4209:      loop(arrayCount) {
   6216 branch  0 never executed
   6217 branch  1 never executed
   6218     #####: 4210:        a = NULL;
   6219     #####: 4211:        uniformArrayNetDeserialLevel2(&a, data, ctx, /*packed=*/true);
   6220 call    0 never executed
   6221     #####: 4212:        sArrayPushTiny(array, (smallt *) a);
   6222 call    0 never executed
   6223         -: 4213:      }
   6224     #####: 4214:      break;
   6225         -: 4215:  }
   6226         -: 4216:}
   6227         -: 4217:
   6228 function deserialNetSerialLevel2 called 0 returned 0% blocks executed 0%
   6229     #####: 4218:internal smallJsont* deserialNetSerialLevel2(smallJsont *self, smallBytest *data) {
   6230         -: 4219:
   6231     #####: 4220:  if (!data or !data->B or !data->B->count) {
   6232 branch  0 never executed
   6233 branch  1 never executed
   6234 branch  2 never executed
   6235 branch  3 never executed
   6236 branch  4 never executed
   6237 branch  5 never executed
   6238     #####: 4221:    ret self;
   6239         -: 4222:  }
   6240         -: 4223:
   6241     #####: 4224:  smallt *o = netDeserialLevel2(data->B);
   6242 call    0 never executed
   6243         -: 4225:
   6244     #####: 4226:  if (!o) {
   6245 branch  0 never executed
   6246 branch  1 never executed
   6247     #####: 4227:    ret self;
   6248         -: 4228:  }
   6249         -: 4229:
   6250     #####: 4230:  freeG(self);
   6251 call    0 never executed
   6252         -: 4231:
   6253     #####: 4232:  setsoG(self, o);
   6254 call    0 never executed
   6255         -: 4233:
   6256     #####: 4234:  ret self;
   6257         -: 4235:}
   6258         -: 4236:
   6259         -: 4237:// level 3
   6260         -: 4238:// like level 2, elements of identical type in a row are packed
   6261         -: 4239:
   6262         -: 4240:/**
   6263         -: 4241: * deserializer top function
   6264         -: 4242: */
   6265 function netDeserial called 86 returned 100% blocks executed 85%
   6266        86: 4243:internal smallt* netDeserial(sBytest *obj) {
   6267        86: 4244:  smallt   *r = NULL;
   6268        86: 4245:  double   *D = NULL;
   6269        86: 4246:  char     *s = NULL;
   6270        86: 4247:  sBytest  *B = NULL;
   6271         -: 4248:  uint32_t count;
   6272        86: 4249:  char     *data  = NULL;
   6273        86: 4250:  contextt ctx = {.nibble=lowNbl, .nblAddr=NULL, .boolShift = 0, .boolAddr=NULL};
   6274         -: 4251:
   6275        86: 4252:  switch(obj->data & 0xF) {
   6276 branch  0 taken 1%
   6277 branch  1 taken 1%
   6278 branch  2 taken 30%
   6279 branch  3 taken 1%
   6280 branch  4 taken 3%
   6281 branch  5 taken 1%
   6282 branch  6 taken 30%
   6283 branch  7 taken 0%
   6284 branch  8 taken 16%
   6285 branch  9 taken 15%
   6286 branch 10 taken 0%
   6287         -: 4253:    case S_UNDEFINED:
   6288         1: 4254:      r = (smallt *) allocSUndefined();
   6289 call    0 returned 100%
   6290         1: 4255:      break;
   6291         -: 4256:    case S_BOOL:
   6292         1: 4257:      r = (smallt *) allocSBool(obj->data & 0x10);
   6293 call    0 returned 100%
   6294         1: 4258:      break;
   6295         -: 4259:    case S_DICT:
   6296        26: 4260:      data     = (char *)&(obj->data);
   6297         -: 4261:      //debug - ctx.dbuf = (u8*) data;
   6298        26: 4262:      dictNetDeserial((sDictt **)&r, (u8**)&data, &ctx, /*packed=*/false);
   6299 call    0 returned 100%
   6300        26: 4263:      break;
   6301         -: 4264:    case S_DOUBLE:
   6302         1: 4265:      data = &(obj->data)+1;
   6303         1: 4266:      D = (double *)data;
   6304         1: 4267:      r = (smallt *) allocSDouble(*D);
   6305 call    0 returned 100%
   6306         1: 4268:      break;
   6307         -: 4269:    case S_INT:
   6308         3: 4270:      data  = &(obj->data);
   6309         3: 4271:      u64 v = netTypeVarintToUint((u8**)&data);
   6310 call    0 returned 100%
   6311         3: 4272:      v = (v >> 1) ^ (~(v & 1) + 1);
   6312         3: 4273:      r = (smallt *) allocSInt(v);
   6313 call    0 returned 100%
   6314         3: 4274:      break;
   6315         -: 4275:    case S_STRING:
   6316         1: 4276:      s = (char *)&(obj->data)+1;
   6317         1: 4277:      r = (smallt *) allocSStringTiny(s);
   6318 call    0 returned 100%
   6319         1: 4278:      break;
   6320         -: 4279:    case S_ARRAY:
   6321        26: 4280:      data = (char *)&(obj->data);
   6322         -: 4281:      //debug - ctx.dbuf = (u8*) data;
   6323        26: 4282:      arrayNetDeserial((sArrayt **)&r, (u8**)&data, &ctx, /*packed=*/false);
   6324 call    0 returned 100%
   6325        26: 4283:      break;
   6326         -: 4284:    case S_BYTES:
   6327     #####: 4285:      B     = allocSBytes();
   6328 call    0 never executed
   6329     #####: 4286:      data  = &(obj->data);
   6330     #####: 4287:      count = netTypeVarintToUint((u8**)&data);
   6331 call    0 never executed
   6332     #####: 4288:      sBytesPushBuffer(&B, data, count);
   6333 call    0 never executed
   6334     #####: 4289:      r = (smallt *)B;
   6335     #####: 4290:      break;
   6336         -: 4291:    case UNIFORM_DICT:
   6337        14: 4292:      data     = (char *)&(obj->data);
   6338         -: 4293:      //debug - ctx.dbuf = (u8*) data;
   6339        14: 4294:      uniformDictNetDeserial((sDictt **)&r, (u8**)&data, &ctx, /*packed=*/false);
   6340 call    0 returned 100%
   6341        14: 4295:      break;
   6342         -: 4296:    case UNIFORM_ARRAY:
   6343        13: 4297:      data     = (char *)&(obj->data);
   6344         -: 4298:      //debug - ctx.dbuf = (u8*) data;
   6345        13: 4299:      uniformArrayNetDeserial((sArrayt **)&r, (u8**)&data, &ctx, /*packed=*/false);
   6346 call    0 returned 100%
   6347        13: 4300:      break;
   6348         -: 4301:  }
   6349         -: 4302:
   6350        86: 4303:  ret r;
   6351         -: 4304:}
   6352         -: 4305:
   6353         -: 4306:/**
   6354         -: 4307: * deserialize dictionary from data
   6355         -: 4308: *
   6356         -: 4309: * a new dictionary is allocated
   6357         -: 4310: *
   6358         -: 4311: * \param
   6359         -: 4312: *    dict dictionary holding the elements
   6360         -: 4313: *    data serialized dictionary
   6361         -: 4314: */
   6362 function dictNetDeserial called 56 returned 100% blocks executed 84%
   6363        56: 4315:internal void dictNetDeserial(sDictt **dict, u8 **data, contextt *ctx, bool packed) {
   6364        56: 4316:  sUndefinedt *u = NULL;
   6365        56: 4317:  sBoolt *bo = NULL;
   6366        56: 4318:  double *D = NULL;
   6367        56: 4319:  sDoublet *Do = NULL;
   6368        56: 4320:  sDictt *d = NULL;
   6369        56: 4321:  sIntt *io = NULL;
   6370        56: 4322:  char *s = NULL;
   6371        56: 4323:  sStringt *so = NULL;
   6372        56: 4324:  sArrayt *a = NULL;
   6373        56: 4325:  sBytest *B = NULL;
   6374         -: 4326:  uint32_t count;
   6375         -: 4327:  uint32_t dictCount;
   6376         -: 4328:
   6377        56: 4329:  if (packed) {
   6378 branch  0 taken 48% (fallthrough)
   6379 branch  1 taken 52%
   6380        27: 4330:    dictCount = varintToUint(data);
   6381 call    0 returned 100%
   6382         -: 4331:  }
   6383         -: 4332:  else {
   6384        29: 4333:    if (ctx->nibble == lowNbl) {
   6385 branch  0 taken 93% (fallthrough)
   6386 branch  1 taken 7%
   6387        27: 4334:      dictCount = netTypeVarintToUint(data);
   6388 call    0 returned 100%
   6389         -: 4335:    }
   6390         -: 4336:    else {
   6391         -: 4337:      // high nibble
   6392         -: 4338:      // type = *(ctx->dbuf + ctx->nblOffset) >> 4;
   6393         -: 4339:      #define readTypeInHighNbl\
   6394         -: 4340:      ctx->nibble  = lowNbl;\
   6395         -: 4341:      if (ctx->nblAddr == *data)\
   6396         -: 4342:      /* data points to the type, next byte is count */\
   6397         -: 4343:      (*data)++
   6398         2: 4344:      readTypeInHighNbl;
   6399 branch  0 taken 0% (fallthrough)
   6400 branch  1 taken 100%
   6401         2: 4345:      dictCount = varintToUint(data);
   6402 call    0 returned 100%
   6403         -: 4346:    }
   6404         -: 4347:  }
   6405         -: 4348:
   6406        56: 4349:  if (!dictCount) {
   6407 branch  0 taken 18% (fallthrough)
   6408 branch  1 taken 82%
   6409        10: 4350:    *dict = allocSDict();
   6410 call    0 returned 100%
   6411        66: 4351:    ret;
   6412         -: 4352:  }
   6413         -: 4353:
   6414        46: 4354:  bool inPack = false;
   6415         -: 4355:  u8 packedType;
   6416         -: 4356:  size_t packCount;
   6417       209: 4357:  loop(dictCount) {
   6418 branch  0 taken 78%
   6419 branch  1 taken 22% (fallthrough)
   6420       163: 4358:    char *key  = (char*)*data;
   6421       163: 4359:    *data     += strlen(key)+1;
   6422         -: 4360:    char type;
   6423       163: 4361:    if (inPack) {
   6424 branch  0 taken 23% (fallthrough)
   6425 branch  1 taken 77%
   6426        38: 4362:      type = packedType;
   6427         -: 4363:    }
   6428         -: 4364:    else {
   6429       125: 4365:      if (ctx->nibble == lowNbl) {
   6430 branch  0 taken 66% (fallthrough)
   6431 branch  1 taken 34%
   6432        83: 4366:        type = (**data) & 0xF;
   6433         -: 4367:      }
   6434         -: 4368:      else {
   6435         -: 4369:        // high nibble
   6436        42: 4370:        type = (*ctx->nblAddr) >> 4;
   6437         -: 4371:      }
   6438         -: 4372:    }
   6439         -: 4373:
   6440       163: 4374:    switch(type) {
   6441 branch  0 taken 18%
   6442 branch  1 taken 19%
   6443 branch  2 taken 1%
   6444 branch  3 taken 1%
   6445 branch  4 taken 15%
   6446 branch  5 taken 9%
   6447 branch  6 taken 2%
   6448 branch  7 taken 1%
   6449 branch  8 taken 9%
   6450 branch  9 taken 6%
   6451 branch 10 taken 5%
   6452 branch 11 taken 5%
   6453 branch 12 taken 5%
   6454 branch 13 taken 0%
   6455 branch 14 taken 2%
   6456 branch 15 taken 2%
   6457 branch 16 taken 0%
   6458         -: 4375:      case S_UNDEFINED:
   6459        29: 4376:        if (ctx->nibble == lowNbl) {
   6460 branch  0 taken 93% (fallthrough)
   6461 branch  1 taken 7%
   6462         -: 4377:          #define readTypeOnly\
   6463         -: 4378:          ctx->nibble  = highNbl;\
   6464         -: 4379:          ctx->nblAddr = *data;\
   6465         -: 4380:          (*data)++
   6466        27: 4381:          readTypeOnly;
   6467         -: 4382:        }
   6468         -: 4383:        else {
   6469         -: 4384:          // high nibble
   6470         2: 4385:          readTypeInHighNbl;
   6471 branch  0 taken 0% (fallthrough)
   6472 branch  1 taken 100%
   6473         -: 4386:        }
   6474        29: 4387:        u = allocSUndefined();
   6475 call    0 returned 100%
   6476        29: 4388:        sDictPushTiny(dict, key, (smallt *) u);
   6477 call    0 returned 100%
   6478        29: 4389:        break;
   6479         -: 4390:      case S_BOOL:
   6480        31: 4391:        if (!ctx->boolAddr) {
   6481 branch  0 taken 16% (fallthrough)
   6482 branch  1 taken 84%
   6483         -: 4392:          // new packed bools
   6484         5: 4393:          if (ctx->nibble == lowNbl) {
   6485 branch  0 taken 60% (fallthrough)
   6486 branch  1 taken 40%
   6487         -: 4394:            #define read4bPackedBool\
   6488         -: 4395:            ctx->boolShift  = 5;\
   6489         -: 4396:            ctx->boolAddr   = *data;\
   6490         -: 4397:            (*data)++
   6491         3: 4398:            read4bPackedBool;
   6492         3: 4399:            bo = allocSBool((*ctx->boolAddr) & 0x10);
   6493 call    0 returned 100%
   6494         -: 4400:          }
   6495         -: 4401:          else {
   6496         -: 4402:            // high nibble
   6497         2: 4403:            readTypeInHighNbl;
   6498 branch  0 taken 0% (fallthrough)
   6499 branch  1 taken 100%
   6500         -: 4404:            #define read8bPackedBool\
   6501         -: 4405:            ctx->boolShift  = 1;\
   6502         -: 4406:            ctx->boolAddr   = *data;\
   6503         -: 4407:            (*data)++
   6504         2: 4408:            read8bPackedBool;
   6505         2: 4409:            bo = allocSBool((*ctx->boolAddr) & 0x1);
   6506 call    0 returned 100%
   6507         -: 4410:          }
   6508         -: 4411:        }
   6509         -: 4412:        else {
   6510         -: 4413:          // there was a bool before this one, read bits in nibbles
   6511        26: 4414:          if (ctx->nibble == lowNbl) {
   6512 branch  0 taken 58% (fallthrough)
   6513 branch  1 taken 42%
   6514        15: 4415:            if (ctx->boolShift == 8) {
   6515 branch  0 taken 7% (fallthrough)
   6516 branch  1 taken 93%
   6517         1: 4416:              read4bPackedBool;
   6518         1: 4417:              bo = allocSBool((*ctx->boolAddr) & 0x10);
   6519 call    0 returned 100%
   6520         -: 4418:            }
   6521         -: 4419:            else {
   6522        14: 4420:              readTypeOnly;
   6523        14: 4421:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   6524 call    0 returned 100%
   6525         -: 4422:            }
   6526         -: 4423:          }
   6527         -: 4424:          else {
   6528         -: 4425:            // high nibble
   6529        11: 4426:            readTypeInHighNbl;
   6530 branch  0 taken 0% (fallthrough)
   6531 branch  1 taken 100%
   6532        11: 4427:            if (ctx->boolShift == 8) {
   6533 branch  0 taken 18% (fallthrough)
   6534 branch  1 taken 82%
   6535         2: 4428:              read8bPackedBool;
   6536         2: 4429:              bo = allocSBool((*ctx->boolAddr) & 0x1);
   6537 call    0 returned 100%
   6538         -: 4430:            }
   6539         -: 4431:            else {
   6540         -: 4432:              // high nibble
   6541         9: 4433:              readTypeInHighNbl;
   6542 branch  0 taken 0% (fallthrough)
   6543 branch  1 taken 100%
   6544         9: 4434:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   6545 call    0 returned 100%
   6546         -: 4435:            }
   6547         -: 4436:          }
   6548         -: 4437:        }
   6549        31: 4438:        sDictPushTiny(dict, key, (smallt *) bo);
   6550 call    0 returned 100%
   6551        31: 4439:        break;
   6552         -: 4440:      case S_DICT:
   6553         1: 4441:        d = NULL;
   6554         1: 4442:        dictNetDeserial(&d, data, ctx, /*packed=*/false);
   6555 call    0 returned 100%
   6556         1: 4443:        sDictPushTiny(dict, key, (smallt *) d);
   6557 call    0 returned 100%
   6558         1: 4444:        break;
   6559         -: 4445:      case S_DOUBLE:
   6560         2: 4446:        if (ctx->nibble == lowNbl) {
   6561 branch  0 taken 50% (fallthrough)
   6562 branch  1 taken 50%
   6563         1: 4447:          readTypeOnly;
   6564         -: 4448:        }
   6565         -: 4449:        else {
   6566         -: 4450:          // high nibble
   6567         1: 4451:          readTypeInHighNbl;
   6568 branch  0 taken 0% (fallthrough)
   6569 branch  1 taken 100%
   6570         -: 4452:        }
   6571         2: 4453:        D      = (double *)(*data);
   6572         2: 4454:        *data += sizeof(double);
   6573         2: 4455:        Do     = allocSDouble(*D);
   6574 call    0 returned 100%
   6575         2: 4456:        sDictPushTiny(dict, key, (smallt *) Do);
   6576 call    0 returned 100%
   6577         2: 4457:        break;
   6578         -: 4458:      case S_INT: {
   6579         -: 4459:          u64 v;
   6580        24: 4460:          if (ctx->nibble == lowNbl) {
   6581 branch  0 taken 50% (fallthrough)
   6582 branch  1 taken 50%
   6583        12: 4461:            v = netTypeVarintToUint((u8**)data);
   6584 call    0 returned 100%
   6585         -: 4462:          }
   6586         -: 4463:          else {
   6587         -: 4464:            // high nibble
   6588        12: 4465:            readTypeInHighNbl;
   6589 branch  0 taken 0% (fallthrough)
   6590 branch  1 taken 100%
   6591        12: 4466:            v = varintToUint(data);
   6592 call    0 returned 100%
   6593         -: 4467:          }
   6594        24: 4468:          v  = (v >> 1) ^ (~(v & 1) + 1);
   6595        24: 4469:          io = allocSInt(v);
   6596 call    0 returned 100%
   6597        24: 4470:          sDictPushTiny(dict, key, (smallt *) io);
   6598 call    0 returned 100%
   6599         -: 4471:        }
   6600        24: 4472:        break;
   6601         -: 4473:      case S_STRING:
   6602        14: 4474:        if (ctx->nibble == lowNbl) {
   6603 branch  0 taken 93% (fallthrough)
   6604 branch  1 taken 7%
   6605        13: 4475:          readTypeOnly;
   6606         -: 4476:        }
   6607         -: 4477:        else {
   6608         -: 4478:          // high nibble
   6609         1: 4479:          readTypeInHighNbl;
   6610 branch  0 taken 0% (fallthrough)
   6611 branch  1 taken 100%
   6612         -: 4480:        }
   6613        14: 4481:        s      = (char *)(*data);
   6614        14: 4482:        *data += strlen(s)+1;
   6615        14: 4483:        so     = allocSStringTiny(s);
   6616 call    0 returned 100%
   6617        14: 4484:        sDictPushTiny(dict, key, (smallt *) so);
   6618 call    0 returned 100%
   6619        14: 4485:        break;
   6620         -: 4486:      case S_ARRAY:
   6621         3: 4487:        a = NULL;
   6622         3: 4488:        arrayNetDeserial(&a, data, ctx, /*packed=*/false);
   6623 call    0 returned 100%
   6624         3: 4489:        sDictPushTiny(dict, key, (smallt *) a);
   6625 call    0 returned 100%
   6626         3: 4490:        break;
   6627         -: 4491:      case S_BYTES:
   6628         2: 4492:        B      = allocSBytes();
   6629 call    0 returned 100%
   6630         2: 4493:        if (ctx->nibble == lowNbl) {
   6631 branch  0 taken 50% (fallthrough)
   6632 branch  1 taken 50%
   6633         1: 4494:          count  = netTypeVarintToUint((u8**)data);
   6634 call    0 returned 100%
   6635         -: 4495:        }
   6636         -: 4496:        else {
   6637         -: 4497:          // high nibble
   6638         1: 4498:          readTypeInHighNbl;
   6639 branch  0 taken 0% (fallthrough)
   6640 branch  1 taken 100%
   6641         1: 4499:          count  = varintToUint((u8**)data);
   6642 call    0 returned 100%
   6643         -: 4500:        }
   6644         2: 4501:        sBytesPushBuffer(&B, *data, count);
   6645 call    0 returned 100%
   6646         2: 4502:        *data += count;
   6647         2: 4503:        sDictPushTiny(dict, key, (smallt *) B);
   6648 call    0 returned 100%
   6649         2: 4504:        break;
   6650         -: 4505:      case PK_DICT:
   6651        15: 4506:        if (!inPack) {
   6652 branch  0 taken 20% (fallthrough)
   6653 branch  1 taken 80%
   6654         3: 4507:          inPack = true;
   6655         3: 4508:          if (ctx->nibble == lowNbl) {
   6656 branch  0 taken 67% (fallthrough)
   6657 branch  1 taken 33%
   6658         2: 4509:            packCount  = netTypeVarintToUint((u8**)data);
   6659 call    0 returned 100%
   6660         -: 4510:          }
   6661         -: 4511:          else {
   6662         -: 4512:            // high nibble
   6663         1: 4513:            readTypeInHighNbl;
   6664 branch  0 taken 0% (fallthrough)
   6665 branch  1 taken 100%
   6666         1: 4514:            packCount  = varintToUint((u8**)data);
   6667 call    0 returned 100%
   6668         -: 4515:          }
   6669         3: 4516:          packedType = PK_DICT;
   6670         -: 4517:        }
   6671         -: 4518:
   6672        15: 4519:        d = NULL;
   6673        15: 4520:        dictNetDeserial(&d, data, ctx, /*packed=*/true);
   6674 call    0 returned 100%
   6675        15: 4521:        sDictPushTiny(dict, key, (smallt *) d);
   6676 call    0 returned 100%
   6677         -: 4522:        // stop unpacking when packCount == 0
   6678        15: 4523:        packCount--;
   6679        15: 4524:        if (!packCount) inPack = false;
   6680 branch  0 taken 20% (fallthrough)
   6681 branch  1 taken 80%
   6682        15: 4525:        break;
   6683         -: 4526:      case PK_DOUBLE:
   6684        10: 4527:        if (!inPack) {
   6685 branch  0 taken 20% (fallthrough)
   6686 branch  1 taken 80%
   6687         2: 4528:          inPack = true;
   6688         2: 4529:          if (ctx->nibble == lowNbl) {
   6689 branch  0 taken 50% (fallthrough)
   6690 branch  1 taken 50%
   6691         1: 4530:            packCount  = netTypeVarintToUint((u8**)data);
   6692 call    0 returned 100%
   6693         -: 4531:          }
   6694         -: 4532:          else {
   6695         -: 4533:            // high nibble
   6696         1: 4534:            readTypeInHighNbl;
   6697 branch  0 taken 0% (fallthrough)
   6698 branch  1 taken 100%
   6699         1: 4535:            packCount  = varintToUint((u8**)data);
   6700 call    0 returned 100%
   6701         -: 4536:          }
   6702         2: 4537:          packedType = PK_DOUBLE;
   6703         -: 4538:        }
   6704         -: 4539:
   6705        10: 4540:        D      = (double *)(*data);
   6706        10: 4541:        *data += sizeof(double);
   6707        10: 4542:        Do     = allocSDouble(*D);
   6708 call    0 returned 100%
   6709        10: 4543:        sDictPushTiny(dict, key, (smallt *) Do);
   6710 call    0 returned 100%
   6711         -: 4544:        // stop unpacking when packCount == 0
   6712        10: 4545:        packCount--;
   6713        10: 4546:        if (!packCount) inPack = false;
   6714 branch  0 taken 20% (fallthrough)
   6715 branch  1 taken 80%
   6716        10: 4547:        break;
   6717         -: 4548:      case PK_INT:
   6718         8: 4549:        if (!inPack) {
   6719 branch  0 taken 25% (fallthrough)
   6720 branch  1 taken 75%
   6721         2: 4550:          inPack = true;
   6722         2: 4551:          if (ctx->nibble == lowNbl) {
   6723 branch  0 taken 50% (fallthrough)
   6724 branch  1 taken 50%
   6725         1: 4552:            packCount  = netTypeVarintToUint((u8**)data);
   6726 call    0 returned 100%
   6727         -: 4553:          }
   6728         -: 4554:          else {
   6729         -: 4555:            // high nibble
   6730         1: 4556:            readTypeInHighNbl;
   6731 branch  0 taken 0% (fallthrough)
   6732 branch  1 taken 100%
   6733         1: 4557:            packCount  = varintToUint((u8**)data);
   6734 call    0 returned 100%
   6735         -: 4558:          }
   6736         2: 4559:          packedType = PK_INT;
   6737         -: 4560:        }
   6738         -: 4561:
   6739         8: 4562:        u64 v = varintToUint(data);
   6740 call    0 returned 100%
   6741         8: 4563:        v     = (v >> 1) ^ (~(v & 1) + 1);
   6742         8: 4564:        io    = allocSInt(v);
   6743 call    0 returned 100%
   6744         8: 4565:        sDictPushTiny(dict, key, (smallt *) io);
   6745 call    0 returned 100%
   6746         -: 4566:        // stop unpacking when packCount == 0
   6747         8: 4567:        packCount--;
   6748         8: 4568:        if (!packCount) inPack = false;
   6749 branch  0 taken 25% (fallthrough)
   6750 branch  1 taken 75%
   6751         8: 4569:        break;
   6752         -: 4570:      case PK_STRING:
   6753         8: 4571:        if (!inPack) {
   6754 branch  0 taken 25% (fallthrough)
   6755 branch  1 taken 75%
   6756         2: 4572:          inPack = true;
   6757         2: 4573:          if (ctx->nibble == lowNbl) {
   6758 branch  0 taken 50% (fallthrough)
   6759 branch  1 taken 50%
   6760         1: 4574:            packCount  = netTypeVarintToUint((u8**)data);
   6761 call    0 returned 100%
   6762         -: 4575:          }
   6763         -: 4576:          else {
   6764         -: 4577:            // high nibble
   6765         1: 4578:            readTypeInHighNbl;
   6766 branch  0 taken 0% (fallthrough)
   6767 branch  1 taken 100%
   6768         1: 4579:            packCount  = varintToUint((u8**)data);
   6769 call    0 returned 100%
   6770         -: 4580:          }
   6771         2: 4581:          packedType = PK_STRING;
   6772         -: 4582:        }
   6773         -: 4583:
   6774         8: 4584:        s          = (char *)(*data);
   6775         8: 4585:        *data     += strlen(s)+1;
   6776         8: 4586:        so         = allocSStringTiny(s);
   6777 call    0 returned 100%
   6778         8: 4587:        sDictPushTiny(dict, key, (smallt *) so);
   6779 call    0 returned 100%
   6780         -: 4588:        // stop unpacking when packCount == 0
   6781         8: 4589:        packCount--;
   6782         8: 4590:        if (!packCount) inPack = false;
   6783 branch  0 taken 25% (fallthrough)
   6784 branch  1 taken 75%
   6785         8: 4591:        break;
   6786         -: 4592:      case PK_ARRAY:
   6787         8: 4593:        if (!inPack) {
   6788 branch  0 taken 25% (fallthrough)
   6789 branch  1 taken 75%
   6790         2: 4594:          inPack = true;
   6791         2: 4595:          if (ctx->nibble == lowNbl) {
   6792 branch  0 taken 50% (fallthrough)
   6793 branch  1 taken 50%
   6794         1: 4596:            packCount  = netTypeVarintToUint((u8**)data);
   6795 call    0 returned 100%
   6796         -: 4597:          }
   6797         -: 4598:          else {
   6798         -: 4599:            // high nibble
   6799         1: 4600:            readTypeInHighNbl;
   6800 branch  0 taken 0% (fallthrough)
   6801 branch  1 taken 100%
   6802         1: 4601:            packCount  = varintToUint((u8**)data);
   6803 call    0 returned 100%
   6804         -: 4602:          }
   6805         2: 4603:          packedType = PK_ARRAY;
   6806         -: 4604:        }
   6807         -: 4605:
   6808         8: 4606:        a          = NULL;
   6809         8: 4607:        arrayNetDeserial(&a, data, ctx, /*packed=*/true);
   6810 call    0 returned 100%
   6811         8: 4608:        sDictPushTiny(dict, key, (smallt *) a);
   6812 call    0 returned 100%
   6813         -: 4609:        // stop unpacking when packCount == 0
   6814         8: 4610:        packCount--;
   6815         8: 4611:        if (!packCount) inPack = false;
   6816 branch  0 taken 25% (fallthrough)
   6817 branch  1 taken 75%
   6818         8: 4612:        break;
   6819         -: 4613:      case PK_BYTES:
   6820     #####: 4614:        if (!inPack) {
   6821 branch  0 never executed
   6822 branch  1 never executed
   6823     #####: 4615:          inPack = true;
   6824     #####: 4616:          if (ctx->nibble == lowNbl) {
   6825 branch  0 never executed
   6826 branch  1 never executed
   6827     #####: 4617:            packCount  = netTypeVarintToUint((u8**)data);
   6828 call    0 never executed
   6829         -: 4618:          }
   6830         -: 4619:          else {
   6831         -: 4620:            // high nibble
   6832     #####: 4621:            readTypeInHighNbl;
   6833 branch  0 never executed
   6834 branch  1 never executed
   6835     #####: 4622:            packCount  = varintToUint((u8**)data);
   6836 call    0 never executed
   6837         -: 4623:          }
   6838     #####: 4624:          packedType = PK_BYTES;
   6839         -: 4625:        }
   6840         -: 4626:
   6841     #####: 4627:        B          = allocSBytes();
   6842 call    0 never executed
   6843     #####: 4628:        count      = varintToUint((u8**)data);
   6844 call    0 never executed
   6845     #####: 4629:        sBytesPushBuffer(&B, *data, count);
   6846 call    0 never executed
   6847     #####: 4630:        *data     += count;
   6848     #####: 4631:        sDictPushTiny(dict, key, (smallt *) B);
   6849 call    0 never executed
   6850         -: 4632:        // stop unpacking when packCount == 0
   6851     #####: 4633:        packCount--;
   6852     #####: 4634:        if (!packCount) inPack = false;
   6853 branch  0 never executed
   6854 branch  1 never executed
   6855     #####: 4635:        break;
   6856         -: 4636:      case UNIFORM_DICT:
   6857         4: 4637:        d = NULL;
   6858         4: 4638:        uniformDictNetDeserial(&d, data, ctx, /*packed=*/false);
   6859 call    0 returned 100%
   6860         4: 4639:        sDictPushTiny(dict, key, (smallt *) d);
   6861 call    0 returned 100%
   6862         4: 4640:        break;
   6863         -: 4641:      case UNIFORM_ARRAY:
   6864         4: 4642:        a = NULL;
   6865         4: 4643:        uniformArrayNetDeserial(&a, data, ctx, /*packed=*/false);
   6866 call    0 returned 100%
   6867         4: 4644:        sDictPushTiny(dict, key, (smallt *) a);
   6868 call    0 returned 100%
   6869         4: 4645:        break;
   6870         -: 4646:    }
   6871         -: 4647:  }
   6872         -: 4648:}
   6873         -: 4649:
   6874         -: 4650:/**
   6875         -: 4651: * deserialize dictionary from data
   6876         -: 4652: *
   6877         -: 4653: * a new dictionary is allocated
   6878         -: 4654: *
   6879         -: 4655: * \param
   6880         -: 4656: *    dict dictionary holding the elements
   6881         -: 4657: *    data serialized dictionary
   6882         -: 4658: */
   6883 function uniformDictNetDeserial called 27 returned 100% blocks executed 97%
   6884        27: 4659:internal void uniformDictNetDeserial(sDictt **dict, u8 **data, contextt *ctx, bool packed) {
   6885        27: 4660:  sUndefinedt *u = NULL;
   6886        27: 4661:  sBoolt *bo = NULL;
   6887        27: 4662:  double *D = NULL;
   6888        27: 4663:  sDoublet *Do = NULL;
   6889        27: 4664:  sDictt *d = NULL;
   6890        27: 4665:  sIntt *io = NULL;
   6891        27: 4666:  char *s = NULL;
   6892        27: 4667:  sStringt *so = NULL;
   6893        27: 4668:  sArrayt *a = NULL;
   6894        27: 4669:  sBytest *B = NULL;
   6895         -: 4670:  uint32_t count;
   6896         -: 4671:  uint32_t dictCount;
   6897         -: 4672:  u8 type;
   6898         -: 4673:
   6899        27: 4674:  if (packed) {
   6900 branch  0 taken 15% (fallthrough)
   6901 branch  1 taken 85%
   6902         4: 4675:    type = (**data) & 0xF;
   6903         4: 4676:    dictCount = netTypeVarintToUint(data);
   6904 call    0 returned 100%
   6905         -: 4677:  }
   6906         -: 4678:  else {
   6907        23: 4679:    if (ctx->nibble == lowNbl) {
   6908 branch  0 taken 91% (fallthrough)
   6909 branch  1 taken 9%
   6910        21: 4680:      type = (**data) >> 4;
   6911        21: 4681:      (*data)++;
   6912        21: 4682:      dictCount = varintToUint(data);
   6913 call    0 returned 100%
   6914         -: 4683:    }
   6915         -: 4684:    else {
   6916         2: 4685:      readTypeInHighNbl;
   6917 branch  0 taken 0% (fallthrough)
   6918 branch  1 taken 100%
   6919         2: 4686:      type = (**data) & 0xF;
   6920         2: 4687:      dictCount = netTypeVarintToUint(data);
   6921 call    0 returned 100%
   6922         -: 4688:    }
   6923         -: 4689:  }
   6924         -: 4690:
   6925        27: 4691:  if (!dictCount) {
   6926 branch  0 taken 7% (fallthrough)
   6927 branch  1 taken 93%
   6928         2: 4692:    *dict = allocSDict();
   6929 call    0 returned 100%
   6930        29: 4693:    ret;
   6931         -: 4694:  }
   6932         -: 4695:
   6933         -: 4696:
   6934        25: 4697:  switch(type) {
   6935 branch  0 taken 4%
   6936 branch  1 taken 16%
   6937 branch  2 taken 4%
   6938 branch  3 taken 4%
   6939 branch  4 taken 36%
   6940 branch  5 taken 20%
   6941 branch  6 taken 4%
   6942 branch  7 taken 4%
   6943 branch  8 taken 4%
   6944 branch  9 taken 4%
   6945 branch 10 taken 0%
   6946         -: 4698:    case S_UNDEFINED:
   6947         7: 4699:      loop(dictCount) {
   6948 branch  0 taken 86%
   6949 branch  1 taken 14% (fallthrough)
   6950         6: 4700:        char *key  = (char*)*data;
   6951         6: 4701:        *data     += strlen(key)+1;
   6952         6: 4702:        u = allocSUndefined();
   6953 call    0 returned 100%
   6954         6: 4703:        sDictPushTiny(dict, key, (smallt *) u);
   6955 call    0 returned 100%
   6956         -: 4704:      }
   6957         1: 4705:      break;
   6958         -: 4706:    case S_BOOL:
   6959        19: 4707:      loop(dictCount) {
   6960 branch  0 taken 79%
   6961 branch  1 taken 21% (fallthrough)
   6962        15: 4708:        char *key  = (char*)*data;
   6963        15: 4709:        *data     += strlen(key)+1;
   6964        15: 4710:        if (!ctx->boolAddr) {
   6965 branch  0 taken 20% (fallthrough)
   6966 branch  1 taken 80%
   6967         3: 4711:          read8bPackedBool;
   6968         3: 4712:          ctx->boolShift = 0;
   6969         -: 4713:        }
   6970        15: 4714:        if (ctx->boolShift == 8) {
   6971 branch  0 taken 7% (fallthrough)
   6972 branch  1 taken 93%
   6973         1: 4715:          readTypeInHighNbl;
   6974 branch  0 taken 0% (fallthrough)
   6975 branch  1 taken 100%
   6976         1: 4716:          read8bPackedBool;
   6977         1: 4717:          bo = allocSBool((*ctx->boolAddr) & 0x1);
   6978 call    0 returned 100%
   6979         -: 4718:        }
   6980         -: 4719:        else {
   6981         -: 4720:          // high nibble
   6982        14: 4721:          readTypeInHighNbl;
   6983 branch  0 taken 0% (fallthrough)
   6984 branch  1 taken 100%
   6985        14: 4722:          bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   6986 call    0 returned 100%
   6987         -: 4723:        }
   6988        15: 4724:        sDictPushTiny(dict, key, (smallt *) bo);
   6989 call    0 returned 100%
   6990         -: 4725:      }
   6991         4: 4726:      break;
   6992         -: 4727:    case S_DICT:
   6993         3: 4728:      loop(dictCount) {
   6994 branch  0 taken 67%
   6995 branch  1 taken 33% (fallthrough)
   6996         2: 4729:        char *key  = (char*)*data;
   6997         2: 4730:        *data     += strlen(key)+1;
   6998         2: 4731:        d          = NULL;
   6999         2: 4732:        dictNetDeserial(&d, data, ctx, /*packed=*/true);
   7000 call    0 returned 100%
   7001         2: 4733:        sDictPushTiny(dict, key, (smallt *) d);
   7002 call    0 returned 100%
   7003         -: 4734:      }
   7004         1: 4735:      break;
   7005         -: 4736:    case S_DOUBLE:
   7006         4: 4737:      loop(dictCount) {
   7007 branch  0 taken 75%
   7008 branch  1 taken 25% (fallthrough)
   7009         3: 4738:        char *key  = (char*)*data;
   7010         3: 4739:        *data     += strlen(key)+1;
   7011         3: 4740:        D          = (double *)(*data);
   7012         3: 4741:        *data     += sizeof(double);
   7013         3: 4742:        Do         = allocSDouble(*D);
   7014 call    0 returned 100%
   7015         3: 4743:        sDictPushTiny(dict, key, (smallt *) Do);
   7016 call    0 returned 100%
   7017         -: 4744:      }
   7018         1: 4745:      break;
   7019         -: 4746:    case S_INT:
   7020        21: 4747:      loop(dictCount) {
   7021 branch  0 taken 57%
   7022 branch  1 taken 43% (fallthrough)
   7023        12: 4748:        char *key  = (char*)*data;
   7024        12: 4749:        *data     += strlen(key)+1;
   7025        12: 4750:        u64 v      = varintToUint(data);
   7026 call    0 returned 100%
   7027        12: 4751:        v          = (v >> 1) ^ (~(v & 1) + 1);
   7028        12: 4752:        io         = allocSInt(v);
   7029 call    0 returned 100%
   7030        12: 4753:        sDictPushTiny(dict, key, (smallt *) io);
   7031 call    0 returned 100%
   7032         -: 4754:      }
   7033         9: 4755:      break;
   7034         -: 4756:    case S_STRING:
   7035        16: 4757:      loop(dictCount) {
   7036 branch  0 taken 69%
   7037 branch  1 taken 31% (fallthrough)
   7038        11: 4758:        char *key  = (char*)*data;
   7039        11: 4759:        *data     += strlen(key)+1;
   7040        11: 4760:        s          = (char *)(*data);
   7041        11: 4761:        *data     += strlen(s)+1;
   7042        11: 4762:        so         = allocSStringTiny(s);
   7043 call    0 returned 100%
   7044        11: 4763:        sDictPushTiny(dict, key, (smallt *) so);
   7045 call    0 returned 100%
   7046         -: 4764:      }
   7047         5: 4765:      break;
   7048         -: 4766:    case S_ARRAY:
   7049         2: 4767:      loop(dictCount) {
   7050 branch  0 taken 50%
   7051 branch  1 taken 50% (fallthrough)
   7052         1: 4768:        char *key  = (char*)*data;
   7053         1: 4769:        *data     += strlen(key)+1;
   7054         1: 4770:        a          = NULL;
   7055         1: 4771:        arrayNetDeserial(&a, data, ctx, /*packed=*/true);
   7056 call    0 returned 100%
   7057         1: 4772:        sDictPushTiny(dict, key, (smallt *) a);
   7058 call    0 returned 100%
   7059         -: 4773:      }
   7060         1: 4774:      break;
   7061         -: 4775:    case S_BYTES:
   7062         3: 4776:      loop(dictCount) {
   7063 branch  0 taken 67%
   7064 branch  1 taken 33% (fallthrough)
   7065         2: 4777:        char *key  = (char*)*data;
   7066         2: 4778:        *data     += strlen(key)+1;
   7067         2: 4779:        B          = allocSBytes();
   7068 call    0 returned 100%
   7069         2: 4780:        count      = varintToUint((u8**)data);
   7070 call    0 returned 100%
   7071         2: 4781:        sBytesPushBuffer(&B, *data, count);
   7072 call    0 returned 100%
   7073         2: 4782:        *data     += count;
   7074         2: 4783:        sDictPushTiny(dict, key, (smallt *) B);
   7075 call    0 returned 100%
   7076         -: 4784:      }
   7077         1: 4785:      break;
   7078         -: 4786:    case UNIFORM_DICT:
   7079         3: 4787:      loop(dictCount) {
   7080 branch  0 taken 67%
   7081 branch  1 taken 33% (fallthrough)
   7082         2: 4788:        char *key  = (char*)*data;
   7083         2: 4789:        *data     += strlen(key)+1;
   7084         2: 4790:        d          = NULL;
   7085         2: 4791:        uniformDictNetDeserial(&d, data, ctx, /*packed=*/true);
   7086 call    0 returned 100%
   7087         2: 4792:        sDictPushTiny(dict, key, (smallt *) d);
   7088 call    0 returned 100%
   7089         -: 4793:      }
   7090         1: 4794:      break;
   7091         -: 4795:    case UNIFORM_ARRAY:
   7092         2: 4796:      loop(dictCount) {
   7093 branch  0 taken 50%
   7094 branch  1 taken 50% (fallthrough)
   7095         1: 4797:        char *key  = (char*)*data;
   7096         1: 4798:        *data     += strlen(key)+1;
   7097         1: 4799:        a          = NULL;
   7098         1: 4800:        uniformArrayNetDeserial(&a, data, ctx, /*packed=*/true);
   7099 call    0 returned 100%
   7100         1: 4801:        sDictPushTiny(dict, key, (smallt *) a);
   7101 call    0 returned 100%
   7102         -: 4802:      }
   7103         1: 4803:      break;
   7104         -: 4804:  }
   7105         -: 4805:}
   7106         -: 4806:
   7107         -: 4807:/**
   7108         -: 4808: * deserialize array from data
   7109         -: 4809: *
   7110         -: 4810: * a new array is allocated
   7111         -: 4811: *
   7112         -: 4812: * \param
   7113         -: 4813: *    array holding the elements
   7114         -: 4814: *    data serialized dictionary
   7115         -: 4815: */
   7116 function arrayNetDeserial called 53 returned 100% blocks executed 84%
   7117        53: 4816:internal void arrayNetDeserial(sArrayt **array, u8 **data, contextt *ctx, bool packed) {
   7118        53: 4817:  sUndefinedt *u = NULL;
   7119        53: 4818:  sBoolt *bo = NULL;
   7120        53: 4819:  double *D = NULL;
   7121        53: 4820:  sDoublet *Do = NULL;
   7122        53: 4821:  sDictt *d = NULL;
   7123        53: 4822:  sIntt *io = NULL;
   7124        53: 4823:  char *s = NULL;
   7125        53: 4824:  sStringt *so = NULL;
   7126        53: 4825:  sArrayt *a = NULL;
   7127        53: 4826:  sBytest *B = NULL;
   7128         -: 4827:  uint32_t count;
   7129         -: 4828:  uint32_t arrayCount;
   7130         -: 4829:
   7131        53: 4830:  if (packed) {
   7132 branch  0 taken 42% (fallthrough)
   7133 branch  1 taken 58%
   7134        22: 4831:    arrayCount = varintToUint(data);
   7135 call    0 returned 100%
   7136         -: 4832:  }
   7137         -: 4833:  else {
   7138        31: 4834:    if (ctx->nibble == lowNbl) {
   7139 branch  0 taken 90% (fallthrough)
   7140 branch  1 taken 10%
   7141        28: 4835:      arrayCount = netTypeVarintToUint(data);
   7142 call    0 returned 100%
   7143         -: 4836:    }
   7144         -: 4837:    else {
   7145         -: 4838:      // high nibble
   7146         3: 4839:      readTypeInHighNbl;
   7147 branch  0 taken 0% (fallthrough)
   7148 branch  1 taken 100%
   7149         3: 4840:      arrayCount = varintToUint(data);
   7150 call    0 returned 100%
   7151         -: 4841:    }
   7152         -: 4842:  }
   7153         -: 4843:
   7154        53: 4844:  if (!arrayCount) {
   7155 branch  0 taken 4% (fallthrough)
   7156 branch  1 taken 96%
   7157         2: 4845:    *array = allocSArray();;
   7158 call    0 returned 100%
   7159        55: 4846:    ret;
   7160         -: 4847:  }
   7161         -: 4848:
   7162        51: 4849:  bool inPack = false;
   7163         -: 4850:  u8 packedType;
   7164         -: 4851:  size_t packCount;
   7165       216: 4852:  loop(arrayCount) {
   7166 branch  0 taken 76%
   7167 branch  1 taken 24% (fallthrough)
   7168         -: 4853:    char type;
   7169       165: 4854:    if (inPack) {
   7170 branch  0 taken 18% (fallthrough)
   7171 branch  1 taken 82%
   7172        30: 4855:      type = packedType;
   7173         -: 4856:    }
   7174         -: 4857:    else {
   7175       135: 4858:      if (ctx->nibble == lowNbl) {
   7176 branch  0 taken 73% (fallthrough)
   7177 branch  1 taken 27%
   7178        99: 4859:        type = (**data) & 0xF;
   7179         -: 4860:      }
   7180         -: 4861:      else {
   7181         -: 4862:        // high nibble
   7182        36: 4863:        type = (*ctx->nblAddr) >> 4;
   7183         -: 4864:      }
   7184         -: 4865:    }
   7185         -: 4866:
   7186       165: 4867:    switch(type) {
   7187 branch  0 taken 18%
   7188 branch  1 taken 22%
   7189 branch  2 taken 1%
   7190 branch  3 taken 1%
   7191 branch  4 taken 17%
   7192 branch  5 taken 8%
   7193 branch  6 taken 1%
   7194 branch  7 taken 1%
   7195 branch  8 taken 5%
   7196 branch  9 taken 5%
   7197 branch 10 taken 5%
   7198 branch 11 taken 5%
   7199 branch 12 taken 5%
   7200 branch 13 taken 0%
   7201 branch 14 taken 3%
   7202 branch 15 taken 4%
   7203 branch 16 taken 0%
   7204         -: 4868:      case S_UNDEFINED:
   7205        29: 4869:        if (ctx->nibble == lowNbl) {
   7206 branch  0 taken 93% (fallthrough)
   7207 branch  1 taken 7%
   7208        27: 4870:          readTypeOnly;
   7209         -: 4871:        }
   7210         -: 4872:        else {
   7211         -: 4873:          // high nibble
   7212         2: 4874:          readTypeInHighNbl;
   7213 branch  0 taken 0% (fallthrough)
   7214 branch  1 taken 100%
   7215         -: 4875:        }
   7216        29: 4876:        u = allocSUndefined();
   7217 call    0 returned 100%
   7218        29: 4877:        sArrayPushTiny(array, (smallt *) u);
   7219 call    0 returned 100%
   7220        29: 4878:        break;
   7221         -: 4879:      case S_BOOL:
   7222        36: 4880:        if (!ctx->boolAddr) {
   7223 branch  0 taken 22% (fallthrough)
   7224 branch  1 taken 78%
   7225         -: 4881:          // new packed bools
   7226         8: 4882:          if (ctx->nibble == lowNbl) {
   7227 branch  0 taken 63% (fallthrough)
   7228 branch  1 taken 38%
   7229         5: 4883:            read4bPackedBool;
   7230         5: 4884:            bo = allocSBool((*ctx->boolAddr) & 0x10);
   7231 call    0 returned 100%
   7232         -: 4885:          }
   7233         -: 4886:          else {
   7234         -: 4887:            // high nibble
   7235         3: 4888:            readTypeInHighNbl;
   7236 branch  0 taken 0% (fallthrough)
   7237 branch  1 taken 100%
   7238         3: 4889:            read8bPackedBool;
   7239         3: 4890:            bo = allocSBool((*ctx->boolAddr) & 0x1);
   7240 call    0 returned 100%
   7241         -: 4891:          }
   7242         -: 4892:        }
   7243         -: 4893:        else {
   7244         -: 4894:          // there was a bool before this one, read bits in nibbles
   7245        28: 4895:          if (ctx->nibble == lowNbl) {
   7246 branch  0 taken 61% (fallthrough)
   7247 branch  1 taken 39%
   7248        17: 4896:            if (ctx->boolShift == 8) {
   7249 branch  0 taken 12% (fallthrough)
   7250 branch  1 taken 88%
   7251         2: 4897:              read4bPackedBool;
   7252         2: 4898:              bo = allocSBool((*ctx->boolAddr) & 0x10);
   7253 call    0 returned 100%
   7254         -: 4899:            }
   7255         -: 4900:            else {
   7256        15: 4901:              readTypeOnly;
   7257        15: 4902:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   7258 call    0 returned 100%
   7259         -: 4903:            }
   7260         -: 4904:          }
   7261         -: 4905:          else {
   7262         -: 4906:            // high nibble
   7263        11: 4907:            readTypeInHighNbl;
   7264 branch  0 taken 0% (fallthrough)
   7265 branch  1 taken 100%
   7266        11: 4908:            if (ctx->boolShift == 8) {
   7267 branch  0 taken 18% (fallthrough)
   7268 branch  1 taken 82%
   7269         2: 4909:              read8bPackedBool;
   7270         2: 4910:              bo = allocSBool((*ctx->boolAddr) & 0x1);
   7271 call    0 returned 100%
   7272         -: 4911:            }
   7273         -: 4912:            else {
   7274         9: 4913:              bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   7275 call    0 returned 100%
   7276         -: 4914:            }
   7277         -: 4915:          }
   7278         -: 4916:        }
   7279        36: 4917:        sArrayPushTiny(array, (smallt *) bo);
   7280 call    0 returned 100%
   7281        36: 4918:        break;
   7282         -: 4919:      case S_DICT:
   7283         2: 4920:        d = NULL;
   7284         2: 4921:        dictNetDeserial(&d, data, ctx, /*packed=*/false);
   7285 call    0 returned 100%
   7286         2: 4922:        sArrayPushTiny(array, (smallt *) d);
   7287 call    0 returned 100%
   7288         2: 4923:        break;
   7289         -: 4924:      case S_DOUBLE:
   7290         2: 4925:        if (ctx->nibble == lowNbl) {
   7291 branch  0 taken 50% (fallthrough)
   7292 branch  1 taken 50%
   7293         1: 4926:          readTypeOnly;
   7294         -: 4927:        }
   7295         -: 4928:        else {
   7296         -: 4929:          // high nibble
   7297         1: 4930:          readTypeInHighNbl;
   7298 branch  0 taken 0% (fallthrough)
   7299 branch  1 taken 100%
   7300         -: 4931:        }
   7301         2: 4932:        D      = (double *)(*data);
   7302         2: 4933:        *data += sizeof(double);
   7303         2: 4934:        Do     = allocSDouble(*D);
   7304 call    0 returned 100%
   7305         2: 4935:        sArrayPushTiny(array, (smallt *) Do);
   7306 call    0 returned 100%
   7307         2: 4936:        break;
   7308         -: 4937:      case S_INT: {
   7309         -: 4938:          u64 v;
   7310        28: 4939:          if (ctx->nibble == lowNbl) {
   7311 branch  0 taken 86% (fallthrough)
   7312 branch  1 taken 14%
   7313        24: 4940:            v = netTypeVarintToUint((u8**)data);
   7314 call    0 returned 100%
   7315         -: 4941:          }
   7316         -: 4942:          else {
   7317         -: 4943:            // high nibble
   7318         4: 4944:            readTypeInHighNbl;
   7319 branch  0 taken 0% (fallthrough)
   7320 branch  1 taken 100%
   7321         4: 4945:            v = varintToUint(data);
   7322 call    0 returned 100%
   7323         -: 4946:          }
   7324        28: 4947:          v  = (v >> 1) ^ (~(v & 1) + 1);
   7325        28: 4948:          io = allocSInt(v);
   7326 call    0 returned 100%
   7327        28: 4949:          sArrayPushTiny(array, (smallt *) io);
   7328 call    0 returned 100%
   7329         -: 4950:        }
   7330        28: 4951:        break;
   7331         -: 4952:      case S_STRING:
   7332        13: 4953:        if (ctx->nibble == lowNbl) {
   7333 branch  0 taken 69% (fallthrough)
   7334 branch  1 taken 31%
   7335         9: 4954:          readTypeOnly;
   7336         -: 4955:        }
   7337         -: 4956:        else {
   7338         -: 4957:          // high nibble
   7339         4: 4958:          readTypeInHighNbl;
   7340 branch  0 taken 0% (fallthrough)
   7341 branch  1 taken 100%
   7342         -: 4959:        }
   7343        13: 4960:        s      = (char *)(*data);
   7344        13: 4961:        *data += strlen(s)+1;
   7345        13: 4962:        so     = allocSStringTiny(s);
   7346 call    0 returned 100%
   7347        13: 4963:        sArrayPushTiny(array, (smallt *) so);
   7348 call    0 returned 100%
   7349        13: 4964:        break;
   7350         -: 4965:      case S_ARRAY:
   7351         2: 4966:        a = NULL;
   7352         2: 4967:        arrayNetDeserial(&a, data, ctx, /*packed=*/false);
   7353 call    0 returned 100%
   7354         2: 4968:        sArrayPushTiny(array, (smallt *) a);
   7355 call    0 returned 100%
   7356         2: 4969:        break;
   7357         -: 4970:      case S_BYTES:
   7358         2: 4971:        B      = allocSBytes();
   7359 call    0 returned 100%
   7360         2: 4972:        if (ctx->nibble == lowNbl) {
   7361 branch  0 taken 50% (fallthrough)
   7362 branch  1 taken 50%
   7363         1: 4973:          count  = netTypeVarintToUint((u8**)data);
   7364 call    0 returned 100%
   7365         -: 4974:        }
   7366         -: 4975:        else {
   7367         -: 4976:          // high nibble
   7368         1: 4977:          readTypeInHighNbl;
   7369 branch  0 taken 0% (fallthrough)
   7370 branch  1 taken 100%
   7371         1: 4978:          count  = varintToUint((u8**)data);
   7372 call    0 returned 100%
   7373         -: 4979:        }
   7374         2: 4980:        sBytesPushBuffer(&B, *data, count);
   7375 call    0 returned 100%
   7376         2: 4981:        *data += count;
   7377         2: 4982:        sArrayPushTiny(array, (smallt *) B);
   7378 call    0 returned 100%
   7379         2: 4983:        break;
   7380         -: 4984:      case PK_DICT:
   7381         8: 4985:        if (!inPack) {
   7382 branch  0 taken 25% (fallthrough)
   7383 branch  1 taken 75%
   7384         2: 4986:          inPack = true;
   7385         2: 4987:          if (ctx->nibble == lowNbl) {
   7386 branch  0 taken 50% (fallthrough)
   7387 branch  1 taken 50%
   7388         1: 4988:            packCount  = netTypeVarintToUint((u8**)data);
   7389 call    0 returned 100%
   7390         -: 4989:          }
   7391         -: 4990:          else {
   7392         -: 4991:            // high nibble
   7393         1: 4992:            readTypeInHighNbl;
   7394 branch  0 taken 0% (fallthrough)
   7395 branch  1 taken 100%
   7396         1: 4993:            packCount  = varintToUint((u8**)data);
   7397 call    0 returned 100%
   7398         -: 4994:          }
   7399         2: 4995:          packedType = PK_DICT;
   7400         -: 4996:        }
   7401         -: 4997:
   7402         8: 4998:        d = NULL;
   7403         8: 4999:        dictNetDeserial(&d, data, ctx, /*packed=*/true);
   7404 call    0 returned 100%
   7405         8: 5000:        sArrayPushTiny(array, (smallt *) d);
   7406 call    0 returned 100%
   7407         -: 5001:        // stop unpacking when packCount == 0
   7408         8: 5002:        packCount--;
   7409         8: 5003:        if (!packCount) inPack = false;
   7410 branch  0 taken 25% (fallthrough)
   7411 branch  1 taken 75%
   7412         8: 5004:        break;
   7413         -: 5005:      case PK_DOUBLE:
   7414         8: 5006:        if (!inPack) {
   7415 branch  0 taken 25% (fallthrough)
   7416 branch  1 taken 75%
   7417         2: 5007:          inPack = true;
   7418         2: 5008:          if (ctx->nibble == lowNbl) {
   7419 branch  0 taken 50% (fallthrough)
   7420 branch  1 taken 50%
   7421         1: 5009:            packCount  = netTypeVarintToUint((u8**)data);
   7422 call    0 returned 100%
   7423         -: 5010:          }
   7424         -: 5011:          else {
   7425         -: 5012:            // high nibble
   7426         1: 5013:            readTypeInHighNbl;
   7427 branch  0 taken 0% (fallthrough)
   7428 branch  1 taken 100%
   7429         1: 5014:            packCount  = varintToUint((u8**)data);
   7430 call    0 returned 100%
   7431         -: 5015:          }
   7432         2: 5016:          packedType = PK_DOUBLE;
   7433         -: 5017:        }
   7434         -: 5018:
   7435         8: 5019:        D      = (double *)(*data);
   7436         8: 5020:        *data += sizeof(double);
   7437         8: 5021:        Do     = allocSDouble(*D);
   7438 call    0 returned 100%
   7439         8: 5022:        sArrayPushTiny(array, (smallt *) Do);
   7440 call    0 returned 100%
   7441         -: 5023:        // stop unpacking when packCount == 0
   7442         8: 5024:        packCount--;
   7443         8: 5025:        if (!packCount) inPack = false;
   7444 branch  0 taken 25% (fallthrough)
   7445 branch  1 taken 75%
   7446         8: 5026:        break;
   7447         -: 5027:      case PK_INT:
   7448         8: 5028:        if (!inPack) {
   7449 branch  0 taken 25% (fallthrough)
   7450 branch  1 taken 75%
   7451         2: 5029:          inPack = true;
   7452         2: 5030:          if (ctx->nibble == lowNbl) {
   7453 branch  0 taken 50% (fallthrough)
   7454 branch  1 taken 50%
   7455         1: 5031:            packCount  = netTypeVarintToUint((u8**)data);
   7456 call    0 returned 100%
   7457         -: 5032:          }
   7458         -: 5033:          else {
   7459         -: 5034:            // high nibble
   7460         1: 5035:            readTypeInHighNbl;
   7461 branch  0 taken 0% (fallthrough)
   7462 branch  1 taken 100%
   7463         1: 5036:            packCount  = varintToUint((u8**)data);
   7464 call    0 returned 100%
   7465         -: 5037:          }
   7466         2: 5038:          packedType = PK_INT;
   7467         -: 5039:        }
   7468         -: 5040:
   7469         8: 5041:        u64 v = varintToUint(data);
   7470 call    0 returned 100%
   7471         8: 5042:        v     = (v >> 1) ^ (~(v & 1) + 1);
   7472         8: 5043:        io     = allocSInt(v);
   7473 call    0 returned 100%
   7474         8: 5044:        sArrayPushTiny(array, (smallt *) io);
   7475 call    0 returned 100%
   7476         -: 5045:        // stop unpacking when packCount == 0
   7477         8: 5046:        packCount--;
   7478         8: 5047:        if (!packCount) inPack = false;
   7479 branch  0 taken 25% (fallthrough)
   7480 branch  1 taken 75%
   7481         8: 5048:        break;
   7482         -: 5049:      case PK_STRING:
   7483         8: 5050:        if (!inPack) {
   7484 branch  0 taken 25% (fallthrough)
   7485 branch  1 taken 75%
   7486         2: 5051:          inPack = true;
   7487         2: 5052:          if (ctx->nibble == lowNbl) {
   7488 branch  0 taken 50% (fallthrough)
   7489 branch  1 taken 50%
   7490         1: 5053:            packCount  = netTypeVarintToUint((u8**)data);
   7491 call    0 returned 100%
   7492         -: 5054:          }
   7493         -: 5055:          else {
   7494         -: 5056:            // high nibble
   7495         1: 5057:            readTypeInHighNbl;
   7496 branch  0 taken 0% (fallthrough)
   7497 branch  1 taken 100%
   7498         1: 5058:            packCount  = varintToUint((u8**)data);
   7499 call    0 returned 100%
   7500         -: 5059:          }
   7501         2: 5060:          packedType = PK_STRING;
   7502         -: 5061:        }
   7503         -: 5062:
   7504         8: 5063:        s      = (char *)(*data);
   7505         8: 5064:        *data += strlen(s)+1;
   7506         8: 5065:        so     = allocSStringTiny(s);
   7507 call    0 returned 100%
   7508         8: 5066:        sArrayPushTiny(array, (smallt *) so);
   7509 call    0 returned 100%
   7510         -: 5067:        // stop unpacking when packCount == 0
   7511         8: 5068:        packCount--;
   7512         8: 5069:        if (!packCount) inPack = false;
   7513 branch  0 taken 25% (fallthrough)
   7514 branch  1 taken 75%
   7515         8: 5070:        break;
   7516         -: 5071:      case PK_ARRAY:
   7517         8: 5072:        if (!inPack) {
   7518 branch  0 taken 25% (fallthrough)
   7519 branch  1 taken 75%
   7520         2: 5073:          inPack = true;
   7521         2: 5074:          if (ctx->nibble == lowNbl) {
   7522 branch  0 taken 50% (fallthrough)
   7523 branch  1 taken 50%
   7524         1: 5075:            packCount  = netTypeVarintToUint((u8**)data);
   7525 call    0 returned 100%
   7526         -: 5076:          }
   7527         -: 5077:          else {
   7528         -: 5078:            // high nibble
   7529         1: 5079:            readTypeInHighNbl;
   7530 branch  0 taken 0% (fallthrough)
   7531 branch  1 taken 100%
   7532         1: 5080:            packCount  = varintToUint((u8**)data);
   7533 call    0 returned 100%
   7534         -: 5081:          }
   7535         2: 5082:          packedType = PK_ARRAY;
   7536         -: 5083:        }
   7537         -: 5084:
   7538         8: 5085:        a = NULL;
   7539         8: 5086:        arrayNetDeserial(&a, data, ctx, /*packed=*/true);
   7540 call    0 returned 100%
   7541         8: 5087:        sArrayPushTiny(array, (smallt *) a);
   7542 call    0 returned 100%
   7543         -: 5088:        // stop unpacking when packCount == 0
   7544         8: 5089:        packCount--;
   7545         8: 5090:        if (!packCount) inPack = false;
   7546 branch  0 taken 25% (fallthrough)
   7547 branch  1 taken 75%
   7548         8: 5091:        break;
   7549         -: 5092:      case PK_BYTES:
   7550     #####: 5093:        if (!inPack) {
   7551 branch  0 never executed
   7552 branch  1 never executed
   7553     #####: 5094:          inPack = true;
   7554     #####: 5095:          if (ctx->nibble == lowNbl) {
   7555 branch  0 never executed
   7556 branch  1 never executed
   7557     #####: 5096:            packCount  = netTypeVarintToUint((u8**)data);
   7558 call    0 never executed
   7559         -: 5097:          }
   7560         -: 5098:          else {
   7561         -: 5099:            // high nibble
   7562     #####: 5100:            readTypeInHighNbl;
   7563 branch  0 never executed
   7564 branch  1 never executed
   7565     #####: 5101:            packCount  = varintToUint((u8**)data);
   7566 call    0 never executed
   7567         -: 5102:          }
   7568     #####: 5103:          packedType = PK_BYTES;
   7569         -: 5104:        }
   7570         -: 5105:
   7571     #####: 5106:        B      = allocSBytes();
   7572 call    0 never executed
   7573     #####: 5107:        count  = varintToUint((u8**)data);
   7574 call    0 never executed
   7575     #####: 5108:        sBytesPushBuffer(&B, *data, count);
   7576 call    0 never executed
   7577     #####: 5109:        *data += count;
   7578     #####: 5110:        sArrayPushTiny(array, (smallt *) B);
   7579 call    0 never executed
   7580         -: 5111:        // stop unpacking when packCount == 0
   7581     #####: 5112:        packCount--;
   7582     #####: 5113:        if (!packCount) inPack = false;
   7583 branch  0 never executed
   7584 branch  1 never executed
   7585     #####: 5114:        break;
   7586         -: 5115:      case UNIFORM_DICT:
   7587         5: 5116:        d = NULL;
   7588         5: 5117:        uniformDictNetDeserial(&d, data, ctx, /*packed=*/false);
   7589 call    0 returned 100%
   7590         5: 5118:        sArrayPushTiny(array, (smallt *) d);
   7591 call    0 returned 100%
   7592         5: 5119:        break;
   7593         -: 5120:      case UNIFORM_ARRAY:
   7594         6: 5121:        a = NULL;
   7595         6: 5122:        uniformArrayNetDeserial(&a, data, ctx, /*packed=*/false);
   7596 call    0 returned 100%
   7597         6: 5123:        sArrayPushTiny(array, (smallt *) a);
   7598 call    0 returned 100%
   7599         6: 5124:        break;
   7600         -: 5125:    }
   7601         -: 5126:  }
   7602         -: 5127:}
   7603         -: 5128:
   7604 function uniformArrayNetDeserial called 25 returned 100% blocks executed 99%
   7605        25: 5129:internal void uniformArrayNetDeserial(sArrayt **array, u8 **data, contextt *ctx, bool packed) {
   7606        25: 5130:  sUndefinedt *u = NULL;
   7607        25: 5131:  sBoolt *bo = NULL;
   7608        25: 5132:  double *D = NULL;
   7609        25: 5133:  sDoublet *Do = NULL;
   7610        25: 5134:  sDictt *d = NULL;
   7611        25: 5135:  sIntt *io = NULL;
   7612        25: 5136:  char *s = NULL;
   7613        25: 5137:  sStringt *so = NULL;
   7614        25: 5138:  sArrayt *a = NULL;
   7615        25: 5139:  sBytest *B = NULL;
   7616         -: 5140:  uint32_t count;
   7617         -: 5141:  uint32_t arrayCount;
   7618         -: 5142:  u8 type;
   7619         -: 5143:
   7620        25: 5144:  if (packed) {
   7621 branch  0 taken 8% (fallthrough)
   7622 branch  1 taken 92%
   7623         2: 5145:    type = (**data) & 0xF;
   7624         2: 5146:    arrayCount = netTypeVarintToUint(data);
   7625 call    0 returned 100%
   7626         -: 5147:  }
   7627         -: 5148:  else {
   7628        23: 5149:    if (ctx->nibble == lowNbl) {
   7629 branch  0 taken 78% (fallthrough)
   7630 branch  1 taken 22%
   7631        18: 5150:      type = (**data) >> 4;
   7632        18: 5151:      (*data)++;
   7633        18: 5152:      arrayCount = varintToUint(data);
   7634 call    0 returned 100%
   7635         -: 5153:    }
   7636         -: 5154:    else {
   7637         5: 5155:      readTypeInHighNbl;
   7638 branch  0 taken 0% (fallthrough)
   7639 branch  1 taken 100%
   7640         5: 5156:      type = (**data) & 0xF;
   7641         5: 5157:      arrayCount = netTypeVarintToUint(data);
   7642 call    0 returned 100%
   7643         -: 5158:    }
   7644         -: 5159:  }
   7645         -: 5160:
   7646        25: 5161:  if (!arrayCount) {
   7647 branch  0 taken 8% (fallthrough)
   7648 branch  1 taken 92%
   7649         2: 5162:    *array = allocSArray();;
   7650 call    0 returned 100%
   7651        27: 5163:    ret;
   7652         -: 5164:  }
   7653         -: 5165:
   7654        23: 5166:  switch(type) {
   7655 branch  0 taken 4%
   7656 branch  1 taken 9%
   7657 branch  2 taken 4%
   7658 branch  3 taken 4%
   7659 branch  4 taken 48%
   7660 branch  5 taken 4%
   7661 branch  6 taken 13%
   7662 branch  7 taken 4%
   7663 branch  8 taken 4%
   7664 branch  9 taken 4%
   7665 branch 10 taken 0%
   7666         -: 5167:    case S_UNDEFINED:
   7667         7: 5168:      loop(arrayCount) {
   7668 branch  0 taken 86%
   7669 branch  1 taken 14% (fallthrough)
   7670         6: 5169:        u = allocSUndefined();
   7671 call    0 returned 100%
   7672         6: 5170:        sArrayPushTiny(array, (smallt *) u);
   7673 call    0 returned 100%
   7674         -: 5171:      }
   7675         1: 5172:      break;
   7676         -: 5173:    case S_BOOL:
   7677        16: 5174:      loop(arrayCount) {
   7678 branch  0 taken 88%
   7679 branch  1 taken 13% (fallthrough)
   7680        14: 5175:        if (!ctx->boolAddr) {
   7681 branch  0 taken 14% (fallthrough)
   7682 branch  1 taken 86%
   7683         2: 5176:          read8bPackedBool;
   7684         2: 5177:          ctx->boolShift = 0;
   7685         -: 5178:        }
   7686        14: 5179:        if (ctx->boolShift == 8) {
   7687 branch  0 taken 7% (fallthrough)
   7688 branch  1 taken 93%
   7689         1: 5180:          read8bPackedBool;
   7690         1: 5181:          bo = allocSBool((*ctx->boolAddr) & 0x1);
   7691 call    0 returned 100%
   7692         -: 5182:        }
   7693         -: 5183:        else {
   7694        13: 5184:          bo = allocSBool((*ctx->boolAddr) & (0x1 << (ctx->boolShift++)));
   7695 call    0 returned 100%
   7696         -: 5185:        }
   7697        14: 5186:        sArrayPushTiny(array, (smallt *) bo);
   7698 call    0 returned 100%
   7699         -: 5187:      }
   7700         2: 5188:      break;
   7701         -: 5189:    case S_DICT:
   7702         3: 5190:      loop(arrayCount) {
   7703 branch  0 taken 67%
   7704 branch  1 taken 33% (fallthrough)
   7705         2: 5191:        d = NULL;
   7706         2: 5192:        dictNetDeserial(&d, data, ctx, /*packed=*/true);
   7707 call    0 returned 100%
   7708         2: 5193:        sArrayPushTiny(array, (smallt *) d);
   7709 call    0 returned 100%
   7710         -: 5194:      }
   7711         1: 5195:      break;
   7712         -: 5196:    case S_DOUBLE:
   7713         4: 5197:      loop(arrayCount) {
   7714 branch  0 taken 75%
   7715 branch  1 taken 25% (fallthrough)
   7716         3: 5198:        D      = (double *)(*data);
   7717         3: 5199:        *data += sizeof(double);
   7718         3: 5200:        Do     = allocSDouble(*D);
   7719 call    0 returned 100%
   7720         3: 5201:        sArrayPushTiny(array, (smallt *) Do);
   7721 call    0 returned 100%
   7722         -: 5202:      }
   7723         1: 5203:      break;
   7724         -: 5204:    case S_INT:
   7725        49: 5205:      loop(arrayCount) {
   7726 branch  0 taken 78%
   7727 branch  1 taken 22% (fallthrough)
   7728        38: 5206:        u64 v = varintToUint(data);
   7729 call    0 returned 100%
   7730        38: 5207:        v     = (v >> 1) ^ (~(v & 1) + 1);
   7731        38: 5208:        io    = allocSInt(v);
   7732 call    0 returned 100%
   7733        38: 5209:        sArrayPushTiny(array, (smallt *) io);
   7734 call    0 returned 100%
   7735         -: 5210:      }
   7736        11: 5211:      break;
   7737         -: 5212:    case S_STRING:
   7738         4: 5213:      loop(arrayCount) {
   7739 branch  0 taken 75%
   7740 branch  1 taken 25% (fallthrough)
   7741         3: 5214:        s      = (char *)(*data);
   7742         3: 5215:        *data += strlen(s)+1;
   7743         3: 5216:        so     = allocSStringTiny(s);
   7744 call    0 returned 100%
   7745         3: 5217:        sArrayPushTiny(array, (smallt *) so);
   7746 call    0 returned 100%
   7747         -: 5218:      }
   7748         1: 5219:      break;
   7749         -: 5220:    case S_ARRAY:
   7750         8: 5221:      loop(arrayCount) {
   7751 branch  0 taken 63%
   7752 branch  1 taken 38% (fallthrough)
   7753         5: 5222:        a = NULL;
   7754         5: 5223:        arrayNetDeserial(&a, data, ctx, /*packed=*/true);
   7755 call    0 returned 100%
   7756         5: 5224:        sArrayPushTiny(array, (smallt *) a);
   7757 call    0 returned 100%
   7758         -: 5225:      }
   7759         3: 5226:      break;
   7760         -: 5227:    case S_BYTES:
   7761         3: 5228:      loop(arrayCount) {
   7762 branch  0 taken 67%
   7763 branch  1 taken 33% (fallthrough)
   7764         2: 5229:        B      = allocSBytes();
   7765 call    0 returned 100%
   7766         2: 5230:        count  = varintToUint((u8**)data);
   7767 call    0 returned 100%
   7768         2: 5231:        sBytesPushBuffer(&B, *data, count);
   7769 call    0 returned 100%
   7770         2: 5232:        *data += count;
   7771         2: 5233:        sArrayPushTiny(array, (smallt *) B);
   7772 call    0 returned 100%
   7773         -: 5234:      }
   7774         1: 5235:      break;
   7775         -: 5236:    case UNIFORM_DICT:
   7776         3: 5237:      loop(arrayCount) {
   7777 branch  0 taken 67%
   7778 branch  1 taken 33% (fallthrough)
   7779         2: 5238:        d = NULL;
   7780         2: 5239:        uniformDictNetDeserial(&d, data, ctx, /*packed=*/true);
   7781 call    0 returned 100%
   7782         2: 5240:        sArrayPushTiny(array, (smallt *) d);
   7783 call    0 returned 100%
   7784         -: 5241:      }
   7785         1: 5242:      break;
   7786         -: 5243:    case UNIFORM_ARRAY:
   7787         2: 5244:      loop(arrayCount) {
   7788 branch  0 taken 50%
   7789 branch  1 taken 50% (fallthrough)
   7790         1: 5245:        a = NULL;
   7791         1: 5246:        uniformArrayNetDeserial(&a, data, ctx, /*packed=*/true);
   7792 call    0 returned 100%
   7793         1: 5247:        sArrayPushTiny(array, (smallt *) a);
   7794 call    0 returned 100%
   7795         -: 5248:      }
   7796         1: 5249:      break;
   7797         -: 5250:  }
   7798         -: 5251:}
   7799         -: 5252:
   7800 function deserialNetSerial called 87 returned 100% blocks executed 91%
   7801        87: 5253:internal smallJsont* deserialNetSerial(smallJsont *self, smallBytest *data) {
   7802         -: 5254:
   7803        87: 5255:  if (!data or !data->B or !data->B->count) {
   7804 branch  0 taken 100% (fallthrough)
   7805 branch  1 taken 0%
   7806 branch  2 taken 100% (fallthrough)
   7807 branch  3 taken 0%
   7808 branch  4 taken 1% (fallthrough)
   7809 branch  5 taken 99%
   7810         1: 5256:    ret self;
   7811         -: 5257:  }
   7812         -: 5258:
   7813        86: 5259:  smallt *o = netDeserial(data->B);
   7814 call    0 returned 100%
   7815         -: 5260:
   7816        86: 5261:  if (!o) {
   7817 branch  0 taken 0% (fallthrough)
   7818 branch  1 taken 100%
   7819     #####: 5262:    ret self;
   7820         -: 5263:  }
   7821         -: 5264:
   7822        86: 5265:  freeG(self);
   7823 call    0 returned 100%
   7824         -: 5266:
   7825        86: 5267:  setsoG(self, o);
   7826 call    0 returned 100%
   7827         -: 5268:
   7828        86: 5269:  ret self;
   7829         -: 5270:}
   7830         -: 5271:
   7831         -: 5272:// vim: set expandtab ts=2 sw=2:
   7832         -: 5273:
   7833 function checkLibsheepyVersionNetSerial called 0 returned 0% blocks executed 0%
   7834     #####: 5274:bool checkLibsheepyVersionNetSerial(const char *currentLibsheepyVersion) {
   7835     #####: 5275:  return eqG(currentLibsheepyVersion, LIBSHEEPY_VERSION);
   7836 call    0 never executed
   7837         -: 5276:}
   7838         -: 5277: