void fmt_tofrom_array(unsigned long (*func)(char*,const char*,unsigned long), array* dest,array* src) { unsigned long needed; char* x; if (array_failed(dest) || array_failed(src)) { array_fail(dest); return; } needed=func(0,array_start(src),array_bytes(src)); if (array_allocate(dest,1,array_bytes(dest)+needed-1)) { x=((char*)array_start(dest))+array_bytes(dest)-needed; func(x,array_start(src),array_bytes(src)); } else array_fail(dest); }
void fmt_tofrom_array(size_t (*func)(char*,const char*,size_t), array* dest,array* src) { size_t needed; char* x; if (array_failed(dest) || array_failed(src)) { array_fail(dest); return; } needed=func(0,array_start(src),array_bytes(src)); if (array_bytes(dest)+needed>needed && array_allocate(dest,1,array_bytes(dest)+needed-1)) { x=((char*)array_start(dest))+array_bytes(dest)-needed; func(x,array_start(src),array_bytes(src)); } else array_fail(dest); }
void array_cate(array* to, const array* const from, int64 pos, int64 stop) { if(pos < 0 || stop < pos) { array_fail(to); return; } array_catb(to, from->p + pos, stop - pos); }
static void test_right_failed() { PREPARE_ARRAY(x, p, int, sizeof(int), 10); PREPARE_ARRAY(y, q, int, sizeof(int), 10); array_fail(&y); array_cat(&x, &y); assert(array_failed(&x)); }
int main() { array_t array = ARRAY_INIT(4); array_resize(&array, 3); if (array_bytes(&array) != 12) return 1; array_fail(&array); if (array_bytes(&array) != 0) return 2; return 0; }
void fmt_to_array(size_t (*func)(char*,const char*,size_t), array* a,const char* src,size_t len) { size_t needed=func(0,src,len); if (array_bytes(a)+needed>=needed && array_allocate(a,1,array_bytes(a)+needed-1)) { char* x=((char*)array_start(a))+array_bytes(a)-needed; func(x,src,len); } else array_fail(a); }
void array_catb(array* to,const char* from,uint64 len) { long l; if (!len) return; if (to->allocated<0) return; if (to->initialized+len<to->initialized) { fail: array_fail(to); return; } l=to->initialized; if (!array_allocate(to,1,to->initialized+len-1)) goto fail; byte_copy(to->p+l,to->initialized-l,from); }
static void test_failed() { PREPARE_ARRAY(x, p, int, sizeof(int), 10); PREPARE_ARRAY(y, q, int, sizeof(int), 10); array_fail(&x); array_cat(&x, &y); struct array z = y; assert(array_failed(&x)); assert(!array_failed(&y)); assert(y.p == z.p); assert(y.a == z.a); assert(y.len == z.len); }