summaryrefslogtreecommitdiff
path: root/lib/val/ypc_add_int.c
blob: 68095fe9cd7bbbc201fa4cfcd34b16e89d2fec21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "../internal.h"
#include "../util/byteswap.h"

YPC_EXPORT int ypc_add_int(ypc_val *v, int64_t i) {
    if(v->size < v->len + 9 && ypc_val_resize(v, v->len+9) != 0)
        return -1;
    if(i >= INT8_MIN && i <= INT8_MAX) {
        v->buf[v->len++] = YPCT_INT8;
        v->buf[v->len++] = i;
    } else if(i >= INT16_MIN && i <= INT16_MAX) {
        v->buf[v->len++] = YPCT_INT16;
        uint16_t n = ypc__hn16(i);
        memcpy(v->buf+v->len, &n, 2);
        v->len += 2;
    } else if(i >= INT32_MIN && i <= INT32_MAX) {
        v->buf[v->len++] = YPCT_INT32;
        uint32_t n = ypc__hn32(i);
        memcpy(v->buf+v->len, &n, 4);
        v->len += 4;
    } else {
        v->buf[v->len++] = YPCT_INT64;
        uint64_t n = ypc__hn64(i);
        memcpy(v->buf+v->len, &n, 8);
        v->len += 8;
    }
    return 0;
}