1
0
src/libfatptr/libfatptr.c
2024-03-20 18:18:53 -06:00

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);
}