dal-c library ← coverage

§ Coverage

src/sc_median.c

1/*2 * sc_median.c -- implementation. Blocks are tagged with the low-level3 * requirement they satisfy; see requirements/sc_median.md.4 *5 * The copy and sort loops are bounded by the compile-time array size6 * *and* the live sample count, so the scratch index is provably within7 * SC_MEDIAN_MAX_WINDOW regardless of the (validated) cfg->length.8 */9#include "sc_median.h"10118sc_status_t sc_median_config_valid(const sc_median_config_t *cfg)12{13    sc_status_t status;14158    if (cfg == NULL)condition outcomes covered 2/216    {171        status = SC_ERR_NULL;                            /* LLR-MEDIAN-3 */18    }197    else if ((cfg->length > SC_MEDIAN_MAX_WINDOW) ||condition outcomes covered 4/4206             ((cfg->length % 2u) == 0u))                 /* LLR-MEDIAN-4, LLR-MEDIAN-5 */21    {224        status = SC_ERR_PARAM;23    }24    else25    {263        status = SC_OK;                                  /* LLR-MEDIAN-6 */27    }28298    return status;30}313212sc_status_t sc_median_init(sc_median_state_t *state)33{34    sc_status_t status;353612    if (state == NULL)condition outcomes covered 2/237    {381        status = SC_ERR_NULL;                            /* LLR-MEDIAN-2 */39    }40    else41    {42        uint8_t i;43176        for (i = 0u; i < SC_MEDIAN_MAX_WINDOW; i++)      /* LLR-MEDIAN-1 */condition outcomes covered 2/244        {45165            state->history[i] = 0;46        }4711        state->count = 0u;4811        state->head  = 0u;4911        status = SC_OK;50    }515212    return status;53}545584int32_t sc_median_update(const sc_median_config_t *cfg,56                         sc_median_state_t *state,57                         int32_t sample)58{59    int32_t result;606184    if ((cfg == NULL) || (state == NULL))condition outcomes covered 4/462    {632        result = 0;                                      /* LLR-MEDIAN-7 */64    }65    else66    {67        int32_t sorted[SC_MEDIAN_MAX_WINDOW];68        uint8_t n;69        uint8_t i;707182        state->history[state->head] = sample;            /* LLR-MEDIAN-8 */7282        state->head = (uint8_t)((state->head + 1u) % cfg->length);737482        if (state->count < cfg->length)                  /* LLR-MEDIAN-9 */condition outcomes covered 2/275        {7656            state->count = (uint8_t)(state->count + 1u);77        }787982        n = state->count;80561        for (i = 0u; (i < SC_MEDIAN_MAX_WINDOW) && (i < n); i++)  /* LLR-MEDIAN-10: copy */condition outcomes covered 4/481        {82479            sorted[i] = state->history[i];83        }84479        for (i = 1u; (i < SC_MEDIAN_MAX_WINDOW) && (i < n); i++)  /* LLR-MEDIAN-10: insertion sort */condition outcomes covered 4/485        {86397            int32_t key = sorted[i];87397            uint8_t j   = i;88496            while ((j > 0u) && (sorted[j - 1u] > key))condition outcomes covered 4/489            {9099                sorted[j] = sorted[j - 1u];9199                j--;92            }93397            sorted[j] = key;94        }959682        result = (n < SC_MEDIAN_MAX_WINDOW)              /* LLR-MEDIAN-11 */9773               ? sorted[n / 2u]9882               : sorted[SC_MEDIAN_MAX_WINDOW / 2u];condition outcomes covered 2/299    }10010184    return result;102}