Pass capn_ptr by value, better handling of tags
This commit is contained in:
parent
3a235fe8c6
commit
b8da11676a
10 changed files with 1236 additions and 438 deletions
|
|
@ -4,21 +4,21 @@
|
|||
#define UINT_T CAT(CAT(uint, SZ), _t)
|
||||
#define FLIP CAT(capn_flip, SZ)
|
||||
|
||||
UINT_T CAT(capn_get,SZ) (const struct capn_ptr *p, int off) {
|
||||
UINT_T CAT(capn_get,SZ) (capn_ptr p, int off) {
|
||||
char *d;
|
||||
if (off >= p->size) {
|
||||
if (off >= p.size) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
switch (p->type) {
|
||||
switch (p.type) {
|
||||
case CAPN_LIST:
|
||||
if (p->datasz < SZ/8)
|
||||
if (p.datasz < SZ/8)
|
||||
return 0;
|
||||
d = p->data + off * (p->datasz + p->ptrsz);
|
||||
d = p.data + off * (p.datasz + p.ptrsz);
|
||||
return FLIP(*(UINT_T*)d);
|
||||
|
||||
case CAPN_PTR_LIST:
|
||||
d = struct_ptr(p->seg, p->data + 8*off, SZ/8);
|
||||
d = struct_ptr(p.seg, p.data + 8*off, SZ/8);
|
||||
if (d) {
|
||||
return FLIP(*(UINT_T*)d);
|
||||
} else {
|
||||
|
|
@ -30,31 +30,31 @@ UINT_T CAT(capn_get,SZ) (const struct capn_ptr *p, int off) {
|
|||
}
|
||||
}
|
||||
|
||||
int CAT(capn_getv,SZ) (const struct capn_ptr *p, int off, UINT_T *to, int sz) {
|
||||
int CAT(capn_getv,SZ) (capn_ptr p, int off, UINT_T *to, int sz) {
|
||||
int i;
|
||||
|
||||
if (off + sz > p->size) {
|
||||
sz = p->size - off;
|
||||
if (off + sz > p.size) {
|
||||
sz = p.size - off;
|
||||
}
|
||||
|
||||
switch (p->type) {
|
||||
switch (p.type) {
|
||||
case CAPN_LIST:
|
||||
if (p->datasz == SZ/8 && !p->ptrsz && (SZ == 8 || CAPN_LITTLE)) {
|
||||
memcpy(to, p->data + off, sz * (SZ/8));
|
||||
if (p.datasz == SZ/8 && !p.ptrsz && (SZ == 8 || CAPN_LITTLE)) {
|
||||
memcpy(to, p.data + off, sz * (SZ/8));
|
||||
return sz;
|
||||
} else if (p->datasz < SZ/8) {
|
||||
} else if (p.datasz < SZ/8) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < sz; i++) {
|
||||
char *d = p->data + (i + off) * (p->datasz + p->ptrsz);
|
||||
char *d = p.data + (i + off) * (p.datasz + p.ptrsz);
|
||||
to[i] = FLIP(*(UINT_T*)d);
|
||||
}
|
||||
return sz;
|
||||
|
||||
case CAPN_PTR_LIST:
|
||||
for (i = 0; i < sz; i++) {
|
||||
char *d = struct_ptr(p->seg, p->data + 8*(i+off), SZ/8);
|
||||
char *d = struct_ptr(p.seg, p.data + 8*(i+off), SZ/8);
|
||||
if (d) {
|
||||
to[i] = FLIP(*(UINT_T*)d);
|
||||
} else {
|
||||
|
|
@ -68,22 +68,22 @@ int CAT(capn_getv,SZ) (const struct capn_ptr *p, int off, UINT_T *to, int sz) {
|
|||
}
|
||||
}
|
||||
|
||||
int CAT(capn_set,SZ) (struct capn_ptr *p, int off, UINT_T v) {
|
||||
int CAT(capn_set,SZ) (capn_ptr p, int off, UINT_T v) {
|
||||
char *d;
|
||||
if (off >= p->size) {
|
||||
if (off >= p.size) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (p->type) {
|
||||
switch (p.type) {
|
||||
case CAPN_LIST:
|
||||
if (p->datasz < SZ/8)
|
||||
if (p.datasz < SZ/8)
|
||||
return -1;
|
||||
d = p->data + off * (p->datasz + p->ptrsz);
|
||||
d = p.data + off * (p.datasz + p.ptrsz);
|
||||
*(UINT_T*) d = FLIP(v);
|
||||
return 0;
|
||||
|
||||
case CAPN_PTR_LIST:
|
||||
d = struct_ptr(p->seg, p->data + 8*off, SZ/8);
|
||||
d = struct_ptr(p.seg, p.data + 8*off, SZ/8);
|
||||
if (!d) {
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -95,31 +95,31 @@ int CAT(capn_set,SZ) (struct capn_ptr *p, int off, UINT_T v) {
|
|||
}
|
||||
}
|
||||
|
||||
int CAT(capn_setv,SZ) (struct capn_ptr *p, int off, const UINT_T *from, int sz) {
|
||||
int CAT(capn_setv,SZ) (capn_ptr p, int off, const UINT_T *from, int sz) {
|
||||
int i;
|
||||
|
||||
if (off + sz > p->size) {
|
||||
sz = p->size - off;
|
||||
if (off + sz > p.size) {
|
||||
sz = p.size - off;
|
||||
}
|
||||
|
||||
switch (p->type) {
|
||||
switch (p.type) {
|
||||
case CAPN_LIST:
|
||||
if (p->datasz == SZ/8 && !p->ptrsz && (SZ == 8 || CAPN_LITTLE)) {
|
||||
memcpy(p->data + off, from, sz * (SZ/8));
|
||||
if (p.datasz == SZ/8 && !p.ptrsz && (SZ == 8 || CAPN_LITTLE)) {
|
||||
memcpy(p.data + off, from, sz * (SZ/8));
|
||||
return sz;
|
||||
} else if (p->datasz < SZ/8) {
|
||||
} else if (p.datasz < SZ/8) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (i = 0; i < sz; i++) {
|
||||
char *d = p->data + (i + off) * (p->datasz + p->ptrsz);
|
||||
char *d = p.data + (i + off) * (p.datasz + p.ptrsz);
|
||||
*(UINT_T*) d = FLIP(from[i]);
|
||||
}
|
||||
return sz;
|
||||
|
||||
case CAPN_PTR_LIST:
|
||||
for (i = 0; i < sz; i++) {
|
||||
char *d = struct_ptr(p->seg, p->data + 8*(i+off), SZ/8);
|
||||
char *d = struct_ptr(p.seg, p.data + 8*(i+off), SZ/8);
|
||||
if (d) {
|
||||
*(UINT_T*) d = FLIP(from[i]);
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue