// // Created by xemon on 20.04.2022. // #include #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); } }