127 lines
2.5 KiB
C
127 lines
2.5 KiB
C
//
|
|
// Created by xemon on 20.04.2022.
|
|
//
|
|
#include <string.h>
|
|
#include "XfcArray.h"
|
|
|
|
void XfcArrayInit(tXfcArray *array, uint8_t *memAlloc, uint16_t limit) {
|
|
array->limit = limit;
|
|
array->data = memAlloc;
|
|
array->end = 0;
|
|
array->begin = 0;
|
|
}
|
|
|
|
void XfcArrayClear(tXfcArray *array) {
|
|
array->end = 0;
|
|
array->begin = 0;
|
|
}
|
|
|
|
bool XfcArrayNotFull(tXfcArray *array) {
|
|
return array->end < array->limit;
|
|
}
|
|
|
|
|
|
uint16_t XfcArrayGetDataSize(tXfcArray *array) {
|
|
if (array->begin >= array->end) {
|
|
return 0;
|
|
}
|
|
|
|
return array->end - array->begin;
|
|
}
|
|
|
|
uint8_t *XfcGetTail(tXfcArray *array) {
|
|
return array->data + array->end;
|
|
}
|
|
|
|
uint16_t XfcArrayGetSpace(tXfcArray *array) {
|
|
if (array->limit <= array->end) {
|
|
return 0;
|
|
}
|
|
|
|
return array->limit - array->end;
|
|
}
|
|
|
|
uint16_t XfcArrayGetAvailable(tXfcArray *array) {
|
|
if (array->limit <= array->end) {
|
|
return 0;
|
|
}
|
|
|
|
return array->limit - array->end;
|
|
}
|
|
|
|
|
|
bool XfcArrayAddByte(tXfcArray *array, uint8_t value) {
|
|
if (XfcArrayNotFull(array)) {
|
|
array->data[array->end] = value;
|
|
++array->end;
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
uint16_t XfcArrayAddLength(tXfcArray *array, uint16_t length) {
|
|
|
|
uint16_t space = XfcArrayGetSpace(array);
|
|
|
|
uint16_t toAdd = space > length ? length : space;
|
|
|
|
array->end += toAdd;
|
|
|
|
return toAdd;
|
|
}
|
|
|
|
uint16_t XfcArrayAddBytes(tXfcArray *array, uint8_t *bytes, uint16_t length) {
|
|
|
|
uint16_t space = XfcArrayGetSpace(array);
|
|
|
|
uint16_t toAdd = space > length ? length : space;
|
|
|
|
memcpy(array->data + array->end, bytes, toAdd);
|
|
|
|
array->end += toAdd;
|
|
|
|
return toAdd;
|
|
}
|
|
|
|
void XfcArraySpaceInv(tXfcArray *array) {
|
|
if (array->begin == array->end) {
|
|
array->begin = array->end = 0;
|
|
}
|
|
}
|
|
|
|
//
|
|
//void XfcArraySpaceInvForce(XfcArray *array) {
|
|
// if (array->begin == array->end) {
|
|
// array->begin = array->end = 0;
|
|
// }
|
|
//}
|
|
|
|
uint16_t XfcArrayGetBytesFront(tXfcArray *array, uint8_t *bytes, uint16_t length) {
|
|
|
|
uint16_t available = XfcArrayGetDataSize(array);
|
|
|
|
uint16_t toGet = available > length ? length : available;
|
|
|
|
memcpy(bytes, array->data + array->begin, toGet);
|
|
|
|
array->begin += toGet;
|
|
|
|
XfcArraySpaceInv(array);
|
|
|
|
return toGet;
|
|
}
|
|
|
|
|
|
void XfcArrayRemoveBytesFront(tXfcArray *env, uint16_t count) {
|
|
uint16_t left = XfcArrayGetDataSize(env) - count;
|
|
|
|
if (left) {
|
|
memmove(env->data, env->data + env->begin + count, left);
|
|
env->begin = 0;
|
|
env->end = left;
|
|
} else {
|
|
XfcArrayClear(env);
|
|
}
|
|
}
|