#include /* free(3), malloc(3), realloc(3), size_t */ #include "libfatptr.h" struct FatPtr * FatPtr_append(struct FatPtr *p, FatPtr_scalar_t c){ FatPtr_vector_t t; if(p == NULL || (p->s + (sizeof (FatPtr_scalar_t)) > p->a && FatPtr_grow(p, sizeof (FatPtr_scalar_t)) == NULL)) return NULL; (p->v)[(p->s)++] = c; return p; } struct FatPtr * FatPtr_construct(struct FatPtr *p){ return FatPtr_grow(FatPtr_initialize(p), sizeof (FatPtr_scalar_t)); } struct FatPtr * FatPtr_destruct(struct FatPtr *p){ if(p != NULL){ free(p->v); FatPtr_initialize(p); } return NULL; } struct FatPtr * FatPtr_grow(struct FatPtr *p, size_t units){ FatPtr_vector_t t; if(p == NULL || (t = realloc(p->v, p->a + units)) == NULL) return NULL; p->a += units; p->v = t; return p; } struct FatPtr * FatPtr_initialize(struct FatPtr *p){ if(p != NULL){ p->a = 0; p->s = 0; p->v = NULL; } return p; } FatPtr_vector_t FatPtr_index(struct FatPtr *p, size_t index){ return p == NULL ? NULL : &p->v[index]; } struct FatPtr * FatPtr_prepend(struct FatPtr *p, FatPtr_vector_t s, size_t units){ size_t i; if(FatPtr_shiftleft(p, units) != NULL) for(i = 0; units --> 0; p->v[i] = *s++); return p; } struct FatPtr * FatPtr_shiftleft(struct FatPtr *p, size_t units){ size_t i; if(p != NULL) for(i = 0; i < p->s; ++i) (p->v)[i] = (p->v)[i + units]; return p; } struct FatPtr * FatPtr_shiftright(struct FatPtr *p, size_t units){ size_t i; if(FatPtr_grow(p, units * (sizeof (FatPtr_scalar_t))) == NULL) return NULL; for(i = 0; i < p->s; ++i) (p->v)[i + units] = (p->v)[i]; p->s += units; return p; } struct FatPtr * FatPtr_trimend(struct FatPtr *p, size_t units){ if(p != NULL) p->s -= units; return p; } struct FatPtr * FatPtr_trimfront(struct FatPtr *p, size_t units){ return FatPtr_trimend(FatPtr_shiftleft(p, units), units); }