Files
banjo-kazooie/src/core2/vla.c
2022-08-03 15:20:56 -05:00

108 lines
2.9 KiB
C

#include <ultra64.h>
#include "functions.h"
#include "variables.h"
/* VARIABLE LENGTH ARRAY */
void vector_clear(VLA *this){
this->end = this->begin;
}
void *vector_getBegin(VLA *this){
return this->begin;
}
void *vector_at(VLA *this, u32 n){
return (void *)((u32) this->begin + n*this->elem_size);
}
s32 vector_getIndex(VLA *this, void *elemPtr){
return ((s32)elemPtr - (s32)this->begin)/(s32)this->elem_size;
}
s32 vector_size(VLA *this){
return ((s32)this->end - (s32)this->begin)/this->elem_size;
}
void *vector_getEnd(VLA *this){
return this->end;
}
void *vector_pushBackNew(VLA **thisPtr){
void *retVal;
VLA* this;
s32 size;
s32 mem_size;
this = *thisPtr;
if(this->end == this->mem_end){
size = ((s32)this->end - (s32)this->begin)/this->elem_size;
mem_size = size + 5;
this = realloc(this, mem_size*this->elem_size + sizeof(VLA));
this->begin = &this->data;
this->end = (u8 *)this->begin + size* this->elem_size;
this->mem_end = (u8 *)this->begin + mem_size* this->elem_size;
*thisPtr = this;
}
retVal = this->end;
this->end = (void *)((s32)this->end + this->elem_size);
return retVal;
}
void *vector_insertNew(VLA **thisPtr, s32 indx){
VLA *this;
s32 i;
vector_pushBackNew(thisPtr);
this = *thisPtr;
i = ((s32)this->end - (s32)this->begin)/this->elem_size;
while(indx < --i){
memcpy((void *)((s32)this->begin + (i)*this->elem_size), (void *)((s32)this->begin + (i -1)*this->elem_size), this->elem_size);
}
return (void *)((s32)this->begin + indx*this->elem_size);
}
void vector_free(VLA *this){
free(this);
}
VLA *vector_new(u32 elemSize, u32 cnt){
VLA *this = malloc(cnt*elemSize + sizeof(VLA));
this->elem_size = elemSize;
this->begin = &this->data;
this->end = &this->data;
this->mem_end = (u8*)this->end + cnt*elemSize;
return this;
}
void vector_remove(VLA *this, u32 indx){
u32 elemOffset = (u32)this->begin + indx * this->elem_size;\
u32 nextOffset = (u32)this->begin + (indx + 1) * this->elem_size;\
u32 size = (u32)this->end - (u32)this->begin;
memcpy((void *)elemOffset, (void *)nextOffset, size - (indx + 1) * this->elem_size);
this->end = (void *)((u32)this->end - this->elem_size);
}
void vector_popBack_n(VLA *this, u32 n){
this->end = (void *)((u32)this->end - n * this->elem_size);
}
void vector_assign(VLA *this, s32 indx, void* value){
memcpy((void*)((s32)this->begin + indx * this->elem_size), value, this->elem_size);
}
VLA * vector_defrag(VLA *this){
s32 oldSize;
s32 oldMemSize;
oldSize = (s32) this->end - (s32)this->begin;
oldMemSize = (s32) this->mem_end - (s32)this->begin;
this = (VLA *)defrag(this);
this->begin = &this->data;
this->end = (void *)((s32)this->begin + oldSize);
this->mem_end = (void *)((s32)this->begin + oldMemSize);
return this;
}