From ae231c66c1a839f8d9053251ec8c467ad9777037 Mon Sep 17 00:00:00 2001 From: Alexey Zholtikov Date: Sun, 11 Jan 2026 21:20:05 +0300 Subject: [PATCH] perf: updated error checks --- zh_vector.c | 166 ++++++++++++++++++---------------------------------- 1 file changed, 56 insertions(+), 110 deletions(-) diff --git a/zh_vector.c b/zh_vector.c index 0863374..2862782 100644 --- a/zh_vector.c +++ b/zh_vector.c @@ -2,187 +2,133 @@ static const char *TAG = "zh_vector"; +#define ZH_LOGI(msg, ...) ESP_LOGI(TAG, msg, ##__VA_ARGS__) +#define ZH_LOGE(msg, err, ...) ESP_LOGE(TAG, "[%s:%d:%s] " msg, __FILE__, __LINE__, esp_err_to_name(err), ##__VA_ARGS__) + +#define ZH_ERROR_CHECK(cond, err, cleanup, msg, ...) \ + if (!(cond)) \ + { \ + ZH_LOGE(msg, err, ##__VA_ARGS__); \ + cleanup; \ + return err; \ + } + static esp_err_t _resize(zh_vector_t *vector, uint16_t capacity); esp_err_t zh_vector_init(zh_vector_t *vector, uint16_t unit) { - ESP_LOGI(TAG, "Vector initialization begin."); - if (vector == NULL || unit == 0) - { - ESP_LOGE(TAG, "Vector initialization fail. Invalid argument."); - return ESP_ERR_INVALID_ARG; - } - if (vector->status == true) - { - ESP_LOGE(TAG, "Vector initialization fail. Vector already initialized."); - return ESP_ERR_INVALID_STATE; - } + ZH_LOGI("Vector initialization begin."); + ZH_ERROR_CHECK(vector != NULL && unit != 0, ESP_ERR_INVALID_ARG, NULL, "Vector initialization failed. Invalid argument."); + ZH_ERROR_CHECK(vector->status == false, ESP_ERR_INVALID_STATE, NULL, "Vector initialization failedd. Vector is already initialized."); vector->capacity = 0; vector->size = 0; vector->unit = unit; vector->status = true; - ESP_LOGI(TAG, "Vector initialization success."); + ZH_LOGI("Vector initialization success."); return ESP_OK; } esp_err_t zh_vector_free(zh_vector_t *vector) { - ESP_LOGI(TAG, "Vector deletion begin."); - if (vector == NULL) - { - ESP_LOGE(TAG, "Vector deletion fail. Invalid argument."); - return ESP_ERR_INVALID_ARG; - } - if (vector->status == false) - { - ESP_LOGE(TAG, "Vector deletion fail. Vector not initialized."); - return ESP_ERR_INVALID_STATE; - } + ZH_LOGI("Vector deletion begin."); + ZH_ERROR_CHECK(vector != NULL, ESP_ERR_INVALID_ARG, NULL, "Vector deletion failed. Invalid argument."); + ZH_ERROR_CHECK(vector->status == true, ESP_ERR_INVALID_STATE, NULL, "Vector deletion fail. Vector not initialized."); for (uint16_t i = 0; i < vector->size; ++i) { heap_caps_free(vector->items[i]); } vector->status = false; - ESP_LOGI(TAG, "Vector deletion success."); + ZH_LOGI("Vector deletion success."); return ESP_OK; } esp_err_t zh_vector_get_size(zh_vector_t *vector) { - ESP_LOGI(TAG, "Getting vector size begin."); - if (vector == NULL || vector->status == false) - { - ESP_LOGE(TAG, "Getting vector size fail. Invalid argument or vector not initialized."); - return ESP_FAIL; - } - ESP_LOGI(TAG, "Getting vector size success. Size: %d.", vector->size); + ZH_LOGI("Getting vector size begin."); + ZH_ERROR_CHECK(vector != NULL, ESP_ERR_INVALID_ARG, NULL, "Getting vector size fail. Invalid argument."); + ZH_ERROR_CHECK(vector->status == true, ESP_ERR_INVALID_STATE, NULL, "Getting vector size fail. Vector not initialized."); + ZH_LOGI("Getting vector size success."); return vector->size; } esp_err_t zh_vector_push_back(zh_vector_t *vector, void *item) { - ESP_LOGI(TAG, "Adding item to vector begin."); - if (vector == NULL || item == NULL) - { - ESP_LOGE(TAG, "Adding item to vector fail. Invalid argument."); - return ESP_ERR_INVALID_ARG; - } - if (vector->status == false) - { - ESP_LOGE(TAG, "Adding item to vector fail. Vector not initialized."); - return ESP_ERR_INVALID_STATE; - } + ZH_LOGI("Adding item to vector begin."); + ZH_ERROR_CHECK(vector != NULL && item != NULL, ESP_ERR_INVALID_ARG, NULL, "Adding item to vector fail. Invalid argument."); + ZH_ERROR_CHECK(vector->status == true, ESP_ERR_INVALID_STATE, NULL, "Adding item to vector fail. Vector not initialized."); if (vector->capacity == vector->size) { - if (_resize(vector, vector->capacity + 1) == ESP_ERR_NO_MEM) - { - ESP_LOGE(TAG, "Adding item to vector fail. Memory allocation fail or no free memory in the heap."); - return ESP_ERR_NO_MEM; - } + esp_err_t err = _resize(vector, vector->capacity + 1); + ZH_ERROR_CHECK(err == ESP_OK, err, NULL, "Adding item to vector fail. Memory allocation fail or no free memory in the heap."); } vector->items[vector->size] = heap_caps_calloc(1, vector->unit, MALLOC_CAP_8BIT); - if (vector->items[vector->size] == NULL) - { - ESP_LOGE(TAG, "Adding item to vector fail. Memory allocation fail or no free memory in the heap."); - return ESP_ERR_NO_MEM; - } + ZH_ERROR_CHECK(vector->items[vector->size] != NULL, ESP_ERR_NO_MEM, NULL, "Adding item to vector fail. Memory allocation fail or no free memory in the heap."); memcpy(vector->items[vector->size++], item, vector->unit); - ESP_LOGI(TAG, "Adding item to vector success."); + ZH_LOGI("Adding item to vector success."); return ESP_OK; } esp_err_t zh_vector_change_item(zh_vector_t *vector, uint16_t index, void *item) { - ESP_LOGI(TAG, "Changing item in vector begin."); - if (vector == NULL || item == NULL) - { - ESP_LOGE(TAG, "Changing item in vector fail. Invalid argument."); - return ESP_ERR_INVALID_ARG; - } - if (vector->status == false) - { - ESP_LOGE(TAG, "Changing item in vector fail. Vector not initialized."); - return ESP_ERR_INVALID_STATE; - } - if (index < vector->size) - { - memcpy(vector->items[index], item, vector->unit); - ESP_LOGI(TAG, "Changing item in vector success."); - return ESP_OK; - } - ESP_LOGE(TAG, "Changing item in vector fail. Index does not exist."); - return ESP_FAIL; + ZH_LOGI("Changing item in vector begin."); + ZH_ERROR_CHECK(vector != NULL && item != NULL, ESP_ERR_INVALID_ARG, NULL, "Changing item in vector fail. Invalid argument."); + ZH_ERROR_CHECK(vector->status == true, ESP_ERR_INVALID_STATE, NULL, "Changing item in vector fail. Vector not initialized."); + ZH_ERROR_CHECK(index < vector->size, ESP_FAIL, NULL, "Changing item in vector fail. Index does not exist."); + memcpy(vector->items[index], item, vector->unit); + ZH_LOGI("Changing item in vector success."); + return ESP_OK; } void *zh_vector_get_item(zh_vector_t *vector, uint16_t index) { - ESP_LOGI(TAG, "Getting item from vector begin."); + ZH_LOGI("Getting item from vector begin."); if (vector == NULL) { - ESP_LOGE(TAG, "Getting item from vector fail. Invalid argument."); + ZH_LOGE("Getting item from vector fail. Invalid argument.", ESP_ERR_INVALID_ARG); return NULL; } if (vector->status == false) { - ESP_LOGE(TAG, "Getting item from vector fail. Vector not initialized."); + ZH_LOGE("Getting item from vector fail. Vector not initialized.", ESP_ERR_INVALID_STATE); return NULL; } if (index < vector->size) { - void *item = vector->items[index]; - ESP_LOGI(TAG, "Getting item from vector success."); - return item; + ZH_LOGI("Getting item from vector success."); + return vector->items[index]; } else { - ESP_LOGE(TAG, "Getting item from vector fail. Index does not exist."); + ZH_LOGE("Getting item from vector fail. Index does not exist.", ESP_FAIL); return NULL; } } esp_err_t zh_vector_delete_item(zh_vector_t *vector, uint16_t index) { - ESP_LOGI(TAG, "Deleting item in vector begin."); - if (vector == NULL) + ZH_LOGI("Deleting item in vector begin."); + ZH_ERROR_CHECK(vector != NULL, ESP_ERR_INVALID_ARG, NULL, "Deleting item in vector fail. Invalid argument."); + ZH_ERROR_CHECK(vector->status == true, ESP_ERR_INVALID_STATE, NULL, "Deleting item in vector fail. Vector not initialized."); + ZH_ERROR_CHECK(index < vector->size, ESP_FAIL, NULL, "Deleting item in vector fail. Index does not exist."); + heap_caps_free(vector->items[index]); + for (uint8_t i = index; i < (vector->size - 1); ++i) { - ESP_LOGE(TAG, "Deleting item in vector fail. Invalid argument."); - return ESP_ERR_INVALID_ARG; + vector->items[i] = vector->items[i + 1]; + vector->items[i + 1] = NULL; } - if (vector->status == false) - { - ESP_LOGE(TAG, "Deleting item in vector fail. Vector not initialized."); - return ESP_ERR_INVALID_STATE; - } - if (index < vector->size) - { - heap_caps_free(vector->items[index]); - for (uint8_t i = index; i < (vector->size - 1); ++i) - { - vector->items[i] = vector->items[i + 1]; - vector->items[i + 1] = NULL; - } - --vector->size; - _resize(vector, vector->capacity - 1); - ESP_LOGI(TAG, "Deleting item in vector success."); - return ESP_OK; - } - ESP_LOGE(TAG, "Deleting item in vector fail. Index does not exist."); - return ESP_FAIL; + --vector->size; + _resize(vector, vector->capacity - 1); + ZH_LOGI("Deleting item in vector success."); + return ESP_OK; } static esp_err_t _resize(zh_vector_t *vector, uint16_t capacity) { - ESP_LOGI(TAG, "Vector resize begin."); if (capacity != 0) { vector->items = heap_caps_realloc(vector->items, sizeof(void *) * capacity, MALLOC_CAP_8BIT); - if (vector->items == NULL) - { - ESP_LOGE(TAG, "Vector resize fail. Memory allocation fail or no free memory in the heap."); - return ESP_ERR_NO_MEM; - } + ZH_ERROR_CHECK(vector->items != NULL, ESP_ERR_NO_MEM, NULL, "Memory allocation fail or no free memory in the heap."); } vector->capacity = capacity; - ESP_LOGI(TAG, "Vector resize success. New capacity: %d.", vector->capacity); return ESP_OK; } \ No newline at end of file