XfcTransportProtocol/Src/XfcArray.c

127 lines
2.5 KiB
C

//
// Created by CFIF 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);
}
}