88 lines
1.5 KiB
C
88 lines
1.5 KiB
C
#include <stdlib.h> /* 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 *(p->v)) > 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;
|
|
}
|
|
|
|
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);
|
|
}
|