LCOV - code coverage report
Current view: top level - src - rs.c (source / functions) Coverage Total Hit
Test: poporon Coverage Report Lines: 97.1 % 35 34
Test Date: 2025-04-08 01:35:23 Functions: 100.0 % 2 2
Legend: Lines: hit not hit

            Line data    Source code
       1              : /*
       2              :  * libpoporon - rs.c
       3              :  * 
       4              :  * Copyright (c) 2025 Go Kudo
       5              :  *
       6              :  * This library is licensed under the BSD 3-Clause License.
       7              :  * For license details, please refer to the LICENSE file.
       8              :  *
       9              :  * SPDX-FileCopyrightText: Go Kudo <zeriyoshi@gmail.com>
      10              :  * SPDX-License-Identifier: BSD-3-Clause
      11              :  */
      12              : 
      13              : #include "poporon_internal.h"
      14              : 
      15           13 : void poporon_rs_destroy(poporon_rs_t *rs)
      16              : {
      17           13 :     if (!rs) {
      18            1 :         return;
      19              :     }
      20              : 
      21           12 :     if (rs->gf) {
      22           12 :         poporon_gf_destroy(rs->gf);
      23              :     }
      24              : 
      25           12 :     if (rs->generator_polynomial) {
      26           12 :         pfree(rs->generator_polynomial);
      27              :     }
      28              : 
      29           12 :     pfree(rs);
      30              : }
      31              : 
      32           14 : poporon_rs_t *poporon_rs_create(uint8_t symbol_size, uint16_t generator_polynomial, uint16_t first_consective_root, uint16_t primitive_element, uint8_t num_roots)
      33              : {
      34              :     poporon_rs_t *rs;
      35              :     poporon_gf_t *gf;
      36              :     uint16_t i, j, generator_root;
      37              : 
      38           14 :     gf = poporon_gf_create(symbol_size, generator_polynomial);
      39           14 :     if (!gf) {
      40            2 :         return NULL;
      41              :     }
      42              : 
      43           12 :     rs = (poporon_rs_t *)pmalloc(sizeof(poporon_rs_t));
      44           12 :     if (!rs) {
      45              :         /* LCOV_EXCL_START */
      46              :         poporon_gf_destroy(gf);
      47              :         return NULL;
      48              :         /* LCOV_EXCL_STOP */
      49              :     }
      50              : 
      51           12 :     rs->gf = gf;
      52           12 :     rs->first_consective_root = first_consective_root;
      53           12 :     rs->primitive_element = primitive_element;
      54           12 :     rs->num_roots = num_roots;
      55           12 :     rs->generator_polynomial = (uint16_t *)pmalloc((num_roots + 1) * sizeof(uint16_t));
      56           12 :     if (!rs->generator_polynomial) {
      57              :         /* LCOV_EXCL_START */
      58              :         poporon_rs_destroy(rs);
      59              :         return NULL;
      60              :         /* LCOV_EXCL_STOP */
      61              :     }
      62              : 
      63           12 :     rs->generator_polynomial[0] = 1;
      64           12 :     for (i = 0, generator_root = first_consective_root * primitive_element; 
      65          256 :          i < num_roots; 
      66          244 :          i++, generator_root += primitive_element
      67              :         ) {
      68          244 :         rs->generator_polynomial[i + 1] = 1;
      69              : 
      70         3266 :         for (j = i; j > 0; j--) {
      71         3022 :             if (rs->generator_polynomial[j] != 0) {
      72         6044 :                 rs->generator_polynomial[j] = rs->generator_polynomial[j - 1] ^
      73         3022 :                     gf->log2exp[gf_mod(gf, gf->exp2log[rs->generator_polynomial[j]] + generator_root)];
      74              :             } else {
      75            0 :                 rs->generator_polynomial[j] = rs->generator_polynomial[j - 1];
      76              :             }
      77              :         }
      78              : 
      79          244 :         rs->generator_polynomial[0] = 
      80          244 :             gf->log2exp[gf_mod(gf, gf->exp2log[rs->generator_polynomial[0]] + generator_root)];
      81              :     }
      82              : 
      83          268 :     for (i = 0; i <= num_roots; i++) {
      84          256 :         rs->generator_polynomial[i] = gf->exp2log[rs->generator_polynomial[i]];
      85              :     }
      86              : 
      87           12 :     return rs;
      88              : }
        

Generated by: LCOV version 2.0-1