Added merge_by_header
This commit is contained in:
+57
-1
@@ -190,12 +190,30 @@ int compar(const void *a, const void *b, void *size_v) {
|
||||
#if defined(__BYTE_ORDER__)&&(__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
||||
return memcmp(a, b, size);
|
||||
#else
|
||||
const signed char *aa = a;
|
||||
/*const signed char *aa = a;
|
||||
const signed char *bb = b;
|
||||
for(size_t i = 0; i < size; ++i) {
|
||||
size_t s = size - i - 1;
|
||||
if(aa[s] != bb[s]) return aa[s] - bb[s];
|
||||
}
|
||||
return 0;*/
|
||||
size_t rem = size % sizeof(int);
|
||||
if(rem) {
|
||||
size -= rem;
|
||||
const char *c = a;
|
||||
const char *d = b;
|
||||
for(size_t i = 1; i <= rem; ++i) {
|
||||
char j = c[size + rem - i] - d[size + rem - i];
|
||||
if(j != 0) return j;
|
||||
}
|
||||
}
|
||||
const int *ia = a;
|
||||
const int *ib = b;
|
||||
size /= sizeof(int);
|
||||
for(size_t i = 1; i <= size; ++i) {
|
||||
int j = ia[size - i] - ib[size - i];
|
||||
if(j != 0) return j;
|
||||
}
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
@@ -256,6 +274,44 @@ KekeArray *keke_array_merge(KekeArray *a, KekeArray *b) {
|
||||
return c;
|
||||
}
|
||||
|
||||
KekeArray *keke_array_merge_by_header(KekeArray *a, KekeArray *b, size_t header_size) {
|
||||
if(a->len == 0) {
|
||||
KekeArray *r = keke_array_clone(b);
|
||||
keke_array_set_len(b, 0);
|
||||
return r;
|
||||
}
|
||||
if(b->len == 0) {
|
||||
KekeArray *r = keke_array_clone(a);
|
||||
keke_array_set_len(a, 0);
|
||||
return r;
|
||||
}
|
||||
keke_array_reverse(a);
|
||||
keke_array_reverse(b);
|
||||
if(a->type_size != b->type_size) return NULL;
|
||||
KekeArray *c = keke_array_alloc(a->len + b->len, a->type_size);
|
||||
keke_array_set_len(c, 0);
|
||||
void *s = malloc(a->type_size);
|
||||
while(!!(a->len) && !!(b->len)) {
|
||||
if(compar(ARRAY_GET(a, a->len - 1), ARRAY_GET(b, b->len - 1), &header_size) <= 0) {
|
||||
keke_array_pop(a, s) ;
|
||||
keke_array_push(c, s);
|
||||
} else {
|
||||
keke_array_pop(b, s);
|
||||
keke_array_push(c, s);
|
||||
}
|
||||
}
|
||||
while(a->len) {
|
||||
keke_array_pop(a, s);
|
||||
keke_array_push(c, s);
|
||||
}
|
||||
while(b->len) {
|
||||
keke_array_pop(b, s);
|
||||
keke_array_push(c, s);
|
||||
}
|
||||
free(s);
|
||||
return c;
|
||||
}
|
||||
|
||||
KekeArray *keke_array_filter(KekeArray *array, Test_func test) {
|
||||
KekeArray *ret = keke_array_alloc(0, array->type_size);
|
||||
for(size_t i = 0; i < array->len; i++) {
|
||||
|
||||
Reference in New Issue
Block a user