105 lines
1.8 KiB
C
105 lines
1.8 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 (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);
|
|
}
|