Added merge_by_header

This commit is contained in:
2026-08-21 03:31:01 -05:00
parent a3e9e7c3d0
commit 4afca8e8c5
4 changed files with 268 additions and 1 deletions
+57 -1
View File
@@ -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++) {