§ Coverage
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}